Skip to content

Instantly share code, notes, and snippets.

@charlesastaylor
Last active September 19, 2024 22:32
Show Gist options
  • Save charlesastaylor/18c7c8005fed9d0af1a3ee2b24fcd724 to your computer and use it in GitHub Desktop.
Save charlesastaylor/18c7c8005fed9d0af1a3ee2b24fcd724 to your computer and use it in GitHub Desktop.
8086 assembly snake game!
; -------------------------------------------------------------------
; Sna86.
; An 8086 simulator snake!
; -------------------------------------------------------------------
;
; Assembly program intended to run in an 8086 simulator with functionaliy equal* to one made for homeworks
; up to Part 1 Episode 10 of the Peformance-Aware Programming Series (https://www.computerenhance.com/)
; by Casey Muratori. Demo - https://youtu.be/s_S4-QHeFMc.
;
; * mov, add, sub, cmp, je and jne was the target instructions. However I also added loop for convenience,
; and jmp because conditional jumps have limited range! They are both simple enough to implment if you
; already have the above.
; * int is also needed for a couple of things:
; - int 0 is used to signal the size of the frame buffer to the simulator. Width is put in ax, height
; into bx.
; - int 15h is used for the program to signal it has finished a frame to allow the simulator to draw the
; frame buffer to the screen
;
; Input is handled via the input "register" at memory address 0xFFFE, with each bit corresponding to an input
; button. Starting from the low bit the buttons are: Up, Down, Left, Right, Menu. Ie the low bit is used for
; the up button, the 5th bit is used for the menu button, and the top 3 bits are unused.
;
; Compiled with `nasm sna86.asm`. Or `nasm sna86.asm -DUSE_TITLE_SCREEN` to use the fancy title screen!
;
; Memory Layout:
; [0x0000] Program
; Code
; Data
; [0x0000 + program_size] FrameBuffer
; u8 frame_buffer[frame_buffer_num_bytes]
; [¯\_(ツ)_/¯] Snake
; u16 length
; u16 head
; // x, y coordinates stores as u16s. ie XXYYXXYYXXYYXX
; // These could be u8s. But simulator doesnt handle lots of u8 things. so u16 easier for now
; u16 *parts
;
; NOTE(Charles): <label> resb/resw <num_bytes/words>, can be used to reserve space in binary! eg:
; scratch resb 256 ; create 256 byte scratch space.
;
; @TODO
; - Display the score!
; - Seed the rng with some interrupt to get start value
; - Speed up menu transition with by adding interrupt to specifiy frame pointer. Then flip screens.
; - sometimes on eating an apple the new one can spawn in such a way that to gets eaten right away
; and you get stuck with no apples?
; NOTE(Charles): SI, DI and the segment registers are not currently used, so my simulator is configured to
; use these for deubgging. It will print the contents of SI, DI each frame. And, if any segment registers
; are set, it will print out the word at that address in memory.
bits 16
%define MEMORY_SCRATCH 0xFF00
%define REGISTER_INPUT 0xFFFE
%define INPUT_UP 0x01
%define INPUT_DOWN 0x02
%define INPUT_LEFT 0x04
%define INPUT_RIGHT 0x08
%define INPUT_MENU 0x10
%define GAME_STATE_MENU 0
%define GAME_STATE_PLAY 1
%define SCREEN_SIZE 64
; @TODO Setting this to 100 giffs big bug! Must be overwriting something somewhere. Pls fix.
%define screen_color 30
%define SCREEN_RGB screen_color, screen_color, screen_color
; Result of the input register mapping. This is probably bad!
%define Direction_up 1
%define Direction_down 2
%define Direction_left 4
%define Direction_right 8
%define SNAKE_START_LENGTH 25
%define SNAKE_R 100
%define SNAKE_G 220
%define SNAKE_B 100
%define SNAKE_RGB SNAKE_R, SNAKE_G, SNAKE_B
%define APPLE_R 250
%define APPLE_G 100
%define APPLE_B 100
%define APPLE_RGB APPLE_R, APPLE_G, APPLE_B
; Simulator maxes out at some number of instructions per frame. Not measured number but at 32x32
; we can just about get 60fps. Above that not so much. Did some basic measurements and looks like
; it's the instruction decode that is the slow part. Thanks Casey ;). Joke obv.
; For snake, don't actually need to draw screen everytime, just draw pixels that need to update!
%define DRAW_SCREEN_EVERY_FRAME 0
; -------------------------------------------------------------------
; Macros!
; -------------------------------------------------------------------
; @TODO implement call, ret (probably requires push, pop too) to use actual functions! Can only do macros
; for now.
; NOTE(Charles): Macros seemed like a great idea at first. But holy moly they make keeping track of
; which registers are used hard! (Or I guess only really cos I went and nested macros :roll:)
; Don't have mul yet, just use adds!
; uses cx register as counter (loop instruction), result will be in ax.
; Only works for memory or immediate parameters atm!
; This loops b times so it is consderiably quicker if you put the smaller number in b!
; @TODO Implement mul instruction in simulator!
; ax multiply(a, b)
%macro multiply 2
mov ax, 0
mov cx, 0 ; mov then add so can use zero flag
add cx, %2
jz %%done
%%who_needs_mul:
add ax, %1
loop %%who_needs_mul
%%done:
%endmacro
%macro divide 2
; @TODO can do a similar thing for divsion using subtraction.
; if a is divisible by b, then loop doing a - b - b - b - b until you get 0. Number of loops equal answer!
%endmacro
; This is a no go for a few reasons atm:
; 1) without mul the multiply with large numbers is _very_ slow!
; 2) even if I had mul modding the result so its in a useful range seems hard (impossible?) without div and,
; more cruicially jl, jg etc
; Sticking with table of random numbers with optional seed from host.
%define LCG_INITIAL_SEED 1234
%macro lcg_generate_random_number 0
; Generate a pseudo-random number using a linear congruential generator (LCG)
; Algorithm: Xn+1 = (a * Xn + c) mod m
%define LCG_A 11969
%define LCG_C 52429
%define LCG_M 65536 ; 2^16
multiply LCG_A, [lcg_seed] ; Welp, this is gonna be slow as shit...
add ax, LCG_C
mov [lcg_seed], ax ; Store new seed
%endmacro
%define RNG_NUM 1000
; Returns in ax
%macro generate_random_number 0
mov bp, [random_number_index]
add bp, bp ; have to multiply the index by two because the numbers are words!
add bp, rng_4096_1000
mov ax, [bp]
add [random_number_index], word 1
cmp [random_number_index], word RNG_NUM
jne %%end
mov [random_number_index], word 0
%%end:
%endmacro
; Fill a pixel with color.
; void draw_pixel(x, y, r=255, g=255, b=255)
; Hmm this now uses ax, bx and cx (in the multiply macro)
%macro draw_pixel 2-5 255, 255, 255
; framebuffer + 4 * (width * y + x)
multiply [screen_size], %2 ; width * y
add ax, %1 ; + x
add ax, ax ; * 2
add ax, ax ; * 2
add ax, [frame_buffer]
mov bx, ax
mov byte [bx + 0], %5 ; Blue
mov byte [bx + 1], %4 ; Green
mov byte [bx + 2], %3 ; Red
; mov word [bx], 0xffff
; mov word [bx + 2], 0xffff
%endmacro
; Draw pixel with pre flattened coord z, in ax
; Q: Nasm docs say you can overload macros if the number of arguments is different, but I am
; getting a warning if this macro is called draw_pixel too?
%macro draw_pixel_flat 0-3 255, 255, 255
; framebuffer + 4 * (flat_coord)
add ax, ax ; * 2
add ax, ax ; * 2
add ax, [frame_buffer]
mov bx, ax
mov byte [bx + 0], %3 ; Blue
mov byte [bx + 1], %2 ; Green
mov byte [bx + 2], %1 ; Red
; mov word [bx], 0xffff
; mov word [bx + 2], 0xffff
%endmacro
; Compare pixel pointed to by bp to given immediate r, g, b
%macro cmp_pixel_color 3
; Just checking first word for now @TODO check full rgb
cmp [bp], word (%2 << 8) | %3
%endmacro
; Fewer instructions than doing the nested loop.
%macro clear_screen 1
mov bp, [frame_buffer]
mov cx, [frame_buffer_num_pixels]
mov al, %1
mov ah, %1
%%loop_start:
mov [bp], ax
mov [bp + 2], al
mov [bp + 3], byte 0xFF ; Do you respect alpha?
add bp, 4
loop %%loop_start
%endmacro
%macro draw_title_screen 0
; Copy title screen to frame buffer. This is slow
; @TODO Implement ability for program to specificy the frame pointer via interrupt for fast switching!
mov bp, [frame_buffer]
mov bx, title_screen
mov cx, [frame_buffer_num_pixels]
mov di, 0
%%copy_title_screen_loop:
mov ax, [bx + di]
mov [bp + di], ax
mov ax, [bx + di + 2]
; mov [bp + di + 2], ax
; @HACK It didn't affect me but TheGag96 trying to run this wanted 0xFF in alpha channel.
; title screen image has alpha < 0xFF for some pixels. Fix that up here. Should really just fix
; the image. Adds an extra frame_buffer_num_pixels instructions.
mov [bp + di + 2], al
mov [bp + di + 3], byte 0xFF
add di, 4
loop %%copy_title_screen_loop
%endmacro
; -------------------------------------------------------------------
; Game Code Starts Here!
; -------------------------------------------------------------------
; NOTE(Charles): Pretty needlessly dynamically done.
multiply [screen_size], [screen_size]
mov [frame_buffer_num_pixels], ax
add ax, ax ; *4
add ax, ax
mov [frame_buffer_num_bytes], ax
; Set initial game state based on whether title screen is present.
mov [game_state], word GAME_STATE_PLAY
mov ax, end
mov bx, title_screen
cmp ax, bx
je no_title_screen
mov [game_state], word GAME_STATE_MENU
mov [has_title_screen], word 1
no_title_screen:
; snake_init
mov ax, [program_size]
add ax, [frame_buffer_num_bytes]
mov [snake], ax
; Request frame buffer size using int 0
mov ax, [screen_size]
mov bx, [screen_size]
int 0
%if !DRAW_SCREEN_EVERY_FRAME
; Draw background
; Have to use constant color so that when we are "deleting" snake parts we know what color to use.
; @TODO If did want nicer background could load it into memory separate to frame buffer to refer to!
; Frame buffer sits just after the code.
clear_screen screen_color
%endif
cmp [game_state], word GAME_STATE_PLAY
je start_playing
draw_title_screen
state_title_screen:
mov bp, REGISTER_INPUT
mov ax, [bp]
cmp ax, 0
jne start_playing
jmp update_end
start_playing:
mov [REGISTER_INPUT], word 0 ; clear the input used to start the game so we start in correct direction!
mov [game_state], word GAME_STATE_PLAY
clear_screen screen_color
reset:
mov ax, SNAKE_START_LENGTH
mov [score], word 0
mov bp, [snake]
mov [bp], ax ; snake.length = SNAKE_START_LENGTH
sub ax, 1
mov [bp + 2], ax; snake.head = bla
%define SNAKE_START SCREEN_SIZE / 2
mov [snake_x], word SNAKE_START
sub [snake_x], word 1 ; @HACK to align snake_x with snake parts
mov [snake_y], word SNAKE_START
mov [direction], word Direction_right
; No bounds checking for if the start length puts us off screen!
mov cx, [bp]
add bp, 4 ; bp = snake.parts
init_snake_parts:
mov bx, SNAKE_START
mov [bp + 2], bx ; y
sub bx, cx
mov [bp], bx ; x
add bp, 4
loop init_snake_parts
%macro draw_snake 0
mov bp, [snake]
mov dx, [bp]
add bp, 4 ; point to snake.parts
%%draw_snake_loop:
draw_pixel [bp], [bp + 2], SNAKE_RGB;, SNAKE_G, SNAKE_B
add bp, 4
sub dx, 1
jnz %%draw_snake_loop
%endmacro
; Should really do this during the init above, but awkward to do while not really fully supporting
; byte operations.
draw_snake
; apple_init
%macro spawn_apple 0
; This can potentially infinte loop!
%%loop:
generate_random_number
; check this position isn't occupied!
mov bp, ax
mov bp, bp
mov bp, bp
add bp, [frame_buffer]
cmp_pixel_color SCREEN_RGB
jne %%loop
draw_pixel_flat APPLE_RGB
; Q: Do I actually even need to store this? Can just check color of frame buffer? I'll be checking frame
; buffer to detect self collisions anyway.
mov [apple_position], ax
%endmacro
spawn_apple
do_one_frame:
; Read input
mov ax, [REGISTER_INPUT]
; Up Key
cmp ax, INPUT_UP
jne up_not_pressed
; Can't change to up if we are currently going down.
cmp [direction], word Direction_down
je read_input_end
mov [direction], word Direction_up
jmp read_input_end
up_not_pressed:
; Down Key
cmp ax, INPUT_DOWN
jne down_not_pressed
; Can't change to down if we are currently going up.
cmp [direction], word Direction_up
je read_input_end
mov [direction], word Direction_down
jmp read_input_end
down_not_pressed:
; Left Key
cmp ax, INPUT_LEFT
jne left_not_pressed
; Can't change to left if we are currently going right.
cmp [direction], word Direction_right
je read_input_end
mov [direction], word Direction_left
jmp read_input_end
left_not_pressed:
; Right Key
cmp ax, INPUT_RIGHT
jne right_not_pressed
; Can't change to right if we are currently going left.
cmp [direction], word Direction_left
je read_input_end
mov [direction], word Direction_right
jmp read_input_end
right_not_pressed:
; Menu Key
cmp ax, INPUT_MENU
jne menu_not_pressed
mov [game_state], word GAME_STATE_MENU
draw_title_screen
jmp update_end
menu_not_pressed:
read_input_end:
; Update player position
update_player_position:
%define DEBUG_SNAKE_POSITION 0
%if DEBUG_SNAKE_POSITION
draw_pixel [snake_x], [snake_y], screen_color, screen_color, screen_color
%endif
; Handle left/right movement
mov ax, [snake_x]
; Move right
cmp [direction], word Direction_right
je direction_is_right
jmp direction_not_right ; Too big a jump for conditional now!
direction_is_right:
; Update the snake_x
add ax, 1
cmp ax, [screen_size]
jne no_wrap_right
mov ax, 0
no_wrap_right:
mov [snake_x], ax
jmp update_player_position_end
direction_not_right:
; Move left
cmp [direction], word Direction_left
je direction_is_left
jmp direction_not_left
direction_is_left:
; Update the snake_x
add ax, -1
cmp ax, -1
jne no_wrap_left
mov ax, [screen_size]
sub ax, 1
no_wrap_left:
mov [snake_x], ax
jmp update_player_position_end
direction_not_left:
; Handle up/down movement
mov ax, [snake_y]
; Move up
cmp [direction], word Direction_up
je direction_is_up
jmp direction_not_up
direction_is_up:
; Update the snake_y
add ax, 1
cmp ax, [screen_size]
jne no_wrap_up
mov ax, 0
no_wrap_up:
mov [snake_y], ax
jmp update_player_position_end
direction_not_up:
; Move down
cmp [direction], word Direction_down
je direction_is_down
jmp direction_not_down
direction_is_down:
; Update the snake_y
add ax, -1
cmp ax, -1
jne no_wrap_down
mov ax, [screen_size]
sub ax, 1
no_wrap_down:
mov [snake_y], ax
jmp update_player_position_end
direction_not_down:
update_player_position_end:
; Check what the new x, y contains. Apple, snake or nothing
; Given x, y coord but the address of the pixel into ax
%macro get_pixel 2
multiply [screen_size], %2 ; width * y
add ax, %1 ; + x
add ax, ax ; * 2
add ax, ax ; * 2
add ax, [frame_buffer]
%endmacro
get_pixel [snake_x], [snake_y]
mov bp, ax
cmp_pixel_color SNAKE_RGB
jne i_atent_dead
; Just clearing whole screen for now, will be slow
; @TODO clear all snake parts and apple, not entire screen.
; I actually kind of like the delay when you die that this causes so not doing this because would then need
; to implement that delay!
clear_screen screen_color
jmp reset
i_atent_dead:
; Either we eat an apple and grow, or just move snake. Either way we need the to increment the head!
mov bx, [snake]
mov cx, [bx + 2] ; snake.head
add cx, 1;
cmp cx, [bx]
jne no_wrap_head
mov cx, 0
no_wrap_head:
mov [bx + 2], cx ; snake.head = new_head_index
cmp_pixel_color APPLE_RGB
; @TODO I had to change to unconditnal jump here because lots instrucitnos. but many instrucitons below
; can be removed then this might go back to unconditnoial (if want to save more instructions)
je eaten_an_apple
jmp no_apple
eaten_an_apple:
add [score], word 1
spawn_apple
; Grow the snake!
mov bp, [snake]
add bp, 4 ; bx = snake.parts
; bp -> snake.parts
; cx == snake.head
add cx, cx
add cx, cx ; cx * 4 (cx is index but size of part is 4 [2xu16])
add bp, cx ; bp = &snake.parts[snake.head]
; move all parts from snake.head (new_index) -> snake.length up one
; @TODO being bit lazy with registers here, can remove some of these instructinos.
mov bx, [snake]
mov cx, [bx] ; cx = snake.length - snake.head
sub cx, [bx + 2] ; -
add cx, cx ; bx -> snake.parts + snake.length
add cx, cx ; -
mov bx, bp ; -
add bx, cx ; -
add bx, 3
; @TODO re work this to go forward and not be so awkward lol!
realloc_snake_part:
; have to do a byte at a time to have negative address displacement I think. But why Am I doing this
; backwards at all?!
mov al, [bx - 4] ; each part is 4 bytes
mov [bx], al
sub bx, 1
cmp bx, bp
jne realloc_snake_part
mov bp, [snake]
add [bp], word 1 ; snake.length++
; set new head
mov ax, [snake_x]
mov [bx], ax
mov ax, [snake_y]
mov [bx + 2], ax
; draw new head
draw_pixel [bx], [bx + 2], SNAKE_RGB
jmp update_end
no_apple:
; replace_tail_with_head
; @TODO maybe rework where bp, bx point, depending on how eating code plays out!
mov bp, [snake]
add bp, 4 ; bx = snake.parts
; bp -> snake.parts
; cx == snake.head
add cx, cx
add cx, cx ; cx * 4 (cx is index but size of part is 4 [2 x u16])
add bp, cx ; bp = &snake.parts[snake.head]
; clear tail
draw_pixel [bp], [bp + 2], SCREEN_RGB
; set new head
mov ax, [snake_x]
mov [bp], ax
mov ax, [snake_y]
mov [bp + 2], ax
; draw new head
draw_pixel [bp], [bp + 2], SNAKE_RGB
%if DEBUG_SNAKE_POSITION
draw_pixel [snake_x], [snake_y], 255, 0, 255
%endif
update_end:
; @TMP debugging
mov ax, [score]
mov si, ax
%if DRAW_SCREEN_EVERY_FRAME
; Clear the screen
; Frame buffer sits just after the code.
mov bp, [frame_buffer]
mov dx, [screen_size]
y_loop_start:
mov cx, [screen_size]
x_loop_start:
mov byte [bp + 0], screen_color ; Blue
mov byte [bp + 1], screen_color ; Green
mov byte [bp + 2], cl ; Red
; mov byte [bp + 3], 255 ; Alpha
add bp, 4
loop x_loop_start
sub dx, 1
jnz y_loop_start
draw_snake
%endif
; Use int 15 as a hacky way to signal to hosting simualtor to draw frame and sleep till next frame
; There is something about on actualy 8086 used to call int 15h with ah=86h to do micro second sleeps but
; 1) details of it aren't obvious to me but also 2) that would require asm code to keep track of timings!
; mov ah, 86h
; mov cx, micro_seconds
int 15h
; @TODO: Clean up handling of menu screen. This is very spaghetti!
cmp [game_state], word GAME_STATE_PLAY
je is_playing
jmp state_title_screen
is_playing:
; NOTE(Charles): I actually _had_ to implement jmp to change the jnz that was here before because
; conditional jumps only have 1 byte offset. Once I had enough instruciotns I started getting weird assembled
; code. Eg I got a pop and a test instead of the jnz!
jmp do_one_frame
; -------------------------------------------------------------------
; Data
; -------------------------------------------------------------------
; Need some way to mark data stuff to not be executed (or even decoded/printed?). Atm int3 will force us
; to break the loop
int3
int3
int3
; NOTE(Charles): The below variable names are really just labels! eg `program_size: dw end` is equivalent.
; gets the size of the program so we can check we arent gonna run out of memory!
program_size dw end
game_state dw 0 ; 0: MENU, 1: PLAY
score dw 0;
has_title_screen dw 0
frame_buffer_num_bytes dw 0
frame_buffer_num_pixels dw 0
frame_buffer dw end
snake dw 0
screen_size dw SCREEN_SIZE; Using a variable instead of a constant as could then dynamically change screen size!
; Technically all the information we need is in the snake struct. But it is much more convienet
; to keep track of the current position in these statics!
snake_x dw 0
snake_y dw 0
apple_position dw 0 ; flattened coordinate to make easier to randomly generate.
direction dw 0
rng_seed dw LCG_INITIAL_SEED
random_number_index dw 0
; rng_limt_number
; ", ".join([str(random.randint(0, 4096)) for _ in range(100)])
; When testing if want first apple to be in path use 2050
rng_4096_10 dw 630, 2080, 3762, 1334, 2310, 2790, 960, 3855, 3001, 1035
rng_4096_100 dw 3818, 2323, 3807, 1082, 2237, 1101, 1694, 1536, 71, 3289, 3184, 3167, 2734, 626, 3559, 2094, 2178, 1158, 4009, 2958, 3170, 367, 3947, 3555, 120, 4021, 645, 1329, 832, 3553, 2819, 2478, 1071, 1754, 1572, 3580, 1230, 2058, 3843, 960, 3460, 1315, 1891, 1112, 2333, 1811, 3124, 436, 1789, 4027, 2957, 1815, 528, 953, 940, 4043, 472, 1978, 2388, 1869, 2830, 2758, 3024, 688, 3538, 1031, 2239, 94, 555, 2960, 4049, 3431, 1205, 663, 395, 1329, 3835, 459, 3404, 995, 632, 2964, 3507, 933, 2154, 2404, 362, 3960, 1083, 1894, 490, 3111, 1871, 2082, 3730, 2426, 2321, 2352, 4074, 3110
rng_4096_1000 dw 1511, 771, 2197, 2256, 1133, 1022, 3580, 1786, 2204, 3182, 713, 2126, 3942, 148, 3438, 2714, 1825, 1861, 2634, 3926, 872, 1327, 2635, 3078, 369, 2189, 1399, 323, 1200, 2015, 1470, 152, 3544, 3251, 618, 2481, 1168, 37, 1255, 790, 3564, 2581, 209, 1921, 1075, 2593, 1197, 2245, 3943, 2359, 4057, 3449, 1581, 3058, 3226, 2498, 2119, 2845, 116, 2892, 1840, 879, 2691, 1581, 678, 1927, 1368, 1377, 2657, 3152, 1401, 243, 1703, 1388, 2612, 979, 3605, 1806, 373, 3295, 1000, 2379, 2886, 1920, 3090, 373, 1284, 3741, 992, 1057, 2990, 1008, 2425, 1679, 3819, 1335, 744, 121, 3746, 1549, 1353, 5, 1999, 359, 1795, 2974, 1875, 1608, 427, 3973, 3719, 1699, 961, 2611, 3426, 383, 1296, 1755, 3989, 4067, 1875, 601, 187, 2960, 2298, 940, 392, 359, 239, 900, 3971, 16, 1611, 355, 1873, 1592, 2253, 1638, 1156, 296, 624, 3490, 2692, 1800, 1167, 1680, 634, 2137, 3783, 3562, 3697, 1542, 694, 1793, 1048, 2890, 197, 2081, 107, 2341, 3734, 2962, 3839, 3139, 462, 2317, 2145, 1612, 1518, 408, 2641, 1436, 1108, 1042, 3067, 1290, 449, 3036, 3298, 1692, 4048, 237, 2517, 1894, 1709, 4084, 761, 780, 3071, 3064, 2022, 904, 3649, 2729, 2067, 4075, 1474, 3837, 2327, 712, 205, 2863, 2320, 1912, 2601, 2853, 472, 2700, 2818, 3969, 3604, 641, 962, 771, 194, 2879, 1980, 2812, 1526, 1832, 464, 2031, 2463, 3605, 296, 2682, 3701, 144, 3420, 4083, 825, 806, 3552, 350, 2672, 1718, 3792, 1830, 695, 2121, 1504, 839, 3134, 3895, 2447, 1217, 3959, 3193, 1464, 2623, 4065, 693, 2894, 3951, 4014, 2211, 4084, 2902, 895, 4052, 2237, 453, 2307, 2980, 3425, 729, 2617, 3410, 546, 318, 1957, 3505, 1283, 1365, 992, 991, 1563, 3827, 1960, 854, 2065, 12, 919, 75, 258, 3221, 4050, 3340, 2196, 2126, 4050, 3546, 434, 2154, 267, 1038, 2627, 1329, 4059, 2963, 3863, 3483, 1778, 1505, 1705, 3973, 5, 513, 2184, 3180, 1625, 2732, 3075, 1663, 1592, 1061, 2606, 3156, 3068, 2833, 2226, 3578, 2795, 3545, 3622, 1835, 804, 3955, 1070, 2165, 886, 2756, 1852, 1658, 1495, 809, 3376, 2316, 1106, 1798, 3085, 4001, 2227, 8, 1026, 770, 3896, 3254, 3316, 1264, 1275, 3383, 391, 3442, 1218, 1210, 3404, 425, 20, 1757, 131, 3305, 1740, 383, 2244, 2011, 4062, 1154, 1615, 1879, 366, 1463, 3660, 1185, 949, 1477, 2423, 2875, 2999, 3166, 43, 865, 675, 3873, 1548, 2585, 1011, 1276, 3314, 553, 2688, 283, 2188, 2496, 3015, 3567, 2239, 954, 1561, 1258, 508, 2821, 524, 2918, 2532, 961, 996, 906, 2553, 2052, 488, 1077, 2383, 1948, 124, 952, 2750, 257, 2174, 893, 46, 117, 3224, 93, 1150, 3615, 1679, 3405, 3306, 1665, 252, 2724, 1608, 76, 1906, 3551, 3141, 2935, 1824, 1652, 1610, 2735, 2049, 788, 1304, 80, 3317, 2477, 2729, 2943, 835, 490, 2714, 2116, 3810, 4005, 3719, 10, 4019, 2855, 244, 3582, 2841, 4087, 3967, 858, 356, 2477, 3716, 2504, 2178, 2568, 3310, 1244, 3190, 194, 2478, 2855, 1445, 3406, 3907, 1273, 2007, 1586, 2258, 1732, 3091, 3399, 2912, 1297, 406, 3768, 3781, 1193, 3704, 2718, 4068, 1517, 219, 2281, 745, 1356, 304, 1843, 3531, 2693, 3534, 132, 2671, 2786, 1006, 2483, 222, 1966, 3385, 782, 548, 1054, 1094, 1096, 2031, 3245, 270, 3701, 3200, 1256, 2138, 468, 2589, 1728, 2435, 2386, 3725, 3834, 287, 3709, 2116, 3061, 1305, 426, 2504, 1500, 409, 2352, 2284, 1028, 850, 3883, 2852, 1955, 3184, 2197, 2228, 2804, 443, 1960, 1311, 208, 2755, 677, 1659, 1611, 2759, 145, 3229, 2895, 2347, 1411, 2203, 2450, 1776, 2406, 1408, 3667, 3671, 811, 281, 2786, 3027, 3365, 2957, 3794, 1407, 1558, 4047, 1972, 169, 351, 2933, 1922, 3476, 3652, 104, 1145, 2807, 4029, 1615, 2147, 149, 937, 319, 3210, 3398, 1118, 1358, 3462, 658, 2106, 3808, 1088, 407, 2195, 1470, 1736, 3714, 735, 1411, 251, 1776, 2035, 2942, 3469, 953, 4082, 2776, 479, 3026, 1812, 1140, 3522, 928, 4083, 2578, 3552, 3296, 3869, 1604, 353, 3300, 1943, 3854, 192, 670, 1455, 3558, 1468, 1018, 880, 1946, 566, 2023, 2962, 4076, 425, 3403, 286, 3803, 640, 2199, 1677, 191, 3167, 2688, 3918, 1829, 2079, 990, 209, 905, 827, 3001, 2805, 795, 1157, 2521, 3645, 2870, 1668, 3812, 79, 1664, 474, 3768, 1823, 957, 3656, 3983, 2151, 3024, 403, 211, 2961, 2675, 1550, 3031, 2846, 79, 996, 290, 3149, 2408, 1137, 1833, 1537, 3047, 4024, 799, 2434, 2573, 3104, 3641, 2401, 1792, 2579, 3077, 3911, 1832, 3519, 449, 1980, 426, 702, 868, 2053, 3675, 2720, 3229, 3853, 1275, 1087, 2210, 2687, 702, 178, 3687, 1269, 2635, 2617, 2718, 1362, 885, 69, 3396, 943, 728, 2895, 2858, 1489, 586, 869, 2915, 2647, 705, 401, 2832, 3295, 2676, 3794, 1709, 2211, 3335, 2423, 2237, 2424, 748, 3382, 1848, 2606, 2534, 1761, 479, 3921, 3738, 3129, 3438, 199, 2560, 2002, 8, 436, 1700, 440, 1169, 2338, 1750, 3915, 129, 2474, 2175, 3285, 1244, 2175, 1380, 2373, 3282, 1071, 2969, 2783, 606, 541, 2715, 2376, 1485, 3649, 296, 146, 2924, 2754, 3801, 3128, 851, 4053, 2960, 858, 3836, 2002, 1008, 446, 1395, 3275, 507, 2923, 3351, 711, 113, 3985, 104, 2605, 3556, 64, 1072, 1266, 3376, 723, 2491, 864, 2797, 645, 2712, 2861, 437, 1971, 2570, 2252, 990, 1709, 824, 2261, 2328, 1583, 2035, 896, 3212, 2876, 3216, 3664, 1087, 435, 979, 1672, 153, 3927, 1089, 1679, 3947, 1720, 1608, 2473, 454, 3613, 2280, 814, 1688, 2237, 3221, 2293, 916, 2821, 2069, 618, 3844, 3767, 185, 371, 1841, 3189, 2642, 1551, 1009, 1594, 53, 2631, 1324, 3080, 1468, 3227, 1164, 2882, 3451, 794, 3220, 2582, 3855, 1934, 1587, 2512, 3210, 2579, 2249, 2088, 522, 2960, 197, 3464, 3191, 2404, 3957, 3824, 127, 3503, 221, 2149, 3360, 3027, 1058, 3787, 2609, 1913, 1302, 1211, 2370, 3646, 1659, 4068, 1535, 2500, 1809, 2654, 3212, 3196, 3503, 323, 2614, 4085, 1044, 796, 2252, 3154, 850, 2669, 1071, 3269, 1885, 4036, 3199, 2090, 1311, 286, 1132, 3425, 332, 3542, 143, 332, 1388, 2999, 1107, 2974, 2478, 1698, 3923, 554, 2318, 1896, 3331, 2217, 1971, 1484, 372, 2163, 116, 4057, 3419, 745, 2044, 1295, 474, 1313, 1916, 3243, 1680, 4086, 3617, 2547, 2203, 2649, 3589, 3630, 1316, 148
; Somethign weird is happening when using 10k. At some point the snake stops clearing its tail. Presumably
; I'm overwriting some memory I shouldn't but I can't see where :shrug:.
; 10k random numbers for snake is proooobably overkill anyway. It's almost as much memory as the frame buffer...
; rng_4096_10000 dw 909, 3655, 4062, 2186, 1144, 2097, 2338, 235, 1071, 3344, 84, 3637, 3035, 1454, 533, 1205, 1369, 2584, 1584, 3986, 2731, 3914, 529, 3891, 1243, 2820, 3718, 292, 6, 1553, 1973, 3302, 2352, 605, 1067, 3239, 3895, 1109, 1330, 552, 1328, 1655, 1923, 2537, 1810, 229, 2226, 2380, 3735, 899, 1613, 3405, 836, 513, 678, 810, 2399, 2944, 1417, 2441, 631, 3153, 3267, 2762, 2748, 2589, 1397, 907, 2083, 1265, 2100, 639, 2386, 2177, 1302, 117, 4010, 373, 3146, 2859, 3139, 2804, 2160, 28, 3609, 3529, 503, 3895, 2422, 3597, 2492, 2417, 2198, 3465, 3229, 2921, 895, 3370, 3750, 247, 826, 3258, 4028, 3672, 2681, 3736, 1486, 3052, 372, 3421, 3662, 4005, 2436, 716, 3568, 1316, 2296, 1110, 162, 3064, 1705, 859, 11, 1587, 3791, 3653, 3071, 2895, 3786, 819, 2674, 2168, 459, 4014, 986, 1148, 2182, 1846, 261, 2616, 2048, 1472, 3647, 1697, 657, 1788, 3526, 111, 315, 2512, 1515, 3502, 3500, 1882, 2965, 3358, 1952, 265, 1141, 842, 1570, 2600, 2109, 725, 2471, 594, 2528, 772, 3014, 143, 1402, 2917, 3019, 728, 2566, 176, 1081, 3830, 343, 2896, 769, 3843, 3015, 1510, 3103, 402, 291, 3474, 2950, 1463, 2828, 3468, 3847, 3461, 3746, 1382, 2049, 1153, 461, 3005, 1220, 2493, 3269, 1133, 1935, 3760, 1172, 1985, 4005, 3417, 1119, 3193, 3289, 3018, 348, 3011, 1266, 1368, 3421, 138, 669, 971, 200, 3364, 2924, 3115, 2478, 2826, 3578, 593, 51, 3404, 1629, 1271, 3261, 1717, 2349, 3068, 2721, 3330, 1007, 1560, 4082, 269, 2532, 3496, 99, 3742, 352, 803, 2889, 3263, 1385, 2954, 332, 1695, 388, 1574, 3780, 3252, 3752, 2275, 1699, 3809, 413, 642, 1866, 3163, 1033, 3691, 214, 1544, 188, 1178, 1234, 1778, 365, 3693, 3508, 936, 417, 2270, 3303, 239, 1301, 3411, 1737, 3156, 3051, 3352, 951, 4023, 1329, 765, 831, 2319, 1146, 2336, 1934, 70, 3255, 2799, 2077, 2474, 1328, 2247, 1762, 820, 3988, 3459, 957, 2103, 2476, 3911, 1886, 1722, 4030, 502, 7, 1772, 3353, 1763, 1116, 2194, 3127, 1636, 2446, 3954, 371, 1503, 147, 3995, 3767, 1692, 541, 3163, 1200, 3213, 2412, 2901, 2028, 2830, 1405, 2989, 3517, 2052, 3381, 3159, 2102, 2736, 3440, 3057, 1904, 3218, 678, 1080, 2256, 2629, 2254, 2572, 3074, 2760, 517, 3510, 561, 550, 4028, 330, 2426, 304, 1315, 1989, 3370, 4080, 3071, 3866, 1456, 4031, 442, 3234, 2728, 2033, 2254, 453, 597, 609, 3483, 3475, 1001, 1823, 3672, 3124, 2634, 414, 2012, 402, 3129, 660, 63, 1091, 3557, 3254, 2034, 1140, 3335, 3092, 2859, 131, 3345, 2525, 782, 3832, 1868, 1974, 590, 4015, 2638, 1217, 1566, 2174, 653, 303, 671, 2841, 3150, 162, 977, 1115, 2856, 1557, 3129, 2100, 3585, 3205, 3608, 1289, 2797, 1201, 2537, 2652, 588, 1853, 3932, 1779, 3831, 3885, 2820, 3466, 4026, 3863, 1281, 1873, 2970, 1165, 3470, 779, 3579, 1059, 2025, 3321, 1339, 2415, 2963, 4082, 3493, 644, 181, 1364, 2338, 3719, 2899, 627, 761, 2780, 2942, 3399, 840, 3437, 1166, 2735, 4075, 2795, 1073, 3051, 2790, 300, 3358, 1581, 2243, 3706, 3410, 1134, 74, 3699, 2820, 2052, 1490, 911, 448, 1838, 2918, 291, 2701, 1965, 4026, 2446, 1036, 3968, 707, 3144, 2599, 1098, 1925, 297, 3584, 3770, 3425, 1115, 3971, 689, 2465, 850, 522, 861, 268, 4050, 867, 1106, 1605, 2376, 2940, 1936, 364, 72, 2461, 2815, 558, 3094, 4025, 254, 2521, 1924, 73, 1187, 127, 3374, 1930, 34, 2103, 3345, 1750, 2242, 3409, 1647, 1476, 3862, 2792, 972, 1602, 2682, 3385, 1651, 3527, 3930, 3737, 3081, 666, 2258, 385, 3208, 2854, 3424, 2511, 2827, 124, 2351, 1192, 2194, 1878, 3489, 1887, 2203, 3729, 1146, 4096, 2380, 391, 1704, 2399, 581, 2894, 2533, 1263, 1580, 3290, 3816, 1386, 755, 1169, 3223, 1124, 2831, 3409, 1590, 2131, 2136, 2541, 643, 1075, 3075, 1016, 2888, 3166, 1373, 2841, 12, 3437, 331, 3892, 3254, 1986, 2418, 2786, 904, 2189, 3372, 166, 3703, 3450, 1621, 3343, 1407, 3084, 44, 3777, 3930, 413, 912, 319, 3091, 481, 2152, 1902, 3262, 2523, 1165, 2553, 602, 80, 3013, 3808, 997, 3894, 1448, 3710, 2828, 3107, 1537, 2898, 3834, 4063, 3628, 3004, 2875, 2949, 1982, 736, 1503, 3071, 113, 2849, 2632, 1089, 1286, 3104, 1362, 2059, 1555, 2823, 434, 237, 58, 2614, 4028, 793, 4069, 1648, 485, 1201, 2254, 823, 2085, 1990, 2280, 879, 2865, 3851, 3154, 616, 1803, 2640, 3738, 1928, 2325, 3009, 2579, 3102, 230, 597, 3433, 1525, 2804, 1699, 2971, 1601, 1533, 1325, 3940, 334, 754, 244, 341, 1071, 3691, 340, 2655, 2630, 1278, 2697, 2868, 2091, 3079, 1726, 1524, 1788, 861, 894, 2751, 1057, 1040, 755, 2341, 2836, 2020, 3532, 3446, 1, 1107, 3125, 3421, 707, 3649, 205, 3163, 3774, 336, 2291, 3553, 39, 2565, 3763, 631, 780, 1630, 3170, 2061, 3853, 2777, 4083, 3723, 291, 1297, 3414, 997, 1683, 3286, 2259, 3396, 1416, 109, 1327, 1855, 2101, 3301, 3090, 3738, 1119, 3473, 994, 3441, 338, 2818, 1967, 2756, 102, 1442, 2691, 3773, 1548, 3127, 2733, 1832, 2702, 2549, 3938, 3096, 1548, 2871, 3295, 3466, 3327, 2942, 3809, 3365, 3153, 1761, 419, 2636, 3117, 1988, 3999, 1307, 3315, 3117, 2023, 1668, 2318, 246, 3811, 1525, 1747, 2254, 3760, 60, 3625, 2702, 131, 563, 4009, 3964, 1584, 2401, 2342, 341, 2522, 2205, 1362, 1975, 2030, 1480, 2016, 4009, 3154, 2614, 123, 3967, 2922, 2790, 2532, 1622, 1286, 1577, 2313, 424, 3853, 376, 3395, 2641, 1789, 466, 1565, 2238, 1764, 2578, 1852, 2283, 3061, 1948, 4004, 2933, 3900, 1709, 2105, 3008, 2855, 3765, 1043, 960, 853, 2018, 1684, 748, 142, 350, 1679, 1056, 1459, 2637, 3471, 2532, 811, 3008, 2552, 2686, 3626, 920, 2893, 1994, 768, 2180, 3599, 1910, 563, 2182, 1295, 2823, 2182, 3592, 3072, 1893, 2561, 491, 2948, 2771, 3952, 159, 846, 2664, 4075, 854, 3088, 1340, 401, 3555, 546, 484, 789, 618, 2901, 3736, 163, 1806, 952, 1271, 3324, 3357, 3144, 3076, 2629, 3758, 189, 1031, 745, 838, 2529, 2128, 3246, 2914, 1495, 3214, 2328, 649, 2752, 2971, 3944, 455, 1236, 20, 2708, 1090, 4022, 511, 2944, 3430, 1003, 2284, 3255, 3710, 1815, 1552, 2082, 2636, 1498, 2225, 3184, 2039, 909, 3740, 2950, 2670, 1077, 2316, 3719, 2767, 1061, 2490, 2788, 3608, 3100, 2961, 2022, 2417, 243, 2033, 3519, 746, 2071, 81, 3704, 3794, 1864, 2374, 2132, 143, 2078, 432, 887, 3090, 2280, 3304, 3814, 299, 1578, 1587, 2291, 2030, 558, 3430, 3099, 3004, 1131, 2490, 1977, 899, 24, 3711, 379, 2763, 3269, 3535, 3539, 417, 1359, 2806, 2543, 3683, 3823, 1710, 3243, 2483, 48, 1021, 94, 1492, 3055, 703, 1215, 2847, 1271, 974, 1686, 3709, 465, 3153, 2078, 3424, 301, 2594, 1766, 825, 1891, 3624, 3748, 334, 1363, 3117, 3462, 3130, 361, 2255, 3645, 3700, 2850, 46, 2547, 2305, 405, 2120, 965, 4077, 2639, 1535, 1227, 834, 1095, 3958, 2248, 532, 801, 2865, 4092, 3037, 1739, 1582, 3467, 3612, 1452, 3773, 2131, 948, 1033, 1326, 3963, 1652, 1407, 345, 2550, 3411, 1192, 3514, 97, 3091, 526, 3023, 2621, 211, 655, 1535, 388, 1733, 534, 702, 352, 277, 3819, 1151, 1053, 3627, 3455, 3538, 3386, 1429, 610, 2072, 960, 2659, 3454, 1263, 2297, 1650, 3706, 1644, 3648, 878, 3302, 2803, 2993, 3626, 3957, 1904, 2443, 1945, 1824, 2399, 2678, 2245, 3746, 345, 1105, 1282, 998, 3495, 670, 672, 307, 2252, 2530, 2518, 526, 321, 1303, 3895, 719, 1630, 2360, 3700, 3834, 2268, 2909, 2166, 901, 3233, 1187, 2371, 30, 3092, 2707, 2636, 3194, 780, 3732, 2432, 1626, 2670, 3872, 3153, 2454, 2766, 3978, 3586, 2931, 1918, 2985, 3989, 4021, 3369, 2045, 1037, 647, 1968, 1886, 980, 2483, 856, 3675, 397, 2082, 2033, 433, 1081, 3921, 4090, 3256, 1232, 2489, 1975, 2422, 2486, 410, 2473, 3420, 2090, 2464, 812, 3173, 1799, 2195, 1708, 742, 2471, 2490, 310, 1527, 1783, 3908, 2582, 3944, 266, 740, 1968, 1408, 2435, 1698, 2091, 1779, 3625, 786, 104, 3670, 3254, 38, 4027, 1388, 2943, 927, 40, 2569, 3323, 2831, 294, 182, 4072, 633, 1829, 2318, 326, 2425, 676, 3383, 3945, 1598, 1065, 3437, 246, 929, 3250, 1966, 3355, 3632, 888, 1773, 2829, 2235, 2769, 2762, 3447, 1168, 3151, 109, 2863, 146, 2717, 2988, 2779, 3325, 2960, 1687, 36, 620, 1175, 140, 1428, 479, 1778, 1291, 2715, 1104, 3022, 1470, 2549, 864, 1535, 297, 3956, 1646, 3190, 3877, 3018, 1331, 1121, 3296, 3515, 2365, 1668, 1791, 1232, 1199, 1480, 3172, 2845, 2030, 2974, 2085, 2834, 138, 3725, 234, 378, 72, 2972, 2421, 2128, 1541, 186, 3163, 58, 681, 3649, 3423, 909, 3351, 452, 3389, 2235, 2598, 502, 307, 1358, 1688, 2176, 3121, 3776, 211, 2157, 591, 1536, 2182, 2435, 2937, 3384, 359, 1151, 2962, 657, 3403, 837, 3341, 1473, 426, 502, 3158, 2227, 2005, 1117, 1179, 4023, 1776, 2917, 1298, 47, 2301, 2691, 3919, 3238, 595, 2363, 3201, 2072, 1423, 1429, 1900, 516, 1215, 2842, 3697, 1928, 2750, 3258, 519, 1313, 130, 413, 3846, 2238, 1592, 2117, 3224, 115, 214, 1850, 2372, 3684, 3943, 2439, 841, 2183, 2045, 4032, 1193, 2488, 513, 3393, 1835, 3863, 3869, 2310, 1467, 3882, 1156, 2768, 2938, 2325, 3142, 1835, 3802, 2518, 1929, 3924, 129, 290, 3416, 3155, 384, 2025, 260, 481, 2215, 2615, 1169, 2118, 2809, 1799, 662, 49, 1574, 2740, 1889, 1469, 486, 2033, 3071, 2947, 3153, 447, 3680, 2083, 1368, 1922, 3470, 4038, 3333, 570, 1434, 2419, 3165, 1410, 1940, 3797, 719, 1018, 208, 1915, 1042, 3843, 3126, 1549, 28, 838, 2542, 1571, 1461, 2437, 3183, 2127, 1368, 3481, 2675, 3017, 784, 1236, 607, 1814, 1432, 1260, 1447, 243, 1299, 2674, 2963, 1964, 3128, 2654, 1918, 414, 2192, 1316, 2779, 1382, 603, 3120, 3047, 3552, 684, 3952, 3529, 2728, 3396, 1487, 1235, 1031, 1052, 737, 1751, 391, 387, 1199, 3494, 4076, 1917, 2689, 4002, 3558, 3911, 1251, 732, 2179, 4046, 923, 2859, 304, 1679, 4052, 2210, 1083, 823, 1073, 1268, 2379, 515, 3094, 2549, 3977, 2516, 727, 59, 254, 515, 1032, 2129, 442, 46, 2128, 1464, 1436, 2321, 2503, 3154, 1427, 3989, 3599, 419, 1451, 3698, 1990, 1211, 1592, 4060, 1230, 3455, 2158, 2042, 3005, 2558, 1870, 3873, 634, 959, 1459, 3211, 3696, 2745, 204, 1823, 143, 3035, 1291, 197, 3141, 870, 3897, 2646, 1192, 198, 1793, 2513, 1229, 1074, 2787, 1556, 3378, 1764, 2890, 2918, 307, 1354, 2858, 2135, 3005, 999, 1697, 1967, 1593, 1447, 2120, 196, 3476, 3546, 451, 2186, 522, 4035, 1461, 960, 1434, 1265, 3607, 894, 3728, 4024, 661, 779, 949, 3245, 127, 1711, 3198, 3647, 3956, 3539, 2291, 3912, 2367, 1814, 1242, 3492, 1019, 1728, 2612, 3275, 686, 861, 2958, 375, 1245, 456, 169, 3287, 4051, 2061, 3077, 59, 3766, 2135, 1326, 2157, 315, 2144, 206, 2130, 353, 737, 993, 2317, 1967, 2056, 2233, 1680, 3692, 1122, 143, 2189, 3770, 3611, 3830, 3525, 699, 325, 1105, 2421, 2424, 2220, 336, 3365, 1142, 3403, 3724, 3167, 1768, 3749, 2037, 1656, 1593, 3092, 1110, 4063, 1979, 3611, 3168, 1202, 3603, 1428, 1692, 2317, 1183, 720, 1261, 1066, 1278, 1500, 164, 572, 3938, 485, 608, 2809, 3056, 3691, 587, 545, 3130, 544, 2356, 2338, 2868, 1463, 3762, 961, 3859, 1246, 2877, 3266, 459, 3301, 1404, 2931, 1795, 1923, 3165, 2111, 1279, 2694, 3024, 3262, 1325, 359, 309, 493, 3423, 3024, 1944, 201, 2143, 1148, 3211, 1214, 2050, 2296, 2528, 3196, 381, 3692, 3111, 1750, 2335, 210, 3866, 3464, 3572, 1208, 343, 995, 3356, 2332, 3386, 3496, 719, 413, 829, 2336, 2039, 3429, 15, 2200, 3367, 1193, 2242, 1349, 4081, 1496, 303, 68, 914, 1660, 339, 237, 362, 114, 2906, 1944, 619, 114, 1569, 339, 1335, 1313, 2500, 1562, 53, 289, 2989, 3213, 349, 3842, 4038, 1559, 2784, 1782, 132, 978, 1033, 1517, 1856, 3568, 2219, 3832, 1736, 2246, 1889, 61, 935, 3737, 94, 1152, 3955, 102, 3055, 2461, 3214, 3367, 120, 443, 339, 1340, 3075, 3083, 14, 3777, 2849, 2920, 3910, 3806, 1235, 962, 1382, 583, 1790, 3514, 1665, 1053, 3668, 1731, 3017, 4080, 2408, 4063, 3679, 3427, 3974, 2974, 4030, 1972, 2852, 3141, 1957, 3392, 3042, 2206, 1971, 1895, 2446, 3484, 1780, 2565, 1647, 3897, 3358, 1552, 2692, 3366, 1783, 779, 3993, 2801, 1830, 1842, 159, 1476, 791, 577, 3753, 2868, 1202, 3192, 2732, 2615, 1674, 2390, 864, 3871, 3518, 239, 3226, 3770, 1776, 2262, 4030, 3389, 524, 1881, 1957, 218, 1467, 1964, 2036, 698, 1496, 1973, 331, 277, 1710, 3734, 2538, 3368, 993, 3779, 2398, 1624, 4077, 3902, 483, 216, 1269, 1035, 2919, 3598, 410, 2579, 881, 3449, 305, 3997, 3211, 155, 513, 2856, 1320, 3739, 1397, 972, 3823, 943, 2319, 1779, 2577, 1751, 3695, 2422, 442, 3962, 3172, 4016, 1870, 3561, 2187, 1113, 738, 3431, 2833, 647, 862, 1007, 3878, 2507, 753, 2614, 142, 975, 3328, 2381, 1271, 2409, 4037, 2793, 2416, 3405, 2785, 2964, 1196, 1858, 2382, 3832, 2559, 1753, 640, 1011, 2353, 3655, 1996, 597, 2759, 549, 3640, 24, 2684, 2921, 2133, 3947, 1985, 1491, 1458, 566, 2609, 3035, 2094, 3046, 2729, 1101, 2888, 1267, 1335, 3588, 1831, 2625, 2660, 1152, 2900, 150, 1883, 3004, 1041, 364, 4087, 1853, 3591, 895, 2699, 655, 1269, 2676, 3256, 3310, 1231, 152, 718, 1595, 1693, 1267, 3907, 542, 1778, 2942, 926, 649, 239, 1038, 3305, 2432, 2604, 3447, 361, 52, 50, 2427, 3439, 2133, 1366, 1102, 3173, 3802, 46, 2026, 2388, 1347, 2368, 2464, 3067, 470, 2229, 2482, 3069, 3334, 402, 1002, 1455, 81, 876, 1615, 3570, 3461, 1288, 2627, 1418, 2572, 1902, 1436, 2289, 1113, 2044, 2947, 2121, 997, 3988, 1517, 3068, 2093, 1466, 556, 2421, 65, 3928, 559, 3392, 497, 3686, 1521, 3170, 2437, 254, 1, 3999, 39, 3081, 3778, 2797, 56, 872, 1513, 2543, 422, 3694, 3591, 4072, 592, 430, 3289, 1181, 1506, 3524, 397, 3781, 2498, 1122, 1621, 3708, 3103, 3187, 2244, 263, 57, 3112, 2747, 3655, 2301, 392, 3181, 1488, 995, 3697, 267, 3022, 1187, 2860, 527, 1001, 3183, 344, 3308, 3231, 2819, 3814, 2072, 3179, 1930, 1474, 3615, 1125, 197, 398, 985, 1719, 1789, 1800, 3037, 444, 941, 1263, 1303, 847, 2624, 1939, 2791, 52, 150, 252, 3061, 1595, 3182, 894, 2475, 325, 1026, 1734, 1393, 923, 66, 1014, 799, 1744, 4074, 2922, 2893, 374, 1174, 703, 981, 280, 1898, 2090, 2391, 1387, 1234, 3782, 726, 1486, 1309, 1859, 1491, 3692, 2296, 2802, 1424, 801, 3808, 3740, 3148, 3694, 3575, 904, 3976, 577, 2608, 3194, 2099, 3756, 744, 990, 1557, 720, 4, 2083, 786, 1949, 1386, 957, 196, 257, 292, 3567, 246, 2136, 2738, 2891, 270, 3836, 2814, 2389, 2087, 552, 3385, 2647, 2172, 3676, 1609, 814, 74, 1411, 3658, 835, 461, 3302, 187, 281, 2595, 1103, 823, 1083, 1221, 864, 3097, 3650, 3402, 2358, 2878, 3177, 937, 4034, 3902, 2953, 1188, 3357, 1372, 1801, 841, 3625, 3084, 588, 2893, 909, 641, 2829, 1441, 1110, 3822, 2352, 3950, 3320, 3145, 2890, 2149, 440, 1219, 1502, 933, 3084, 2387, 2940, 2654, 2589, 2713, 121, 300, 3512, 1914, 1317, 1262, 2022, 374, 3349, 3518, 3362, 3852, 1719, 1146, 564, 685, 3928, 1236, 2847, 2210, 1687, 3664, 1334, 505, 1626, 1099, 2665, 1979, 1162, 2926, 3272, 3448, 2678, 451, 33, 3907, 3902, 3330, 19, 1079, 80, 3138, 2381, 1227, 382, 2541, 840, 1110, 387, 1853, 1490, 2951, 145, 2301, 357, 1048, 1107, 2675, 2383, 3666, 2155, 470, 4014, 2135, 3161, 3795, 904, 342, 3524, 350, 2284, 1697, 909, 359, 1731, 3523, 387, 2041, 264, 3914, 3948, 3925, 190, 2732, 632, 2005, 1122, 3617, 1365, 549, 771, 1474, 596, 1180, 3010, 2338, 3370, 1831, 3587, 852, 1817, 2651, 47, 3098, 2770, 1057, 1928, 2144, 2806, 3579, 2782, 2034, 2427, 1291, 500, 513, 3814, 234, 2210, 3775, 3152, 1666, 3742, 3296, 2356, 3549, 1893, 212, 1114, 522, 1061, 1979, 573, 175, 801, 4003, 1544, 1211, 2206, 3363, 2396, 2386, 3799, 3056, 3405, 2890, 3547, 691, 1703, 15, 892, 1694, 2493, 2372, 3872, 1738, 2957, 3809, 1812, 2487, 1638, 3579, 3402, 3956, 480, 2286, 1830, 762, 2570, 3974, 1499, 866, 365, 3997, 3380, 2120, 2081, 3312, 3330, 2933, 956, 1713, 325, 725, 571, 2945, 1194, 1794, 2092, 56, 440, 866, 3912, 1559, 2240, 2821, 468, 2306, 1458, 1251, 3289, 2973, 4019, 2606, 3150, 3373, 137, 3952, 87, 1901, 693, 3246, 984, 2855, 3197, 1823, 1718, 592, 2910, 2104, 1239, 2914, 1000, 1279, 2362, 1746, 46, 2141, 1779, 1897, 3671, 327, 3497, 2581, 3095, 610, 2989, 1649, 13, 272, 524, 638, 2994, 891, 2170, 2058, 1858, 1193, 298, 381, 912, 4065, 3097, 1395, 1422, 1379, 840, 4021, 409, 1774, 3787, 885, 3722, 3736, 847, 2960, 1665, 3189, 3073, 3322, 389, 2699, 1532, 3410, 1190, 2840, 3088, 2814, 232, 2116, 1106, 3326, 3378, 992, 3800, 2961, 1442, 612, 3669, 3813, 1154, 3506, 4023, 1363, 2725, 1540, 1223, 1874, 2312, 152, 2790, 1914, 3866, 1696, 783, 3166, 20, 594, 491, 2393, 1861, 380, 3461, 1897, 2702, 3319, 3629, 694, 1144, 3101, 1731, 72, 1920, 3360, 3147, 548, 2859, 1259, 2027, 3589, 824, 3687, 920, 1368, 1368, 3221, 2875, 3355, 2973, 2725, 2726, 416, 278, 3691, 628, 784, 882, 357, 537, 83, 567, 527, 3139, 3407, 3828, 2106, 3365, 1411, 1315, 1126, 3533, 965, 2954, 3461, 2616, 930, 1479, 3080, 3346, 1357, 2132, 1897, 733, 2692, 3759, 157, 3061, 778, 2368, 47, 1440, 99, 2966, 2118, 3697, 1071, 2161, 1584, 3877, 1490, 167, 3559, 3986, 846, 2799, 1113, 385, 1713, 1103, 2415, 2870, 2760, 3743, 1160, 1652, 3717, 1220, 2963, 3695, 1258, 2725, 3002, 2878, 2969, 3912, 2103, 1180, 3364, 1282, 265, 1101, 3724, 653, 1936, 120, 504, 3396, 1258, 1164, 2404, 1663, 2762, 2620, 725, 2761, 3974, 281, 3750, 1992, 800, 4086, 3131, 622, 3428, 2546, 1425, 2701, 2506, 387, 888, 2200, 3797, 2497, 729, 491, 3056, 2551, 2069, 3109, 619, 1270, 1065, 1156, 2858, 3689, 544, 25, 3607, 962, 2619, 3646, 2630, 3584, 1568, 4056, 2719, 1311, 240, 3135, 1418, 3882, 2283, 2350, 2282, 2653, 535, 2353, 1753, 426, 3670, 895, 790, 4012, 2015, 20, 1377, 1751, 3766, 2880, 2592, 2221, 3827, 3265, 1853, 2626, 386, 1152, 1253, 2248, 3022, 3100, 2583, 3594, 3005, 305, 763, 1900, 3586, 1420, 3764, 3409, 3350, 702, 3006, 1295, 2536, 3861, 316, 1799, 3607, 1549, 3062, 3889, 382, 1522, 1958, 0, 615, 3945, 176, 1396, 1460, 2466, 3103, 1084, 3432, 3974, 679, 633, 2394, 1315, 2340, 2468, 2313, 593, 826, 2208, 2174, 1703, 2257, 1362, 2386, 3259, 4030, 40, 1712, 822, 897, 1077, 3296, 789, 1724, 3157, 3960, 2695, 3184, 596, 170, 2896, 951, 2324, 1142, 3511, 222, 3879, 2165, 2550, 1405, 563, 2455, 908, 1008, 491, 2941, 1339, 628, 3987, 1138, 3106, 3479, 2494, 3413, 466, 325, 2894, 2666, 1447, 3637, 1078, 2397, 4012, 1901, 2254, 3845, 3168, 1806, 3936, 3964, 2905, 2034, 1266, 867, 94, 2559, 3350, 2450, 3544, 1399, 3779, 3385, 3681, 3252, 1804, 2338, 58, 2735, 2052, 2685, 3857, 1910, 3362, 3416, 3010, 3875, 4086, 3285, 3676, 3119, 307, 1639, 4021, 3447, 826, 2653, 116, 1095, 2644, 276, 1692, 1885, 943, 2435, 1701, 1486, 3120, 2963, 1477, 272, 241, 1139, 1922, 2680, 500, 2606, 641, 2280, 2780, 1346, 1928, 3610, 1290, 3529, 763, 2610, 3186, 29, 2069, 1395, 648, 1275, 3075, 1166, 93, 2176, 2766, 3542, 285, 3614, 2009, 622, 1979, 477, 1019, 690, 1647, 1456, 626, 2606, 1548, 1798, 2992, 1240, 3299, 3715, 2224, 2430, 3408, 3704, 2881, 2062, 29, 2853, 1880, 1687, 565, 3742, 830, 2352, 3809, 272, 597, 2836, 1757, 1397, 2483, 1248, 241, 1271, 624, 3966, 3449, 164, 3920, 1169, 1017, 2367, 2366, 2536, 1020, 2915, 528, 301, 150, 3564, 52, 233, 3212, 3901, 3786, 2932, 1771, 203, 3616, 888, 2200, 387, 1997, 1685, 1989, 1839, 339, 856, 3263, 2374, 14, 1971, 516, 2133, 413, 3668, 992, 3227, 1725, 3076, 1038, 3898, 698, 3497, 1126, 353, 2672, 2468, 1999, 736, 368, 3508, 2257, 2736, 2289, 3722, 724, 4088, 3674, 1934, 1088, 1325, 873, 1996, 2337, 3123, 2303, 758, 1637, 5, 469, 1346, 2475, 285, 3985, 3828, 2794, 1430, 3782, 2122, 3762, 1580, 283, 3385, 446, 3724, 276, 3079, 3808, 3784, 515, 3306, 212, 3570, 2072, 1007, 172, 3394, 1284, 2776, 2708, 2855, 2232, 293, 1509, 2229, 2948, 3565, 790, 3326, 2619, 2789, 3151, 3163, 1643, 36, 1857, 286, 1102, 197, 1916, 1159, 3315, 669, 1064, 2263, 3423, 2299, 1541, 3293, 3190, 266, 2356, 1944, 1156, 3258, 2284, 189, 2072, 1560, 1537, 1339, 2216, 2822, 2415, 1805, 2033, 105, 3243, 2946, 508, 3003, 1301, 2565, 3661, 653, 3446, 1783, 2043, 2992, 3607, 2598, 2285, 1018, 1928, 746, 3388, 2860, 1705, 2381, 2981, 905, 1906, 2769, 3388, 1628, 3926, 628, 2553, 3304, 2707, 3964, 1276, 1073, 505, 30, 1975, 1791, 2399, 3669, 3139, 3380, 2203, 2186, 3540, 3374, 3966, 3664, 2506, 51, 583, 3772, 2528, 455, 1397, 357, 2863, 3707, 2504, 1347, 813, 794, 2631, 1849, 3149, 2087, 3574, 873, 1171, 2315, 2090, 3975, 3216, 3135, 100, 1477, 796, 1117, 3934, 539, 3159, 3321, 1064, 3645, 3498, 412, 136, 977, 2169, 2919, 3979, 3813, 705, 1569, 754, 3366, 3588, 3319, 2905, 3931, 1534, 3562, 3918, 2910, 2692, 2972, 2276, 1511, 2207, 3469, 1837, 112, 1834, 134, 625, 3111, 2019, 1008, 3074, 485, 3824, 1188, 3153, 2365, 2095, 733, 752, 2802, 856, 3186, 1570, 984, 1777, 3888, 915, 3516, 2412, 1974, 3951, 1997, 3094, 102, 1089, 467, 2482, 1276, 2214, 2904, 632, 2143, 2399, 3148, 1821, 615, 3664, 736, 1750, 3711, 3234, 499, 3186, 1739, 3116, 2954, 1521, 3313, 3733, 3303, 811, 891, 60, 45, 2538, 3811, 1167, 2870, 1901, 3917, 1563, 3600, 2767, 1159, 1730, 1057, 3642, 3816, 1410, 2454, 2882, 2862, 3504, 3133, 4002, 1175, 1647, 1821, 63, 2213, 1510, 3589, 238, 855, 1066, 3881, 525, 1648, 3900, 3292, 3236, 2790, 3051, 1893, 2508, 1939, 3119, 696, 3476, 2837, 369, 3864, 3930, 1517, 1936, 772, 1087, 1474, 3235, 2748, 1031, 3331, 3918, 2251, 2372, 1070, 459, 1443, 39, 2181, 1996, 404, 3776, 188, 3824, 153, 2603, 2290, 3055, 940, 3347, 3557, 784, 2874, 2883, 1069, 873, 3336, 1748, 1808, 1157, 3573, 1609, 3642, 3321, 2752, 1502, 885, 1902, 2952, 2652, 3771, 890, 2693, 3611, 4063, 768, 3067, 1289, 953, 2444, 2080, 2507, 1314, 1416, 3973, 784, 2381, 3434, 299, 2503, 3264, 241, 3197, 1563, 3546, 1175, 605, 1909, 3716, 2100, 751, 2922, 476, 3525, 400, 1373, 3196, 3438, 308, 2275, 3055, 1421, 2374, 3012, 1502, 3544, 606, 375, 967, 1702, 4077, 1595, 431, 2694, 1628, 2753, 1461, 1864, 1297, 1993, 3735, 419, 259, 2181, 3119, 2769, 164, 2909, 1560, 924, 191, 2291, 3490, 344, 2622, 3333, 3353, 2625, 1252, 3357, 1031, 3355, 964, 3235, 2084, 2270, 2328, 3298, 3094, 2726, 427, 726, 1507, 3276, 50, 2672, 874, 3340, 182, 2114, 3779, 445, 2129, 3458, 1631, 3404, 3507, 2435, 2036, 2468, 1707, 3182, 2163, 234, 1273, 3850, 1735, 804, 1003, 1622, 2210, 1421, 415, 2389, 3226, 1590, 608, 3048, 953, 3174, 3727, 1385, 1924, 207, 2907, 80, 3064, 2727, 3049, 2231, 393, 2721, 1458, 1754, 3241, 3474, 1290, 3259, 1867, 3359, 2181, 2580, 3595, 2802, 2805, 294, 2798, 4054, 1287, 2364, 3580, 2439, 569, 600, 2116, 2838, 3621, 2271, 2744, 1514, 3364, 3236, 1679, 712, 1079, 467, 2244, 3143, 2074, 148, 1316, 3086, 3587, 1111, 1267, 2293, 1749, 3630, 1483, 3266, 2349, 2302, 2742, 2983, 78, 1133, 259, 2682, 1023, 2949, 2313, 506, 876, 2205, 3406, 3057, 1390, 1697, 3576, 1411, 1247, 1166, 2886, 1968, 2191, 845, 3670, 3093, 2661, 4050, 1283, 693, 2353, 712, 1157, 1855, 1339, 3373, 1266, 3872, 1760, 4035, 2799, 2047, 2641, 1683, 4035, 1402, 2809, 4001, 510, 2621, 604, 2139, 3714, 2782, 2906, 1002, 2005, 1215, 670, 3754, 689, 450, 2798, 3814, 1191, 1410, 571, 760, 3675, 2778, 3256, 3848, 3710, 3661, 3916, 1597, 539, 4056, 41, 2568, 229, 1395, 1465, 1338, 2840, 609, 174, 2053, 679, 2536, 3098, 2330, 2916, 2713, 707, 3227, 1164, 412, 1317, 3207, 1991, 3536, 1247, 3032, 1823, 3698, 3912, 1922, 458, 756, 3387, 447, 2427, 3568, 65, 810, 2809, 2004, 803, 1677, 1921, 1944, 1081, 311, 2865, 3787, 3312, 1238, 3432, 3390, 550, 1090, 2715, 862, 1411, 3426, 3359, 4027, 152, 2716, 1961, 1673, 336, 1443, 2608, 2776, 3596, 1714, 3300, 1646, 1274, 994, 480, 2957, 3525, 2931, 2765, 3430, 802, 2844, 577, 3275, 3510, 878, 2961, 3145, 934, 419, 801, 1151, 2713, 2467, 3679, 1650, 2361, 404, 1309, 3084, 2084, 934, 3437, 252, 304, 534, 4091, 1845, 3996, 2981, 1548, 1411, 2137, 3605, 415, 131, 1302, 3314, 3127, 2471, 3274, 1210, 857, 1095, 2891, 283, 2241, 1535, 89, 1532, 749, 1521, 1670, 2673, 117, 2196, 3419, 1604, 2234, 3348, 2592, 3763, 2979, 3211, 2026, 2063, 361, 1569, 3189, 3192, 112, 3844, 3779, 1849, 2545, 311, 3808, 2172, 3757, 2978, 1829, 1400, 1267, 1419, 3807, 1238, 371, 2782, 179, 3631, 2455, 551, 456, 659, 644, 1299, 269, 3828, 1482, 1204, 1856, 3598, 165, 2338, 664, 2067, 1257, 2888, 2383, 2971, 2652, 1987, 1473, 2223, 3825, 1305, 679, 2063, 1750, 1563, 1228, 1869, 320, 2125, 1241, 336, 783, 75, 1018, 1413, 3484, 3025, 764, 364, 954, 3116, 3422, 410, 1297, 306, 2247, 1982, 2500, 63, 137, 2543, 643, 1649, 1410, 2818, 1665, 1842, 1910, 1026, 2526, 2251, 3058, 541, 619, 1430, 3356, 566, 292, 720, 1711, 1630, 3512, 1070, 3158, 1777, 640, 1340, 3374, 3085, 1511, 1841, 142, 2042, 443, 2440, 3948, 3013, 3073, 3336, 433, 2162, 1532, 3932, 3402, 2630, 881, 38, 3987, 416, 550, 183, 337, 1592, 1437, 765, 429, 2262, 19, 1372, 1953, 1064, 1416, 3830, 3088, 1300, 3262, 1384, 3175, 3661, 3328, 482, 2547, 3504, 1364, 2978, 1054, 4041, 1995, 1424, 3553, 414, 205, 2801, 2549, 3597, 3001, 3981, 851, 1333, 1955, 2380, 1031, 4067, 1669, 2858, 2752, 1923, 3319, 2558, 292, 3539, 2311, 4012, 478, 820, 1990, 1755, 3947, 3987, 627, 3541, 51, 2078, 3681, 594, 935, 2242, 1397, 960, 1454, 2024, 2062, 3035, 3932, 1978, 246, 1919, 1472, 1783, 274, 2342, 3695, 3296, 1910, 2819, 4052, 2786, 1850, 366, 2166, 2318, 2028, 3502, 2286, 890, 3646, 2660, 112, 903, 1743, 893, 2871, 162, 3132, 4057, 3805, 1677, 3351, 3239, 3312, 2886, 101, 3392, 2417, 508, 3991, 3298, 171, 2256, 1086, 1625, 765, 3143, 1374, 2119, 1712, 1084, 1754, 3838, 2524, 1935, 1189, 1963, 2531, 340, 3196, 1583, 3576, 64, 3328, 410, 825, 86, 2742, 1135, 95, 1494, 1738, 1212, 1994, 2594, 3527, 949, 2121, 512, 108, 4032, 545, 3908, 3907, 3946, 1301, 2403, 275, 447, 460, 1052, 3667, 2953, 737, 2046, 3829, 3652, 499, 821, 3939, 1318, 3821, 299, 2558, 2712, 1412, 2870, 2787, 1982, 2998, 1054, 1194, 4005, 976, 1047, 3914, 3347, 1890, 2229, 2740, 316, 3039, 2343, 4057, 345, 3124, 665, 747, 851, 1633, 2101, 1491, 2606, 3033, 210, 104, 1164, 770, 285, 2040, 3038, 3485, 2534, 2551, 2069, 3475, 3684, 1457, 1065, 3060, 3130, 877, 4037, 3772, 3848, 1637, 3272, 3395, 3288, 3779, 1480, 150, 1890, 1774, 1861, 2575, 1863, 3587, 3521, 2906, 1875, 719, 3588, 177, 2526, 2607, 1496, 1048, 3344, 3040, 1523, 1774, 247, 2264, 1869, 3575, 2160, 1817, 3484, 2469, 3333, 549, 1621, 559, 3290, 2720, 3320, 624, 1252, 999, 2181, 3549, 3147, 2117, 2981, 1631, 412, 1963, 468, 3923, 1742, 2455, 3132, 738, 515, 3990, 1063, 3607, 1108, 3165, 3159, 2298, 1814, 1742, 3534, 797, 3114, 3228, 1899, 3470, 3049, 210, 2891, 456, 360, 318, 4061, 124, 2349, 3885, 2911, 3909, 1556, 1048, 1575, 3136, 2236, 209, 868, 983, 2338, 3447, 1465, 1794, 2386, 1438, 192, 2956, 1829, 691, 1881, 2506, 915, 616, 1154, 968, 1480, 2597, 752, 3630, 1703, 2728, 3655, 1312, 2676, 17, 3612, 399, 3333, 1925, 1136, 843, 4071, 3530, 3162, 697, 2431, 1886, 2844, 3059, 2411, 2620, 1105, 2085, 1191, 302, 3590, 3684, 399, 985, 799, 3419, 3492, 1811, 3948, 3003, 1716, 1983, 2746, 1501, 1704, 1577, 2179, 1495, 1246, 2575, 2565, 794, 2758, 2418, 1904, 3624, 3472, 1564, 2807, 2194, 415, 2158, 107, 196, 317, 1539, 3518, 30, 2482, 3519, 3264, 435, 577, 579, 3061, 3336, 3274, 3834, 1459, 2272, 3788, 1480, 650, 2672, 3007, 3295, 3305, 3097, 3760, 3845, 1926, 2891, 3479, 406, 1156, 2976, 1169, 1398, 29, 1045, 447, 949, 690, 2285, 427, 3152, 1108, 1255, 81, 1684, 2775, 2335, 4001, 4095, 2220, 2634, 3606, 3190, 2142, 3469, 4016, 3339, 3319, 3601, 433, 568, 2114, 3199, 2783, 341, 973, 1220, 809, 159, 1276, 2622, 2360, 1622, 1068, 547, 2496, 605, 2122, 1233, 342, 2986, 1045, 3579, 2605, 889, 1384, 2076, 1694, 232, 1583, 71, 1266, 3246, 657, 1065, 451, 3014, 2886, 2519, 2247, 764, 802, 1162, 3706, 2915, 3425, 1703, 2389, 671, 1168, 2534, 75, 3272, 1498, 660, 3040, 3581, 0, 1986, 2995, 2437, 893, 1699, 2620, 2261, 2862, 2942, 3426, 636, 1151, 851, 3767, 401, 3742, 2492, 1890, 230, 98, 2590, 2630, 3407, 1635, 1123, 2350, 963, 2112, 3690, 3331, 3335, 1299, 2186, 104, 295, 3999, 514, 2520, 2349, 3301, 319, 1735, 3623, 3675, 3599, 3750, 3836, 39, 709, 3364, 2379, 503, 1459, 3406, 344, 3263, 2014, 2875, 3963, 2874, 3090, 2539, 1587, 702, 3103, 922, 693, 1338, 2404, 2891, 1221, 1966, 2732, 607, 2272, 3733, 2842, 1363, 860, 2107, 1548, 3954, 763, 2194, 981, 2590, 1236, 2412, 268, 804, 2164, 2162, 717, 3770, 328, 3936, 1206, 1471, 3472, 3710, 1017, 681, 3775, 2218, 3001, 880, 3455, 1235, 3132, 2867, 3884, 2499, 1348, 2945, 3201, 2179, 835, 219, 1288, 331, 1212, 350, 475, 1556, 1211, 1569, 3457, 2861, 3437, 3719, 1861, 2854, 164, 3322, 3475, 1852, 4013, 184, 3306, 2216, 251, 683, 638, 1293, 2870, 3686, 2679, 2838, 1641, 942, 2886, 798, 3870, 1482, 3763, 3491, 2502, 486, 3487, 1515, 2392, 345, 1461, 992, 464, 2894, 1213, 3331, 1699, 2224, 3072, 3694, 3574, 2486, 797, 1681, 2048, 2598, 1957, 3644, 490, 3576, 1384, 2004, 2616, 3767, 518, 3127, 495, 2299, 2223, 3346, 3286, 99, 575, 275, 2545, 898, 1655, 879, 3094, 3333, 3088, 2306, 1068, 671, 3892, 2806, 3156, 1553, 3736, 2858, 2819, 577, 1664, 1092, 3483, 209, 2874, 1856, 3694, 3121, 703, 3315, 2473, 197, 143, 1599, 2539, 2273, 3454, 2776, 3943, 2195, 447, 4092, 1508, 1545, 1021, 3775, 2999, 1065, 2832, 3560, 1144, 1354, 2636, 1074, 3869, 273, 3087, 2605, 3445, 1659, 2898, 1435, 1853, 2610, 1286, 69, 2687, 624, 2271, 3763, 241, 2390, 2481, 1020, 3890, 1154, 416, 2548, 275, 1860, 1488, 844, 840, 4094, 1882, 1400, 1129, 1523, 3139, 1932, 686, 2609, 3267, 1673, 1294, 1976, 546, 1750, 3271, 2610, 3172, 2627, 2726, 49, 553, 1497, 2073, 3428, 80, 962, 541, 1830, 3127, 1899, 419, 3160, 2766, 358, 3021, 2563, 2984, 3860, 2091, 118, 3346, 3349, 2429, 752, 1955, 402, 1663, 1450, 1031, 1184, 2847, 1668, 3539, 2277, 1709, 1846, 3513, 300, 2514, 2425, 136, 2396, 1031, 3019, 1229, 242, 3367, 3559, 3427, 1753, 3751, 4001, 3624, 2033, 3605, 2445, 2729, 1983, 2619, 384, 1390, 3187, 4057, 511, 521, 1867, 3668, 1059, 429, 2462, 3591, 277, 3334, 2350, 995, 3909, 1764, 1681, 1739, 3728, 2494, 533, 2813, 2913, 857, 3111, 3999, 189, 614, 2814, 1447, 133, 3600, 2727, 415, 3985, 3381, 1216, 744, 3692, 410, 106, 185, 103, 1707, 1705, 798, 2250, 2734, 480, 885, 2214, 299, 2698, 2844, 476, 3046, 2579, 3361, 3764, 3481, 236, 1484, 181, 3982, 941, 1518, 2602, 1491, 1841, 3971, 2285, 2821, 3021, 2005, 2651, 500, 339, 1601, 1338, 3952, 637, 1482, 2456, 2126, 1757, 833, 2311, 3431, 1260, 3707, 3146, 592, 479, 3156, 691, 4059, 1155, 1453, 1661, 1896, 1554, 159, 2780, 3414, 344, 3773, 2348, 3682, 3661, 3518, 766, 1529, 1539, 889, 2024, 1732, 69, 1153, 3384, 1454, 1692, 2608, 1074, 554, 3503, 1656, 319, 459, 3787, 818, 898, 3611, 1958, 3602, 1491, 473, 1710, 1258, 248, 3240, 3315, 672, 3144, 2950, 1824, 2641, 513, 146, 901, 1498, 3589, 3680, 2079, 829, 1766, 3700, 1773, 2085, 1293, 2751, 67, 2422, 3837, 2059, 2487, 3256, 2105, 3692, 3032, 4021, 2557, 1835, 1233, 3204, 856, 2313, 2065, 3432, 2053, 1188, 1006, 258, 1180, 2963, 2945, 685, 3998, 1221, 1124, 401, 1289, 3294, 3242, 2329, 1275, 3904, 3764, 186, 2249, 1938, 1, 1564, 295, 3336, 519, 2899, 381, 1692, 3356, 2822, 1962, 2282, 3153, 75, 2073, 3681, 933, 2756, 3036, 3988, 2965, 2699, 1618, 914, 2763, 2245, 2260, 1252, 615, 2277, 861, 1783, 3218, 4076, 2206, 3180, 2668, 73, 3794, 1797, 3449, 286, 3998, 352, 3948, 2770, 3492, 1024, 1551, 578, 3687, 1581, 2042, 1255, 2900, 2744, 2436, 2558, 1008, 3539, 637, 3507, 1087, 972, 163, 52, 3912, 2183, 1779, 3570, 1358, 180, 605, 893, 3862, 1429, 1903, 942, 664, 1943, 2686, 3152, 2183, 2475, 3684, 884, 3294, 2370, 976, 1762, 2570, 1992, 3801, 3223, 959, 628, 2185, 2188, 3524, 2792, 1329, 1988, 604, 3675, 2384, 2193, 3032, 1832, 3657, 3748, 221, 1239, 2396, 1441, 3107, 3319, 4040, 3374, 3972, 91, 3572, 1107, 112, 2605, 2915, 3079, 3785, 3499, 3334, 2974, 363, 736, 3303, 187, 1264, 1632, 2033, 2685, 3329, 1393, 438, 1846, 1130, 1729, 4063, 550, 3523, 2805, 892, 1671, 3616, 1704, 2104, 3136, 2765, 277, 1175, 1510, 1184, 511, 3614, 1287, 924, 1159, 2434, 821, 3583, 371, 4090, 776, 1817, 878, 4005, 1931, 3280, 3019, 3990, 2607, 501, 2503, 1867, 3824, 1790, 2369, 2727, 3652, 3745, 1863, 3105, 3146, 2373, 439, 3465, 1424, 319, 1459, 413, 380, 947, 2044, 745, 3534, 1908, 428, 3894, 2104, 3704, 3408, 3861, 1082, 4087, 1702, 199, 879, 1070, 342, 744, 2372, 2351, 3727, 1456, 2514, 1824, 2250, 2351, 2008, 2753, 3434, 339, 1188, 374, 3939, 1362, 3538, 2745, 3782, 4026, 343, 1323, 792, 418, 1401, 1399, 1983, 2588, 3081, 1470, 1197, 933, 199, 2569, 2166, 2734, 3900, 236, 4061, 3666, 2307, 1172, 3058, 1772, 53, 811, 3859, 2768, 1940, 2584, 604, 2292, 1699, 2673, 3504, 3055, 2804, 927, 3432, 1630, 314, 3730, 791, 3332, 1327, 1612, 1968, 3679, 2636, 2829, 367, 2614, 3821, 1993, 2782, 3515, 3264, 2766, 3519, 3394, 3023, 1112, 970, 3721, 1984, 1510, 145, 581, 295, 144, 3675, 2820, 277, 806, 655, 2736, 637, 695, 1140, 2657, 558, 875, 1715, 1660, 4079, 1582, 916, 680, 2374, 2288, 2776, 2670, 22, 3042, 1901, 2255, 431, 145, 3436, 3466, 1830, 310, 2078, 2234, 179, 3811, 10, 428, 2036, 2938, 1676, 2197, 3089, 3737, 3255, 1444, 2678, 1680, 1401, 2604, 2499, 2254, 1197, 4034, 2691, 4031, 1008, 1264, 3700, 1643, 995, 2547, 147, 2124, 3449, 479, 1565, 867, 2444, 4011, 2097, 2166, 3182, 460, 2594, 3086, 3243, 1938, 1604, 2449, 2999, 906, 1399, 3618, 3778, 3896, 1115, 372, 1900, 3417, 2436, 2341, 1781, 2788, 2374, 1919, 2986, 437, 4023, 150, 598, 3677, 3103, 1075, 3741, 1820, 2060, 2760, 709, 802, 2680, 1119, 3727, 3394, 2539, 3836, 3045, 2802, 244, 3692, 764, 496, 3563, 2155, 3942, 1710, 255, 3398, 2916, 2295, 547, 2409, 622, 186, 2031, 3645, 2826, 3212, 1780, 3092, 2103, 2698, 2560, 3001, 1589, 3600, 15, 870, 3853, 2184, 3663, 1867, 2712, 3526, 3182, 4033, 3006, 3020, 1729, 2797, 2736, 1557, 1449, 102, 517, 2669, 2205, 297, 3151, 1472, 2677, 2633, 562, 3173, 354, 3784, 3916, 1687, 755, 3441, 1955, 4014, 3131, 1832, 2153, 2965, 312, 3577, 762, 1600, 2056, 265, 3423, 1355, 758, 1518, 3130, 3258, 624, 390, 3303, 2921, 359, 3877, 467, 979, 1121, 1589, 347, 2076, 3228, 1210, 1267, 3806, 47, 3168, 2277, 1103, 651, 4087, 3018, 2321, 1483, 3257, 2880, 984, 1072, 3939, 3204, 2268, 2075, 2872, 1583, 1719, 2682, 1975, 2790, 2972, 1651, 1319, 2914, 3560, 2538, 2818, 1252, 1712, 308, 2179, 842, 221, 2146, 496, 795, 2936, 715, 408, 2582, 3635, 2480, 2295, 3355, 2629, 2699, 206, 1521, 3584, 2820, 3222, 2541, 1702, 2266, 3950, 3751, 1298, 1106, 2187, 2202, 3118, 3053, 3303, 3319, 3400, 164, 1530, 1726, 3379, 1684, 2538, 1066, 458, 2123, 2180, 2054, 790, 2639, 2353, 3908, 3097, 3644, 1002, 2116, 2338, 774, 4095, 3524, 2006, 2752, 2036, 3183, 2794, 2073, 4027, 3923, 541, 3209, 1818, 710, 3430, 3439, 785, 3087, 666, 1737, 3173, 3193, 749, 1408, 4076, 24, 3068, 888, 1438, 22, 2340, 2863, 2910, 2611, 3736, 1081, 2084, 1641, 2790, 1235, 3489, 4060, 1485, 1013, 254, 2576, 3872, 2527, 1784, 737, 2116, 186, 1378, 2282, 3652, 2829, 3907, 3537, 696, 2574, 2257, 1261, 217, 200, 737, 2764, 1285, 2482, 1530, 2878, 3897, 1305, 4074, 849, 1802, 3529, 3939, 2179, 1423, 2004, 1795, 256, 543, 209, 2038, 1115, 3887, 525, 183, 3260, 1211, 1575, 642, 2627, 1991, 3111, 1193, 3403, 1706, 3835, 3671, 3784, 0, 713, 2619, 3963, 2934, 1795, 1535, 945, 3160, 1182, 3191, 2511, 2946, 1952, 1198, 470, 1585, 1844, 2794, 2907, 638, 2590, 606, 2920, 329, 1781, 2350, 3057, 4006, 4005, 3921, 3271, 3561, 1718, 98, 993, 1719, 409, 2694, 974, 1791, 3438, 3681, 44, 2648, 4066, 2975, 2086, 714, 1143, 482, 619, 989, 508, 2959, 295, 1668, 2088, 2017, 1153, 3014, 315, 298, 3302, 1550, 1810, 2364, 4006, 1456, 2575, 1665, 2632, 1738, 3169, 3851, 3524, 1374, 2545, 1611, 3342, 3136, 78, 2614, 3381, 827, 1159, 2913, 999, 1959, 1933, 2505, 416, 3108, 2245, 2492, 541, 3765, 770, 2983, 3062, 1327, 562, 1636, 752, 1196, 3490, 2544, 1857, 925, 621, 61, 2823, 1267, 3050, 3208, 1027, 3637, 3961, 2429, 3575, 3882, 982, 820, 1416, 1955, 3306, 2292, 569, 8, 3184, 790, 970, 2183, 739, 1765, 4023, 2727, 149, 3720, 3935, 3027, 3112, 1382, 2436, 4069, 2554, 3058, 2190, 3491, 2099, 352, 3416, 929, 2539, 142, 3204, 124, 230, 1478, 331, 1385, 3675, 1264, 3089, 3628, 854, 3328, 2762, 3711, 3701, 3197, 3747, 675, 3036, 2665, 2215, 3134, 44, 2849, 697, 420, 394, 3837, 3207, 2391, 701, 977, 3194, 670, 2684, 258, 1186, 1010, 4, 1014, 788, 2914, 43, 3261, 1049, 434, 2561, 143, 2318, 387, 1507, 1817, 1726, 3989, 1087, 1436, 1040, 1443, 2049, 2131, 2787, 3792, 3831, 771, 3749, 463, 1344, 1140, 3444, 2856, 553, 2134, 3051, 1885, 1270, 2653, 1342, 987, 4049, 1626, 2115, 3605, 1872, 3189, 1716, 1970, 930, 1331, 3808, 3503, 1221, 3912, 2374, 1336, 4038, 2379, 1868, 853, 1078, 283, 2790, 2035, 3351, 3639, 2988, 2886, 2032, 3606, 3665, 2461, 2093, 2788, 3053, 1423, 3110, 3048, 1223, 2416, 3863, 1039, 463, 3378, 2256, 1249, 2143, 2550, 96, 2387, 3783, 2609, 3504, 1030, 2134, 3255, 2219, 1012, 3488, 2299, 2072, 293, 661, 2853, 1173, 1087, 3978, 1351, 833, 863, 2937, 2287, 1694, 185, 3881, 606, 2832, 1946, 3538, 3759, 1512, 3655, 3015, 1728, 3877, 3042, 3514, 2435, 2360, 1868, 1602, 4026, 1377, 3136, 2672, 826, 1663, 2369, 3037, 782, 1272, 1970, 1743, 1619, 1786, 303, 3161, 2919, 871, 3113, 1774, 97, 508, 1328, 1541, 1604, 3483, 2654, 2018, 3470, 1493, 2528, 3542, 1327, 1098, 3934, 1703, 3496, 3119, 2627, 2762, 2429, 2636, 1138, 1513, 2034, 2812, 2459, 2210, 425, 574, 299, 1087, 2215, 3450, 1190, 1789, 135, 2081, 455, 4056, 3251, 1607, 3775, 1454, 1705, 2814, 3265, 217, 3, 1060, 2216, 2395, 1656, 1595, 1602, 460, 2149, 1953, 736, 843, 1547, 1026, 2373, 4000, 2650, 2907, 2725, 3847, 757, 1515, 452, 2496, 2667, 1727, 3255, 1712, 2966, 1221, 1458, 962, 2980, 1890, 1400, 312, 4095, 1576, 2099, 1044, 295, 2921, 1590, 1757, 636, 1683, 267, 3450, 2036, 1225, 3113, 3419, 1455, 2337, 3679, 3922, 3844, 1468, 2915, 3806, 3805, 2116, 912, 2737, 2270, 4037, 483, 280, 713, 3527, 2710, 2762, 863, 2178, 1919, 1628, 105, 1471, 1442, 704, 1851, 2746, 1752, 41, 1751, 3273, 1008, 2463, 1172, 3230, 3659, 2804, 3292, 1053, 3000, 580, 3934, 3884, 542, 2292, 2564, 3110, 2015, 2621, 1214, 1036, 2515, 2173, 2630, 3267, 3546, 3514, 3271, 4073, 526, 1750, 3592, 1754, 2380, 1153, 3405, 95, 4011, 2020, 1663, 1177, 3719, 142, 2535, 3208, 2123, 3406, 2021, 914, 1033, 308, 3794, 3646, 3963, 225, 934, 2504, 1399, 2804, 2828, 3295, 2363, 953, 1096, 3471, 1806, 3419, 3065, 603, 901, 1916, 2382, 3357, 1715, 3789, 2622, 1071, 1306, 2688, 1690, 1829, 1116, 3144, 1259, 3254, 1879, 301, 3859, 1698, 2685, 1870, 2760, 3613, 3613, 1444, 2076, 440, 2023, 1788, 1262, 121, 3225, 3428, 386, 2323, 3429, 3075, 348, 2060, 1634, 3049, 3909, 4027, 4072, 2468, 3288, 3402, 558, 3198, 2195, 986, 2900, 1651, 56, 2525, 3271, 1544, 2197, 2790, 2231, 3607, 802, 1622, 1843, 832, 2514, 293, 2511, 3922, 1997, 1719, 2622, 216, 3815, 846, 3004, 3495, 3834, 3071, 1630, 1906, 2013, 3376, 3137, 3921, 395, 2494, 2337, 2035, 1569, 3417, 724, 744, 3222, 599, 524, 546, 1677, 1402, 3143, 3267, 3495, 649, 43, 508, 3781, 1924, 2254, 3269, 1505, 3827, 2626, 578, 156, 3797, 3243, 205, 2391, 3235, 97, 635, 3955, 3189, 3563, 1390, 4022, 2086, 939, 2092, 3420, 3621, 3007, 308, 594, 3888, 1304, 769, 3055, 29, 1146, 1844, 2233, 1036, 1808, 2100, 1226, 4047, 2882, 2358, 869, 3386, 2598, 1496, 2323, 1391, 3305, 2398, 3654, 2859, 2828, 2654, 1467, 1324, 3824, 2654, 299, 3196, 1392, 719, 3437, 848, 2559, 1530, 1751, 1564, 410, 3306, 8, 1606, 3187, 884, 1121, 952, 20, 2500, 2358, 1511, 2792, 2168, 966, 502, 236, 1198, 2306, 3120, 2648, 1468, 1083, 1570, 3328, 2202, 3503, 2301, 1689, 2654, 197, 411, 2853, 2916, 1337, 465, 1213, 3816, 886, 2596, 3278, 1651, 884, 247, 2111, 2039, 609, 2938, 3790, 343, 337, 3466, 1648, 3401, 1773, 2388, 902, 1781, 494, 785, 4025, 1529, 1182, 475, 2797, 3916, 3056, 2473, 2564, 2958, 1422, 1174, 3304, 2114, 1531, 4044, 1054, 4022, 3762, 1530, 3461, 1685, 3163, 2387, 4018, 2193, 2360, 199, 1631, 3724, 3020, 3828, 954, 1032, 3860, 379, 3645, 2786, 2463, 1753, 1231, 697, 709, 2101, 221, 2409, 2110, 3626, 365, 1182, 1877, 1990, 2806, 832, 3181, 3166, 2717, 2210, 284, 1919, 2192, 4027, 2551, 2268, 315, 827, 2144, 2670, 2176, 3269, 841, 2454, 3929, 3702, 2891, 3569, 3309, 3139, 1189, 1919, 764, 1562, 2308, 3698, 3020, 1080, 3876, 2458, 2006, 899, 817, 3899, 2209, 3701, 1574, 2438, 4062, 289, 18, 2570, 148, 693, 1188, 2208, 1307, 3902, 1977, 1959, 1951, 2275, 938, 1181, 1775, 3887, 1474, 574, 441, 1222, 2310, 1269, 2605, 2453, 1773, 2181, 2804, 797, 1736, 2577, 3008, 914, 2685, 1076, 2700, 1823, 902, 2305, 3470, 3175, 108, 3412, 3616, 2420, 2199, 4092, 3275, 990, 1505, 701, 1275, 3268, 3371, 1164, 3754, 1008, 3885, 1452, 4094, 1314, 1761, 3596, 3601, 2205, 170, 2887, 194, 3883, 867, 2147, 2953, 2522, 2235, 3853, 823, 2410, 1579, 3009, 303, 1500, 390, 3623, 2604, 3236, 832, 1028, 1449, 1260, 60, 2648, 3362, 2471, 2512, 2338, 3937, 1378, 4040, 1570, 1140, 1991, 1641, 314, 2334, 3266, 1115, 265, 4085, 2371, 466, 913, 1758, 90, 1429, 1824, 3339, 3737, 1012, 3001, 606, 1595, 5, 868, 4082, 1739, 4054, 2172, 4040, 2558, 3748, 1492, 3489, 2253, 2202, 236, 1811, 1015, 3208, 727, 3298, 2713, 2584, 2319, 2709, 1022, 866, 1202, 3729, 203, 3264, 3536, 2061, 2214, 975, 325, 1359, 537, 1498, 1970, 1548, 2966, 1270, 2023, 3979, 1819, 3915, 3782, 843, 1629, 2431, 2982, 1159, 1617, 816, 3405, 839, 1052, 3455, 2368, 2166, 3632, 3412, 2858, 3780, 2970, 2778, 1723, 3055, 2784, 623, 1468, 388, 2945, 2901, 2721, 1354, 3972, 847, 1866, 1900, 3012, 2485, 445, 680, 2757, 2857, 3187, 1509, 1167, 2758, 1059, 3738, 315, 2696, 2117, 1473, 375, 3579, 1358, 2155, 791, 4090, 3306, 482, 3610, 2470, 3214, 3567, 2932, 202, 918, 3412, 1539, 3501, 729, 3910, 1347, 2876, 495, 1961, 3256, 2112, 1717, 659, 719, 1956, 2524, 2048, 543, 2059, 1278, 3614, 1111, 3878, 90, 559, 1257, 3773, 1188, 3453, 1227, 3019, 558, 3273, 1221, 2156, 1870, 2230, 3385, 3098, 3831, 3592, 489, 3289, 2113, 2077, 2084, 1284, 3142, 1022, 3146, 3423, 2425, 754, 321, 3610, 2748, 3256, 1006, 3894, 1860, 287, 856, 586, 377, 1519, 3109, 361, 1713, 3696, 3353, 1786, 3454, 956, 197, 3815, 2258, 1568, 280, 3408, 789, 3145, 3822, 2846, 3644, 420, 2041, 1343, 735, 862, 2854, 2206, 377, 519, 3401, 541, 3349, 3996, 874, 2971, 2296, 3015, 3710, 1166, 836, 40, 3630, 1289, 3895, 3266, 3604, 2340, 3944, 3212, 330, 2071, 3784, 785, 2113, 1780, 330, 1932, 2694, 1422, 1470, 3173, 1, 2750, 2793, 1785, 3474, 1665, 682, 1417, 2598, 3681, 3413, 1963, 2036, 1549, 964, 1151, 2297, 1018, 2949, 3807, 421, 3968, 1069, 2339, 180, 3759, 2259, 1033, 219, 3550, 1999, 518, 1629, 3237, 3916, 3005, 331, 111, 3030, 2274, 3982, 2529, 3213, 883, 3290, 3519, 3686, 1196, 4078, 1046, 2002, 89, 3829, 1404, 2506, 2793, 1432, 2688, 937, 3951, 621, 96, 382, 2235, 2449, 3599, 40, 3068, 3035, 449, 2236, 895, 1216, 3463, 393, 1119, 774, 1557, 2652, 1490, 8, 156, 1948, 2229, 2627, 4016, 725, 797, 1766, 3244, 2019, 3, 3259, 1344, 3954, 3155, 1117, 1023, 3632, 2442, 1771, 402, 4004, 2020, 2584, 3263, 3278, 558, 1866, 1237, 850, 1142, 1424, 944, 803, 3838, 965, 3065, 1544, 1081, 4036, 1629, 57, 1596, 703, 682, 1328, 2833, 3026, 3080, 1793, 1885, 904, 3661, 2483, 575, 2824, 3372, 1267, 1381, 3318, 3583, 2022, 2827, 738, 3995, 3541, 2776, 2397, 873, 1058, 622, 1776, 305, 3026, 1117, 825, 4065, 362, 3576, 1733, 2728, 1049, 3031, 3932, 3373, 738, 3059, 894, 3603, 3153, 929, 2496, 3655, 1210, 1192, 2132, 360, 98, 2805, 3764, 3162, 1862, 968, 337, 2860, 1648, 2177, 1527, 2711, 933, 130, 4082, 932, 2151, 2716, 688, 1408, 733, 3478, 2929, 3562, 3754, 756, 2468, 2028, 2424, 859, 1010, 1564, 918, 2609, 3338, 327, 2839, 69, 2331, 570, 2114, 2172, 2003, 2130, 2554, 76, 1905, 75, 48, 93, 229, 2448, 3730, 1311, 1558, 1100, 1109, 2333, 3403, 3173, 906, 3867, 2684, 1074, 3241, 456, 150, 2976, 1194, 2910, 1644, 3368, 2084, 2118, 1974, 1065, 1218, 2153, 148, 407, 2967, 199, 2138, 2797, 2697, 3767, 2689, 934, 1981, 1362, 3430, 2550, 2329, 1878, 3321, 3840, 3840, 3032, 3082, 1763, 251, 3410, 152, 3659, 471, 379, 3958, 918, 2341, 2821, 3993, 753, 1360, 3275, 257, 2326, 2211, 47, 2123, 2802, 3076, 3383, 2767, 4044, 529, 347, 2065, 2731, 1358, 623, 1051, 2324, 656, 1990, 1184, 269, 1034, 3032, 783, 3762, 1545, 136, 3407, 3024, 3762, 2545, 3610, 2618, 1301, 2441, 3753, 1631, 3127, 1082, 553, 2803, 3806, 652, 3003, 3624, 3374, 827, 2332, 3043, 1821, 100, 636, 3456, 3482, 786, 3944, 1213, 3540, 1639, 774, 1936, 2965, 1114, 161, 979, 2259, 500, 339, 3427, 1392, 3149, 3498, 3042, 2227, 3426, 2465, 2463, 3569, 2698, 3727, 815, 1978, 4027, 3731, 3074, 1746, 3427, 2641, 1542, 601, 963, 4092, 1515, 1026, 1418, 1373, 3645, 3029, 3124, 1316, 3160, 650, 2014, 250, 291, 522, 3685, 2323, 3581, 2668, 3461, 1903, 726, 3570, 3535, 1891, 3817, 3672, 2839, 2523, 1440, 3771, 774, 3193, 603, 2152, 791, 2852, 3260, 2358, 3788, 1984, 3132, 691, 3572, 3786, 1766, 2682, 4089, 1367, 3664, 226, 960, 335, 3321, 432, 185, 2717, 904, 4021, 3253, 883, 2708, 3652, 1803, 2535, 2898, 3185, 1757, 2608, 3807, 3304, 1650, 95, 2320, 2360, 2501, 3620, 460, 2427, 1894, 3884, 3262, 3678, 3187, 3703, 2890, 3510, 2508, 3506, 1482, 2844, 38, 2869, 2829, 1174, 3957, 2836, 3461, 804, 787, 3949, 3656, 1031, 2593, 784, 932, 3604, 2727, 3251, 3595, 1635, 508, 2768, 1011, 1625, 2265, 2066, 3521, 1520, 3273, 969, 2508, 2110, 2978, 3439, 996, 1159, 1681, 1248, 2406, 2389, 3772, 3691, 2328, 975, 2452, 4075, 1373, 3119, 144, 2878, 3282, 2608, 1477, 1139, 1717, 3547, 610, 1216, 2700, 3133, 4046, 3919, 83, 2168, 3094, 853, 1712, 283, 252, 3915, 3230, 3498, 182, 3753, 737, 848, 2787, 1243, 1841, 2642, 613, 148, 603, 1319, 1412, 23, 2600, 3050, 502, 3050, 803, 2929, 1726, 581, 3308, 1267, 3620, 3362, 2421, 980, 3302, 3326, 1496, 2722, 721, 213, 2499, 1266, 357, 3977, 2380, 2726, 3916, 387, 1634, 1214, 1199, 937, 1139, 3142, 1819, 1806, 2893, 1410, 1461, 1580, 65, 2667, 1342, 3990, 3178, 3518, 2848, 1082, 1763, 1215, 1735, 917, 673, 3608, 1734, 2567, 271, 837, 2235, 1141, 1008, 3820, 1372, 1357, 3457, 2954, 1407, 1557, 725, 1108, 2728, 3768, 1044, 2432, 3519, 1727, 392, 949, 3916, 1677, 3404, 2953, 2994, 3705, 913, 3561, 1615, 353, 2411, 891, 1749, 3325, 961, 1683, 2340, 3749, 3008, 3429, 1620, 1291, 1126, 3936, 1130, 2093, 2923, 415, 1689, 2718, 3501, 2321, 437, 3923, 1247, 3459, 1580, 1303, 3281, 3978, 3124, 2500, 307, 1104, 3624, 2875, 1593, 2774, 2473, 2258, 1398, 2335, 2012, 625, 2046, 2487, 1705, 3932, 664, 677, 3486, 3408, 1156, 2945, 1790, 3805, 116, 2178, 3672, 157, 1813, 4016, 872, 1284, 3338, 1736, 3507, 462, 1532, 1056, 3079, 277, 227, 1271, 26, 237, 3353, 1760, 2291, 2485, 2505, 3793, 366, 1938, 1061, 306, 2062, 613, 3513, 120, 3337, 3192, 2232, 2040, 2779, 505, 2296, 2759, 2339, 2355, 998, 1157, 1238, 2290, 2557, 2604, 2797, 3802, 814, 1691, 149, 317, 3241, 296, 531, 3354, 2132, 216, 2036, 3167, 970, 1864, 2913, 1400, 2022, 1178, 1547, 2252, 3887, 3372, 2891, 2991, 1148, 2483, 3970, 2601, 2330, 1007, 234, 1296, 1695, 3419, 2555, 3148, 3556, 3738, 1286, 891, 2703, 2248, 2070, 2479, 2115, 117, 2799, 2578, 1776, 3750, 1086, 2832, 357, 2255, 2592, 45, 3677, 1567, 3183, 2498, 1570, 3275, 1254, 2042, 2871, 3231, 3129, 1416, 1000, 2293, 3131, 2502, 1092, 0, 542, 1704, 3851, 3845, 1544, 1727, 1710, 71, 633, 2570, 3629, 3657, 2358, 3878, 1221, 2041, 403, 868, 3301, 926, 2064, 2565, 3570, 90, 4084, 1793, 894, 995, 1467, 1172, 1399, 3252, 781, 965, 924, 1019, 3638, 1065, 3455, 1406, 1746, 573, 311, 3320, 221, 532, 2309, 1130, 2533, 939, 1421, 657, 3705, 3212, 3103, 1173, 3688, 3075, 1133, 2226, 320, 747, 3527, 2887, 488, 2488, 4093, 1945, 1681, 3121, 3419, 3171, 1171, 2596, 3350, 34, 3591, 1206, 3179, 448, 2381, 1603, 3893, 2727, 1213, 1589, 3751, 3135, 2320, 1197, 3561, 979, 1158, 454, 1123, 1382, 1211, 1598, 973, 417, 4054, 3099, 868, 2928, 1304, 1922, 3705, 163, 198, 2588, 1358, 244, 761, 5, 588, 1143, 1971, 1664, 2686, 1817, 701, 1373, 843, 2673, 5, 3751, 4087, 2585, 2729, 2069, 3593, 3778, 1094, 703, 1745, 3848, 1496, 2503, 2361, 3229, 1829, 1990, 1153, 2827, 1502, 1700, 2998, 1576, 2327, 2561, 3394, 2857, 1194, 3127, 4007, 2712, 2496, 1318, 749, 3764, 417, 1424, 2267, 1892, 2643, 3553, 2167, 663, 602, 2012, 2483, 2168, 680, 2298, 3000, 2282, 2964, 1118, 1012, 212, 3580, 1660, 979, 550, 3213, 520, 2193, 3098, 778, 2247, 149, 3918, 2272, 435, 3655, 2034, 757, 3658, 3975, 750, 1093, 3134, 281, 2802, 1691, 540, 3270, 347, 2057, 3011, 2525, 902, 2614, 1601, 4031, 1193, 1497, 518, 2517, 2584, 582, 3470, 3194, 169, 2585, 1950, 128, 520, 2671, 2633, 1625, 1140, 226, 659, 2115, 136, 2877, 49, 1997, 506, 414, 2770, 115, 2179, 3782, 3842, 320, 1971, 2831, 2939, 2738, 3817, 3842, 334, 659, 2209, 2743, 3684, 1849, 35, 135, 2714, 3415, 2177, 3954, 994, 1156, 1261, 2638, 2705, 970, 1881, 1598, 3510, 2575, 3446, 2119, 3459, 1159, 1313, 2481, 2671, 3672, 405, 3341, 2765, 3680, 2994, 1959, 3758, 2053, 16, 3149, 281, 2375, 2093, 854, 3672, 2440, 2287, 3307, 1781, 3308, 2076, 2253, 543, 2298, 2325, 3265, 658, 2345, 3280, 3314, 3829, 1149, 160, 3071, 2907, 2372, 3341, 3083, 1403, 1294, 2897, 2652, 2779, 1463, 2965, 1147, 380, 600, 3035, 1444, 3086, 2736, 1517, 1307, 305, 750, 2847, 2331, 618, 1946, 87, 183, 1848, 1226, 3251, 194, 3452, 4021, 2140, 2334, 843, 554, 1742, 1898, 4074, 2156, 3526, 3188, 2710, 1179, 416, 78, 2014, 2125, 2916, 947, 226, 367, 394, 3622, 1724, 1251, 0, 1869, 2207, 602, 3091, 831, 2391, 2627, 1544, 3996, 943, 3823, 2530, 3648, 1357, 63, 3442, 116, 2726, 941, 15, 2731, 290, 3225, 3492, 2458, 2976, 3202, 3256, 2926, 3939, 1977, 2476, 1524, 285, 3958, 340, 3795, 3578, 2264, 137, 2770, 1091, 1014, 2443, 2785, 3032, 3673, 2578, 743, 948, 993, 1547, 2625, 2986, 553, 1976, 3852, 2837, 2130, 1407, 1455, 2072, 1017, 2546, 1543, 3439, 1990, 1878, 644, 1018, 1020, 2189, 1290, 913, 2575, 530, 1063, 3247, 2182, 2802, 1690, 3721, 980, 2882, 3925, 272, 2271, 1686, 656, 3293, 3132, 3109, 997, 2194, 2233, 2271, 3195, 3734, 2431, 2333, 889, 4044, 2437, 1633, 3749, 3395, 3573, 257, 277, 1818, 569, 2896, 172, 2082, 537, 1774, 1320, 793, 826, 283, 242, 1909, 3383, 418, 1740, 1634, 2820, 2055, 822, 738, 1561, 3277, 3431, 381, 1447, 3808, 370, 400, 3186, 4055, 3410, 1523, 1674, 3266, 4048, 1048, 3217, 3641, 275, 2845, 3376, 3139, 899, 907, 3755, 830, 585, 2272, 2983, 584, 1586, 4080, 2606, 2872, 2319, 969, 28, 1529, 2357, 1840, 2905, 1695, 1898, 1657, 2198, 2784, 651, 1868, 2892, 2174, 3477, 2821, 420, 3765, 3063, 3517, 2908, 3195, 2303, 2135, 2421, 261, 3069, 2142, 3532, 3433, 1213, 2920, 2417, 511, 2392, 1685, 1907, 2998, 801, 2644, 1377, 2807, 1444, 1867, 2240, 2384, 3072, 3485, 2484, 2356, 797, 1014, 223, 3517, 4068, 1654, 723, 614, 1768, 2867, 223, 1672, 1196, 2516, 3826, 3805, 3716, 1598, 3759, 2405, 3080, 1531, 1342, 739, 1035, 758, 3520, 214, 4012, 378, 2735, 1050, 3473, 3236, 1302, 2683, 438, 3653, 596, 35, 1567, 12, 2940, 2233, 108, 1351, 3488, 1504, 695, 3934, 31, 3407, 2660, 2800, 1876, 864, 4073, 3421, 1454, 2883, 1219, 421, 3586, 3430, 2740, 333, 1415, 3929, 1949, 263, 137, 1563, 1778, 307, 3576, 1019, 3891, 300, 3792, 2135, 35, 2137, 887, 1867, 475, 492, 2906, 846, 766, 2911, 3509, 3518, 3588, 1635, 4034, 3537, 2834, 792, 179, 3195, 3687, 653, 3462, 3790, 1889, 2091, 3813, 471, 3145, 2674, 2460, 2865, 579, 3257, 3043, 3, 2265, 311, 2801, 3354, 250, 350, 688, 3339, 1912, 2141, 2508, 99, 829, 689, 2340, 508, 2172, 1271, 278, 2991, 2969, 923, 3144, 4089, 3072, 3707, 1565, 1614, 1983, 2699, 884, 2307, 3634, 3563, 470, 591, 3484, 567, 1659, 2349, 2650, 798, 1822, 346, 2772, 1300, 2001, 1145, 3681, 3902, 3080, 125, 3856, 2206, 566, 3235, 2987, 1215, 1646, 2440, 3619, 2638, 2885, 2363, 1769, 2512, 828, 2755, 2270, 1469, 3017, 1250, 3372, 2351, 3198, 961, 4028, 3092, 434, 2004, 980, 3866, 3809, 3872, 1905, 2812, 3253, 1431, 3992, 2441, 4075, 98, 1579, 523, 348, 233, 504, 535, 3654, 1228, 348, 3931, 4064, 1915, 3416, 2961, 192, 1402, 1170, 3403, 2563, 764, 229, 2679, 15, 2220, 397, 2937, 3795, 2551, 2111, 3427, 1267, 2256, 2235, 3123, 2145, 2755, 430, 2708, 1216, 1865, 2515, 3895, 1413, 2713, 2344, 1939, 2496, 1774, 2016, 2324, 493, 1185, 2840, 353, 1349, 3615, 692, 3911, 2183, 212, 2676, 3520, 1282, 2769, 3230, 2687, 2708, 3280, 1864, 2727, 2502, 3497, 54, 900, 4077, 2525, 1324, 628, 1364, 165, 3918, 310, 633, 2096, 2869, 2573, 2248, 2594, 2296, 658, 2138, 1581, 2543, 1340, 1334, 1039, 1543, 1276, 3522, 3359, 3909, 3502, 3641, 1421, 4071, 3546, 2440, 445, 1267, 22, 3713, 654, 1827, 3170, 2115, 1802, 722, 2344, 2553, 680, 71, 3537, 3584, 1281, 3552, 2550, 1555, 601, 1903, 1338, 4093, 3806, 2704, 967, 1996, 3539, 46, 2520, 2991, 3530, 436, 446, 1564, 1373, 1960, 2199, 3006, 3155, 1649, 3931, 2609, 795, 3571, 3398, 105, 3824, 3608, 1889, 3468, 2648, 1544, 1683, 1067, 2945, 3854, 136, 269, 3305, 1831, 3539, 1011, 2937, 1600, 1476, 3158, 7, 3330, 1369, 1655, 621, 52, 1649, 2615, 2702, 1079, 2171, 2177, 576, 1320, 390, 993, 1204, 3090, 341, 617, 394, 3729, 2748, 3044, 3559, 1106, 2639, 1895, 1636, 3351, 440, 935, 3954, 3578, 1815, 4059, 2632, 1080, 1644, 1513, 1613, 2973, 3921, 4028, 2181, 2581, 2354, 3362, 4000, 3953, 1655, 690, 3480, 41, 3375, 3519, 3342, 2861, 1635, 1514, 64, 1538, 3551, 2181, 2320, 3098, 2716, 2844, 82, 1557, 4024, 3099, 638, 324, 3944, 343, 2249, 3485, 2043, 1874, 674, 2755, 1228, 3537, 2483, 3720, 1742, 3373, 3209, 2407, 1364, 418, 3857, 3989, 1503, 3301, 2195, 3063, 3023, 3156, 2470, 861, 952, 507, 3756, 2400, 3507, 2478, 1694, 2491, 1247, 3890, 544, 2535, 2554, 2128, 3626, 1146, 570, 1482, 1353, 486, 2924, 2436, 1914, 3141, 901, 3126, 1613, 2872, 727, 3042, 1193, 3606, 1627, 564, 3812, 2982, 581, 3099, 1116, 3391, 3270, 3774, 159, 2298, 2089, 740, 2022, 1480, 887, 896, 501, 1163, 3001, 3860, 1329, 1504, 1814, 3319, 2823, 814, 2566, 2750, 1425, 718, 2778, 284, 3032, 3230, 1498, 568, 287, 3756, 3810, 3368, 1341, 93, 2, 2851, 3541, 2694, 2162, 1168, 1319, 1803, 2154, 3536, 1937, 357, 3930, 2373, 2757, 539, 163, 2014, 32, 1653, 2103, 1186, 983, 3709, 3157, 2890, 2612, 294, 761, 2037, 2955, 398, 1865, 3191, 3637, 341, 2598, 370, 938, 212, 126, 2742, 3953, 3732, 2745, 2307, 2806, 3211, 3549, 3045, 2085, 1500, 2028, 3665, 3930, 995, 584, 2879, 1070, 1806, 293, 1422, 436, 3930, 3934, 1591, 1350, 1150, 603, 1582, 2075, 1442, 2359, 2024, 2507, 1089, 2288, 4077, 2100, 2651, 1271, 1770, 2707, 2684, 1762, 3165, 2959, 1196, 2769, 3655, 2330, 3405, 2374, 688, 600, 3830, 122, 2101, 1469, 2254, 3085, 3748, 2260, 2302, 2194, 1222, 3541, 404, 3265, 1641, 1889, 1214, 2164, 2255, 1965, 2534, 2639, 893, 3194, 857, 863, 874, 1513, 142, 2235, 3324, 1293, 3383, 1893, 3595, 2175, 1923, 2082, 3739, 1413, 559, 2377, 993, 615, 1300, 2702, 181, 2977, 1676, 3957, 3205, 3887, 2576, 740, 1626, 2442, 2454, 2323, 236, 3956, 1367, 1755, 2829, 2845, 1064, 2454, 225, 1884, 409, 2281, 74, 3392, 3532, 4043, 926, 124, 3664, 2955, 2409, 1623, 1668, 3046, 2553, 1489, 2489, 1505, 3222, 1723, 3707, 3126, 903, 2909, 4039, 3788, 3784, 1789, 3462, 1701, 281, 327, 1793, 442, 2091, 226, 1581, 2569, 3522, 1734, 3760, 415, 3790, 1654, 2457, 432, 4017, 3719, 697, 1134, 887, 939, 3774, 1758, 2237, 571, 3516, 1878, 3395, 49, 770, 2921, 1947, 1274, 3320, 2803, 3394, 2364, 1055, 3670, 2201, 3323, 348, 2807, 3760, 3380, 3244, 3755, 2920, 816, 1128, 2186, 1412, 2330, 283, 1328, 3816, 2936, 326, 3393, 2019, 3578, 3227, 3988, 3495, 2334, 3692, 2704, 2223, 399, 1589, 104, 147, 1800, 1976, 142, 3297, 3626, 1182, 128, 113, 1260, 3509, 288, 3471, 148, 3128, 256, 3471, 3030, 144, 748, 1376, 3105, 1814, 4004, 1459, 1731, 302, 645, 1571, 1506, 337, 3621, 369, 600, 704, 24, 3534, 3277, 1330, 3179, 708, 1012, 2789, 1300, 263, 1592, 1781, 2391, 1455, 3517, 804, 1793, 307, 223, 3566, 3950, 2744, 1123, 758, 860, 502, 4046, 1208, 615, 1980, 3307, 2325, 615, 3741, 1469, 813, 3251, 2858, 998, 3851, 3237, 3199, 2839, 3333, 391, 1168, 615, 268, 995, 1418, 1102, 704, 3688, 3820, 3884, 2884, 2492, 3623, 1084, 1195, 3099, 144, 933, 3673, 1185, 518, 1182, 3411, 3495, 1733, 3179, 2167, 541, 1914, 2273, 523, 1821, 443, 1140, 1834, 3370, 2432, 3263, 3095, 2308, 3539, 2412, 1881, 755, 1989, 2722, 1226, 3767, 4027, 257, 1643, 3099, 488, 2869, 1098, 3583, 3549, 2135, 3291, 1611, 3930, 1809, 2244, 2252, 1052, 4059, 790, 1079, 2368, 2129, 4054, 2347, 43, 898, 3757, 2130, 3312, 3395, 1272, 1172, 1094, 947, 2330, 746, 3752, 3588, 1761, 3692, 2945, 472, 3483, 3398, 3816, 2820, 2502, 2982, 136, 660, 1419, 2644, 2460, 1497, 2678, 1558, 3288, 1590, 2194, 2241, 1614, 1119, 2787, 343, 354, 2385, 3570, 1726, 870, 92, 3224, 3779, 847, 262, 1439, 845, 2718, 361, 1138, 2015, 2785, 3687, 928, 3412, 1217, 1686, 3761, 395, 2227, 1462, 1247, 2660, 3829, 2865, 3884, 1463, 707, 3463, 3719, 3795, 2111, 3849, 106, 2472, 2784, 1991, 2549, 69, 1082, 701, 1615, 812, 3185, 3477, 1863, 974, 3123, 1781, 2099, 334, 3202, 2102, 3232, 608, 2346, 4011, 333, 1780, 3664, 1437, 1153, 3435, 891, 2058, 3794, 2148, 1471, 3852, 664, 3343, 2597, 1115, 1699, 2967, 996, 921, 3440, 274, 1543, 2622, 1042, 658, 1592, 3392, 1013, 395, 2497, 2823, 1157, 3042, 574, 1640, 2153, 2421, 3952, 3140, 2187, 3620, 287, 1472, 1119, 377, 3477, 2197, 1857, 1197, 975, 3403, 1019, 3998, 3605, 2186, 507, 3352, 2897, 1644, 3896, 1442, 3601, 3740, 2677, 103, 2218, 2406, 3764, 3201, 564, 3186, 3924, 1450, 536, 1439, 1108, 3089, 3282, 3815, 1979, 1284, 982, 1046, 977, 3455, 1114, 202, 2277, 4090, 2294, 3263, 3535, 825, 2776, 1233, 447, 1541, 1651, 551, 1331, 529, 1696, 1327, 2353, 328, 696, 2843, 626, 3223, 2783, 1426, 464, 571, 298, 3849, 2550, 526, 1985, 132, 1862, 3350, 2859, 1884, 2524, 1965, 3898, 3877, 2467, 3335, 549, 3567, 1398, 1751, 1515, 77, 1049, 1320, 920, 1859, 3415, 1225, 1201, 3093, 3333, 101, 4038, 2936, 4070, 1361, 3343, 1625, 2622, 3183, 3939, 783, 3397, 2144, 4072, 4095, 2984, 1796, 2630, 397, 3716, 2338, 1260, 2846, 932, 2827, 3186, 365, 692, 1179, 2392, 413, 3127, 1338, 505, 3017, 166, 1851, 524, 2868, 397, 243, 3938, 920, 3634, 2380, 929, 1921, 1849, 935, 214, 1541, 2707, 3702, 97, 900, 2405, 926, 4082, 907, 2865, 338, 3027, 1781, 196, 1888, 2892, 174, 281, 3946, 917, 1187, 1687, 3317, 1476, 425, 3539, 2905, 1130, 3828, 313, 1080, 2232, 366, 1450, 1465, 2951, 3460, 1728, 889, 54, 1967, 3369, 3036, 1206, 1533, 4081, 1954, 3773, 3615, 1043, 1055, 3535, 607, 639, 2260, 1630, 3516, 2324, 5, 3640, 3507, 3402, 3781, 2678, 3236, 2007, 1333, 2416, 3018, 2053, 1117, 2187, 2454, 1465, 4033, 257, 112, 2953, 318, 3413, 1323, 1554, 90, 2334, 3796, 1106, 3857, 1786, 663, 4022, 3669, 2818, 796, 2350, 3209, 3718, 1475, 1941, 3821, 3260, 3593, 1801, 2853, 115, 3022, 2161, 3031, 3039, 848, 628, 708, 1345, 1966, 3416, 1804, 1840, 1184, 2923, 1777, 3615, 1409, 2855, 1150, 207, 2947, 3115, 3461, 3503, 1212, 4012, 453, 1516, 2764, 2709, 1720, 717, 3936, 4022, 46, 199, 1475, 3720, 2513, 3950, 2154, 1579, 2590, 1392, 2278, 3645, 1575, 1305, 3396, 3434, 1312, 1753, 1964, 3274, 3542, 1037, 625, 3322, 880, 2102
title_screen:
%ifdef USE_TITLE_SCREEN
%include "sim86_title_screen.dat"
%endif
end:
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 3927777066, 3641906217, 3591178777, 3591112211, 3591309848, 3591705904, 3592563549, 3592894067, 4280957820, 4280957821, 4280958076, 4280892286, 4280892540, 4280958335, 4281024128, 4281024129, 4281090179, 4281090179, 4281090692, 4281156228, 4281156230, 4281090437, 4281090437, 4281156230, 4281221766, 4281156230, 4281090436, 4281090436, 4281090436, 4281090694, 4281155974, 4281156744, 4281419147, 4281550732, 4281616525, 4281747854, 4281879697, 4281945491, 4282011028, 4281945232, 4281943689, 4282533245, 4283056498, 4282204535, 4281215826, 4279044386, 4279241504, 4280161574
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4246609438, 4246609442, 4229635635, 4229107489, 4229237527, 4229828120, 4230287646, 4230551339, 4230357060, 4230294624, 4281089406, 4281023871, 4280892542, 4281023870, 4281089920, 4281024129, 4281089923, 4281090178, 4281221765, 4281221766, 4281222023, 4281222023, 4281222023, 4281222023, 4281222023, 4281222023, 4281156232, 4281222023, 4281156230, 4281156231, 4281222025, 4281287818, 4281288073, 4281288331, 4281485199, 4281616782, 4281616783, 4281616526, 4281616269, 4281550474, 4281418373, 4281154424, 4281283694, 4283971934, 4283245371, 4283706180, 4284821574, 4285018950, 4283313474, 4279899177
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280229668, 4280426551, 4280751654, 4282063400, 4283310642, 4284558399, 4284493379, 4283115330, 4281279566, 4281088891, 4281089922, 4281155459, 4281155454, 4281221764, 4281155972, 4281221254, 4281287301, 4281353096, 4281353096, 4281222023, 4281287816, 4281353610, 4281288073, 4281287817, 4281287817, 4281353610, 4281287819, 4281288074, 4281353356, 4281353356, 4281419407, 4281485198, 4281485454, 4281551248, 4281616785, 4281550733, 4281353352, 4281155458, 4281023870, 4280892281, 4281022323, 4282792044, 4287120228, 4284490297, 4286264392, 4285342259, 4287379272, 4289287530, 4285218390
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280426275, 4281804088, 4283442487, 4285148736, 4286198858, 4288301668, 4287972704, 4287577949, 4282788433, 4281219964, 4281286786, 4282404747, 4286547118, 4285823912, 4284639644, 4282601357, 4282601360, 4281484425, 4281419145, 4281484936, 4281550730, 4281682060, 4281550476, 4281484940, 4281550733, 4281484685, 4281419404, 4281550476, 4282403205, 4281681805, 4281550991, 4281550991, 4281419918, 4281617043, 4281748116, 4281616526, 4281353094, 4281286531, 4281155200, 4281154428, 4281547126, 4287386497, 4289418615, 4287707220, 4290205810, 4288758361, 4289087325, 4290534259, 4289224055
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280229406, 4280819748, 4283771963, 4287052110, 4287511120, 4289418349, 4290403962, 4289285227, 4290338943, 4285614969, 4281482882, 4281418117, 4284179349, 4284310935, 4284902558, 4286348969, 4285231520, 4287270581, 4284574367, 4284442783, 4286416308, 4284180380, 4285495464, 4284969123, 4284837540, 4284180123, 4283128472, 4282468999, 4284636293, 4284243855, 4284181154, 4282273939, 4282208401, 4279046170, 4278783256, 4278848792, 4278980121, 4278717207, 4278717206, 4281286786, 4281220736, 4282071154, 4287714173, 4290338177, 4290665853, 4290202473, 4290729843, 4292507281, 4290795894, 4289684611
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280229407, 4281082662, 4285413447, 4288628061, 4290140018, 4290007919, 4290205042, 4290797438, 4290997389, 4284370317, 4281483656, 4281418120, 4283982489, 4284376216, 4283192460, 4284376217, 4283719318, 4286547116, 4282470028, 4283850901, 4286087855, 4285167014, 4282405010, 4278783000, 4278782999, 4279506205, 4279769117, 4279768860, 4279834654, 4283852192, 4284180638, 4286350514, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4278717207, 4278717206, 4281351809, 4284499582, 4284102760, 4288500352, 4290862978, 4291254393, 4291254905, 4291848326, 4291062407, 4286731906
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4278519045, 4278519045, 4278519045, 4278519045, 4278519045, 4278519045, 4280229407, 4281213991, 4286070608, 4290008687, 4290928763, 4291191423, 4291191166, 4291061124, 4287124865, 4281811079, 4281352584, 4281352583, 4281680774, 4284179353, 4284047766, 4284442783, 4282404237, 4284640929, 4285889708, 4286481585, 4285166760, 4285824688, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4279768861, 4278980121, 4285232812, 4284800100, 4284800100, 4284800100, 4286219706, 4283392420, 4284800100, 4284800100, 4284800100, 4278782999, 4281615754, 4282664326, 4279110678, 4279110164, 4290536075, 4292045453, 4292243856, 4292311447, 4289948564, 4283843956
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4278519045, 4278519045, 4281148457, 4285677398, 4280225299, 4280356885, 4291585155, 4291256704, 4288762736, 4278715918, 4278716950, 4281287048, 4281287048, 4281812360, 4285296801, 4285429416, 4282075784, 4283128215, 4283457180, 4282930065, 4283324822, 4282601873, 4284800100, 4284800100, 4284800100, 4285487220, 4286601827, 4284800100, 4284800100, 4284800100, 4279111962, 4285035178, 4284800100, 4284800100, 4279309084, 4284049574, 4282537886, 4284181162, 4284800100, 4284800100, 4278848793, 4282142874, 4284800100, 4284800100, 4278979093, 4291258514, 4291982488, 4289751698, 4285418876, 4281809274, 4281482612
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4284800100, 4284800100, 4284800100, 4280163870, 4280163870, 4284800100, 4284800100, 4284800100, 4278519045, 4280558121, 4284800100, 4284800100, 4279831828, 4290928254, 4291783305, 4284800100, 4284800100, 4278651413, 4281287049, 4281352842, 4281747082, 4279374620, 4279308827, 4279308826, 4279243290, 4279506205, 4279045912, 4279506205, 4285428385, 4284800100, 4284800100, 4279440668, 4289109689, 4287264656, 4283848070, 4284800100, 4284800100, 4279309084, 4285166762, 4284800100, 4284800100, 4279572255, 4285430447, 4285956274, 4283852968, 4284800100, 4284800100, 4278849051, 4282406561, 4284800100, 4284800100, 4284759930, 4290470540, 4285682572, 4282796938, 4280495466, 4281417864, 4281417342
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4284800100, 4284800100, 4278519045, 4280295721, 4284800100, 4284800100, 4278782484, 4287583876, 4291126662, 4284800100, 4284800100, 4278651155, 4281287049, 4281287306, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4279045914, 4284048541, 4284800100, 4284800100, 4279703582, 4279703326, 4285232041, 4284114592, 4284800100, 4284800100, 4279374877, 4284509610, 4284800100, 4284800100, 4279374878, 4279374877, 4279506206, 4284800100, 4284800100, 4284800100, 4282340769, 4281945239, 4281549450, 4282925959, 4289614979, 4289816728, 4281549187, 4282668445, 4280956792, 4281023876, 4281615750
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4284800100, 4284800100, 4278519045, 4280230185, 4284800100, 4284800100, 4278651412, 4281285756, 4287647358, 4284800100, 4284800100, 4278519311, 4281221254, 4284800100, 4284800100, 4278717207, 4281288078, 4281287822, 4281419407, 4284800100, 4284800100, 4278914328, 4284838313, 4284800100, 4284800100, 4284800100, 4279572254, 4279111706, 4284800100, 4284800100, 4284800100, 4282077855, 4282012062, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4282275236, 4282011033, 4281418892, 4281615242, 4279307287, 4280488473, 4286666637, 4282405528, 4282273691, 4280891776, 4281549964, 4281088890
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4278519045, 4278519045, 4278519045, 4284800100, 4284800100, 4284800100, 4280163871, 4280230185, 4284800100, 4284800100, 4278651413, 4281088894, 4285548411, 4284800100, 4284800100, 4278453516, 4281221254, 4284800100, 4284800100, 4278717207, 4278717207, 4278717464, 4278717464, 4284800100, 4284800100, 4279571998, 4284574114, 4285231782, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4278783258, 4278783514, 4281947297, 4284800100, 4284800100, 4278849051, 4282209956, 4282209955, 4282144164, 4282078629, 4281946526, 4281616275, 4281549967, 4284800100, 4284800100, 4280554523, 4283779975, 4281879186, 4282076567, 4281616273, 4282142620, 4280825458
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4280163870, 4280163871, 4280230185, 4284800100, 4284800100, 4278651412, 4281023357, 4284302460, 4284800100, 4284800100, 4278453258, 4281155458, 4281287561, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4278783000, 4286153913, 4284800100, 4284800100, 4284800100, 4283457445, 4281880219, 4284800100, 4284800100, 4284800100, 4278849051, 4282013090, 4284800100, 4284800100, 4278849051, 4282209956, 4282144419, 4282143907, 4282011807, 4281748374, 4281616275, 4281616276, 4284800100, 4284800100, 4280357658, 4282138491, 4281286793, 4281944983, 4282011289, 4282077856, 4281352575
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4284800100, 4284800100, 4284800100, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163871, 4280230185, 4284800100, 4284800100, 4278651156, 4278651412, 4278848020, 4284800100, 4284800100, 4279439403, 4280891255, 4281221769, 4278717207, 4278717207, 4281222541, 4281222544, 4281353872, 4284800100, 4284800100, 4278783000, 4282010771, 4284800100, 4284800100, 4279638047, 4282274461, 4281815198, 4281881248, 4284800100, 4284800100, 4278849051, 4282013091, 4284800100, 4284800100, 4278849051, 4278849051, 4282078369, 4281946270, 4278783001, 4278783000, 4278783000, 4281814427, 4284800100, 4284800100, 4279832600, 4280627048, 4281616016, 4281682322, 4282209439, 4281749405, 4282011279
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4284800100, 4284800100, 4278519045, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163871, 4280230185, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4288500597, 4279439144, 4280429152, 4284800100, 4284800100, 4278717207, 4278717208, 4278717208, 4278717464, 4284800100, 4284800100, 4281616533, 4281616789, 4284800100, 4284800100, 4278980378, 4278783258, 4281749660, 4281881247, 4284800100, 4284800100, 4278849051, 4282078626, 4284800100, 4284800100, 4284800100, 4278849051, 4278848794, 4284800100, 4284800100, 4284800100, 4281879961, 4282472103, 4284800100, 4284800100, 4279438614, 4280824694, 4281814169, 4281616785, 4282275491, 4281814686, 4282077845
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4284800100, 4284800100, 4278519045, 4278519045, 4280163870, 4280163870, 4278519045, 4278519045, 4278519045, 4280230185, 4280561495, 4280760436, 4280760440, 4280892028, 4281351037, 4288302972, 4290273931, 4280293946, 4279704645, 4281154945, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4281550739, 4281616790, 4281551509, 4284800100, 4284800100, 4284800100, 4278783258, 4278783258, 4284800100, 4284800100, 4284800100, 4282078625, 4282078114, 4282078114, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4281815197, 4282472615, 4282406308, 4284800100, 4284800100, 4279045142, 4281352589, 4282011038, 4281814680, 4282144933, 4282012834, 4281814676
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4284800100, 4284800100, 4284800100, 4278519045, 4278519045, 4284800100, 4284800100, 4284800100, 4280163871, 4280230185, 4280495959, 4280694645, 4280760439, 4280826233, 4280957564, 4286072956, 4291060107, 4282331742, 4279112496, 4280561766, 4281287309, 4281287821, 4281353614, 4281353616, 4281419407, 4281485202, 4281419923, 4281485717, 4281617303, 4281748633, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4282012576, 4282078112, 4282078368, 4282012319, 4281946269, 4281748889, 4281748377, 4281616790, 4281748120, 4282143137, 4282472873, 4282407337, 4282864029, 4284800100, 4284800100, 4278848535, 4281484947, 4281880479, 4282143647, 4282276262, 4282407846, 4281814418
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4284800100, 4280163870, 4280163871, 4280230184, 4280495701, 4280694387, 4280760438, 4280760439, 4280892026, 4283973753, 4291257227, 4284499579, 4279704900, 4279770695, 4281155203, 4281287820, 4281287824, 4281353617, 4281419665, 4281485459, 4281485459, 4281616789, 4281748888, 4281748889, 4281814682, 4281814683, 4281749403, 4281880733, 4281880734, 4281880991, 4281946783, 4281946783, 4282077854, 4281880732, 4281879960, 4281682839, 4281748120, 4281813913, 4281946528, 4282407080, 4282669994, 4282603946, 4286077852, 4284800100, 4284800100, 4281944722, 4281485204, 4281749406, 4282209956, 4282407592, 4282473641, 4281814676
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163871, 4280230184, 4280495444, 4280628592, 4280628851, 4280760180, 4280891512, 4282268279, 4290864007, 4286337155, 4280889446, 4279572543, 4280627821, 4281287307, 4281288079, 4281419408, 4281484945, 4281550995, 4281682324, 4281616789, 4281748888, 4281748889, 4281814426, 4281814426, 4281880219, 4281814683, 4281815197, 4281946527, 4281946526, 4281880990, 4281946268, 4281879703, 4281747858, 4281616531, 4281813913, 4282143650, 4282209701, 4282406822, 4282670508, 4282997416, 4290079646, 4290735505, 4280819792, 4282208666, 4281550998, 4281749406, 4282209956, 4282407336, 4282408104, 4282078105
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163871, 4280229927, 4280429393, 4280562797, 4280563056, 4280628594, 4280760181, 4281088376, 4289485444, 4288567946, 4281415796, 4279836230, 4280165973, 4281287047, 4281419151, 4281484944, 4281485202, 4281616531, 4281682067, 4281550995, 4281616788, 4281550995, 4281748116, 4281813912, 4281879962, 4281880219, 4281880733, 4281880990, 4281880990, 4281880990, 4281880731, 4281814168, 4281616532, 4281682326, 4282077599, 4282407334, 4282341028, 4282143907, 4282605229, 4284242849, 4292309916, 4288239736, 4280558935, 4282537634, 4281683097, 4281815198, 4282341284, 4282275750, 4282407592, 4282275223
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163871, 4280229926, 4280429131, 4280561764, 4280562541, 4280628335, 4280694129, 4280957301, 4287189632, 4289944454, 4282269048, 4280099147, 4279375671, 4280825974, 4281484431, 4281484945, 4281550735, 4281681295, 4281550479, 4281550223, 4281550736, 4281550480, 4281747347, 4281681809, 4281550480, 4281747602, 4281945497, 4282076829, 4282011807, 4282011550, 4281814426, 4281617046, 4281682581, 4281880218, 4282275749, 4282473384, 4282407079, 4281945757, 4282735272, 4287259296, 4292438930, 4284365401, 4280033875, 4282077082, 4282077596, 4281880219, 4282407076, 4282209954, 4282473124, 4282406293
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280229923, 4280362558, 4280429653, 4280495967, 4280562279, 4280694127, 4280890994, 4284696186, 4291192718, 4283121784, 4280297043, 4279045929, 4280429409, 4281286534, 4281418121, 4281614724, 4282533765, 4283388297, 4283782283, 4284374164, 4283979667, 4283256720, 4282666641, 4282141846, 4282142105, 4282076824, 4281879959, 4281747603, 4281878931, 4281748374, 4281682324, 4282011546, 4282274978, 4282341799, 4282407848, 4282473127, 4281945756, 4282405020, 4290013848, 4292050595, 4281214535, 4280297562, 4281550223, 4282340510, 4281748631, 4282406560, 4282406302, 4282208913, 4282010752
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163871, 4280229668, 4280230188, 4280296763, 4280495185, 4280627555, 4280759405, 4282464880, 4291454862, 4284171644, 4280626786, 4279572019, 4282070617, 4286541193, 4289564055, 4290811799, 4291271575, 4291533202, 4291664531, 4292190873, 4292058772, 4291270030, 4290218378, 4289102225, 4287001234, 4284506006, 4282338965, 4281944723, 4281681292, 4281220740, 4281616013, 4282208925, 4282340768, 4282275747, 4282407333, 4282538405, 4282340255, 4283189648, 4291521943, 4289359256, 4280492874, 4280692063, 4281549961, 4282142871, 4282274196, 4282076551, 4281812338, 4281152847, 4280625463
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163871, 4280164131, 4280230446, 4280428873, 4280889693, 4283121003, 4291521940, 4285944453, 4281546602, 4283448649, 4286469968, 4290875781, 4291467404, 4291204489, 4291006598, 4291137415, 4291597966, 4291993235, 4291795600, 4291203462, 4291137930, 4291072138, 4290940809, 4291400846, 4290154134, 4284965266, 4281614980, 4280956535, 4281351296, 4282142102, 4281945234, 4281879185, 4282208667, 4282209180, 4282405531, 4285485197, 4292769694, 4285420422, 4281479773, 4281021023, 4281679990, 4282075262, 4282140791, 4281152589, 4280559667, 4280361511, 4280229665
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163872, 4280229928, 4280493107, 4282528588, 4289092479, 4289552265, 4286143344, 4287521628, 4285745476, 4289297008, 4290809474, 4291138438, 4291269512, 4291203721, 4291400844, 4291137929, 4290611841, 4289624691, 4288835692, 4288112741, 4289559159, 4291137417, 4291795088, 4291007116, 4287655548, 4281610842, 4280560735, 4281482621, 4281548669, 4281153136, 4281812616, 4281878666, 4282075017, 4288897172, 4292376220, 4284106612, 4281348697, 4280691266, 4280625467, 4280691000, 4280559410, 4280295718, 4280229664, 4280163871, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163871, 4280295458, 4281936434, 4288697713, 4292044939, 4287585383, 4287456093, 4285285696, 4287258454, 4290020216, 4290809987, 4291072388, 4291203465, 4291269514, 4291138184, 4290479999, 4289756537, 4288770415, 4287718754, 4289033586, 4290414465, 4290808707, 4290742913, 4289624176, 4284233785, 4281412172, 4281087338, 4281088108, 4280625485, 4281416301, 4281088365, 4282532475, 4290667922, 4288699774, 4282594894, 4280558641, 4280229926, 4280229666, 4280229665, 4280164128, 4280163871, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280229663, 4281476650, 4286924892, 4291060097, 4282329655, 4281872194, 4283842117, 4284629051, 4288507747, 4290152569, 4290941060, 4291400843, 4291269514, 4290546304, 4289954684, 4289691770, 4289494394, 4289625978, 4289230451, 4289230193, 4289229419, 4289755759, 4289623148, 4285152055, 4285747801, 4281678186, 4281087333, 4280362043, 4281086297, 4280493889, 4282660182, 4289289342, 4286401117, 4281411630, 4280229665, 4280163871, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280229406, 4280951333, 4284626757, 4288500842, 4281410599, 4280163870, 4280098077, 4280491807, 4284499265, 4289165676, 4290743424, 4290808705, 4290217852, 4289691767, 4289165940, 4288771955, 4288311920, 4287785318, 4287258717, 4287652191, 4288045920, 4289229415, 4289755247, 4286335044, 4287454813, 4282333014, 4280954447, 4280493105, 4280361262, 4280163872, 4283641920, 4289158006, 4283446077, 4280623394, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280623138, 4283182904, 4288304489, 4282001710, 4280163870, 4280163870, 4280098077, 4280754208, 4288377189, 4290152057, 4289427823, 4288573544, 4287587424, 4285418573, 4283446583, 4282526512, 4282920757, 4283709501, 4284892231, 4286337364, 4287849825, 4289361262, 4288308578, 4286533710, 4282726470, 4280624433, 4280163870, 4280163870, 4280163870, 4289157235, 4288961395, 4282133296, 4280295199, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280492065, 4282789429, 4287976295, 4281935917, 4280163870, 4280163870, 4280163613, 4280294685, 4287916641, 4289362541, 4288047201, 4286272337, 4284300863, 4283315255, 4282987064, 4282724150, 4282592820, 4282986550, 4283906365, 4285548619, 4286797910, 4288046948, 4289493106, 4285548101, 4280688931, 4280098078, 4280163870, 4280163870, 4280294430, 4291915663, 4286597723, 4281345577, 4280229663, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280426272, 4282460978, 4287318879, 4281607209, 4280163870, 4280163870, 4280163870, 4280229149, 4287193177, 4288046686, 4286534993, 4285286470, 4285024327, 4285089865, 4284629572, 4283314999, 4282986548, 4283643705, 4284169278, 4285351753, 4287191641, 4288112483, 4288638824, 4286272335, 4280294429, 4280163613, 4280163870, 4280163870, 4280950562, 4288632172, 4284036416, 4280754723, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280426273, 4282395186, 4287252829, 4281804074, 4280163870, 4280163870, 4280163870, 4280163870, 4286601299, 4287191892, 4286272078, 4286469715, 4287259228, 4287915871, 4288507237, 4289231215, 4289559152, 4289689709, 4290216053, 4290544762, 4289821553, 4289032809, 4288770663, 4287916643, 4280294685, 4280163613, 4280163870, 4280163870, 4282197549, 4288107624, 4282723893, 4280492065, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280426272, 4282264113, 4287252831, 4283116340, 4280163870, 4280163870, 4280163870, 4280163870, 4286075469, 4286863441, 4287587422, 4289100144, 4289888885, 4290874237, 4291663240, 4292650133, 4292912533, 4292582543, 4292187528, 4292582542, 4291925125, 4290347378, 4289690989, 4289034092, 4281805353, 4280098077, 4280163870, 4280229149, 4284888130, 4287056475, 4281870381, 4280295199, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280360736, 4281935661, 4286990171, 4286069836, 4280163870, 4280163870, 4280163870, 4280163870, 4285812298, 4287718749, 4289823348, 4290875265, 4291663492, 4292385931, 4292649361, 4293175193, 4293240214, 4293042322, 4292778893, 4292647306, 4292450183, 4291398522, 4291137150, 4290281586, 4287325277, 4280426014, 4280294685, 4282914845, 4289875041, 4286334033, 4281410856, 4280229406, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280229406, 4281279271, 4285480012, 4288038749, 4280294685, 4280163870, 4280163870, 4280163870, 4286403407, 4289559150, 4291334790, 4291861388, 4292255373, 4292582797, 4292713869, 4292910479, 4292317571, 4290344553, 4289357916, 4289554780, 4290278760, 4291003507, 4291597444, 4290676600, 4289427307, 4281607974, 4280621852, 4286715931, 4290921813, 4287187286, 4281607721, 4280294943, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280229406, 4280820003, 4284035904, 4288695653, 4283244326, 4280490780, 4280098077, 4280557086, 4287981151, 4291005055, 4292189070, 4292583825, 4292519060, 4292451983, 4292449926, 4291922813, 4290145893, 4289881952, 4290539112, 4290407526, 4289421914, 4290147944, 4291992203, 4290939515, 4290478453, 4286008135, 4280491036, 4285732378, 4290459201, 4288040796, 4281936172, 4280360735, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280229406, 4280688674, 4283707966, 4288696423, 4288886856, 4283177245, 4280097820, 4282329898, 4289492331, 4291661958, 4292583572, 4292912792, 4293242269, 4293044632, 4291793024, 4291922813, 4292315522, 4290997101, 4289288025, 4290077025, 4290537831, 4290017386, 4291926409, 4291202688, 4290478965, 4289754221, 4280687387, 4283372824, 4289276211, 4288171867, 4282067245, 4280360735, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280491809, 4282986040, 4289091696, 4291781244, 4286914341, 4280556058, 4284760384, 4290675062, 4291990665, 4292517522, 4292847513, 4293242526, 4293242012, 4292385419, 4290870900, 4289486938, 4283111959, 4281273097, 4282979605, 4287515976, 4289557609, 4291531396, 4291465603, 4290544760, 4290213742, 4281737761, 4283175957, 4289605691, 4287186771, 4281739049, 4280295199, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280295199, 4282001711, 4288238956, 4291585926, 4289343290, 4283176728, 4286007621, 4291200634, 4291793285, 4292583570, 4292913563, 4293308319, 4293307547, 4292912022, 4292319120, 4291068026, 4286792512, 4288569182, 4289292903, 4289819242, 4290412148, 4291924614, 4291925897, 4290610808, 4290345840, 4283313709, 4283765780, 4287836215, 4284888637, 4281082404, 4280229406, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280229663, 4281345577, 4286531675, 4291258502, 4291118937, 4286192672, 4284889140, 4290871414, 4292187529, 4292846486, 4292979101, 4293176478, 4293307548, 4293503131, 4292713360, 4292252813, 4292252555, 4291859082, 4291661958, 4290082925, 4290739572, 4291989123, 4292254093, 4291333503, 4290609269, 4284496695, 4282848789, 4287245874, 4282984748, 4280557344, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280229406, 4280885796, 4284627271, 4289747831, 4291715965, 4288817715, 4284294949, 4290805621, 4292385165, 4293043864, 4293110684, 4293242014, 4293504414, 4293304981, 4293304470, 4292449164, 4292054663, 4290871417, 4289950571, 4288239695, 4288435791, 4291002228, 4292121992, 4291661699, 4290937464, 4285153341, 4284027924, 4287048239, 4282327589, 4280360478, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280623137, 4283182905, 4289157236, 4291850127, 4290857047, 4286126874, 4290936694, 4292516496, 4293043353, 4293242269, 4293636770, 4293701280, 4293502105, 4293172112, 4291065453, 4288172876, 4289093979, 4288107340, 4286265650, 4287580483, 4290804336, 4292121220, 4291858820, 4291069048, 4285153340, 4284290581, 4286850859, 4282130723, 4280360478, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280426272, 4282395186, 4288369260, 4290930310, 4291122797, 4287569697, 4290211689, 4292582286, 4293044121, 4293307035, 4293569950, 4293568666, 4293699227, 4293304211, 4292381056, 4290868591, 4291922821, 4291791235, 4289620323, 4289225562, 4291396985, 4292253060, 4291990146, 4291002739, 4284824631, 4284487447, 4286653480, 4281933602, 4280294686, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280360736, 4281935918, 4287647077, 4290339201, 4291059065, 4288358191, 4288566351, 4292515978, 4292913048, 4293307547, 4293504926, 4293373082, 4293371029, 4293369491, 4292841095, 4292644233, 4293435804, 4292514444, 4290080101, 4290213482, 4292056457, 4292188554, 4291398521, 4290674030, 4284363568, 4285864219, 4286587944, 4281736736, 4280294685, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280294943, 4281607466, 4286858843, 4289682297, 4290994816, 4288885828, 4286461747, 4291924614, 4292846741, 4293110683, 4293111710, 4293112226, 4292650134, 4292449158, 4292446336, 4292316038, 4292381573, 4291854713, 4289619549, 4290411634, 4291334277, 4291400068, 4290478447, 4290609009, 4282721572, 4286454046, 4286326315, 4281540128, 4280294685, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280229407, 4281279271, 4285611342, 4289156465, 4290535550, 4289348954, 4284553757, 4289360492, 4292387219, 4292387474, 4291926155, 4292454302, 4291795603, 4291464323, 4291528572, 4291987843, 4292316548, 4291198067, 4287122499, 4288111196, 4287652444, 4289361774, 4289425766, 4288111966, 4280687387, 4284291099, 4285934385, 4281344033, 4280229406, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280229406, 4280819747, 4283969854, 4287974243, 4290076284, 4290797435, 4285146158, 4282323985, 4286795848, 4289097055, 4286794817, 4286929235, 4284430643, 4288505438, 4290149488, 4290806134, 4292317577, 4290804851, 4286600012, 4285877321, 4285943114, 4288440415, 4288307799, 4284695361, 4281737505, 4287441712, 4285607991, 4281213219, 4280229406, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280426016, 4282328879, 4287185753, 4289484403, 4290864515, 4289877874, 4285016887, 4283770409, 4286205776, 4287256659, 4289164656, 4287717721, 4288176214, 4289229159, 4288637022, 4291070594, 4288767840, 4287849307, 4287717206, 4289032037, 4289229669, 4286402374, 4283441441, 4287308329, 4287575104, 4284034099, 4280819746, 4280229406, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280294943, 4281476137, 4286266704, 4289088874, 4290337658, 4291586699, 4291651462, 4290993787, 4288498528, 4285148980, 4286663497, 4289557871, 4289163881, 4288834146, 4289030756, 4290937979, 4290543477, 4287847252, 4285414969, 4285742906, 4286002994, 4285997346, 4288423729, 4289347407, 4287512140, 4282853422, 4280557344, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280229406, 4281082405, 4285019461, 4288825700, 4289548400, 4290272379, 4288894061, 4289287535, 4290994815, 4291125886, 4289484137, 4285674041, 4284427309, 4285347123, 4286855993, 4287972161, 4288826183, 4288165172, 4287439909, 4287897895, 4288751666, 4290136155, 4290204521, 4288957794, 4287184719, 4282525228, 4280491808, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280229406, 4280754467, 4283772474, 4287644249, 4289154152, 4288959855, 4285028700, 4286147438, 4286144616, 4286403422, 4288237927, 4291322753, 4289875045, 4289413204, 4289017155, 4289081404, 4289080633, 4289607751, 4290069591, 4290136419, 4290467439, 4290270061, 4288434534, 4287841879, 4286988110, 4282263083, 4280426272, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280557345, 4282722353, 4286922066, 4288825186, 4289351787, 4290084753, 4291342774, 4291871173, 4291346368, 4287200127, 4287387240, 4290994303, 4290992761, 4290861175, 4290992760, 4291190138, 4291188854, 4291057269, 4290728562, 4290072169, 4288892514, 4286472040, 4288238690, 4286726221, 4282000681, 4280360735, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280426272, 4282131499, 4286396749, 4288431199, 4288890978, 4289219689, 4289745263, 4289747829, 4290280076, 4290938263, 4290879401, 4289748341, 4290465648, 4290728307, 4290728819, 4290925936, 4290397529, 4289738304, 4289145136, 4288620849, 4287187281, 4289036678, 4287775059, 4286003782, 4281606951, 4280294943, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280294943, 4281606696, 4285805897, 4287840088, 4288365661, 4288628319, 4289350248, 4289022308, 4289548139, 4289941357, 4289743977, 4289744491, 4290267490, 4289803329, 4289473073, 4289144103, 4288815394, 4288749854, 4288552992, 4287831071, 4286459446, 4286924112, 4285806919, 4284100409, 4281016611, 4280229406, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280229406, 4281213221, 4285150019, 4287315026, 4287971416, 4288168795, 4288628065, 4287911269, 4285019200, 4288956516, 4289217890, 4289415009, 4289081659, 4288618016, 4288552478, 4288421149, 4288092956, 4287962394, 4284487191, 4283109909, 4286523702, 4285346627, 4283312953, 4281541160, 4280360479, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280229406, 4280754210, 4283575094, 4286330696, 4287511889, 4287709014, 4286463053, 4284756797, 4282920241, 4285936454, 4288626778, 4288758618, 4288161840, 4287961884, 4285995544, 4284684056, 4287109402, 4286454040, 4281208846, 4282717209, 4286460224, 4282787641, 4282460211, 4280688675, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280491552, 4282328363, 4285674564, 4286921037, 4287380051, 4285612877, 4282264104, 4284237641, 4284558394, 4287970389, 4288101716, 4287506224, 4287240734, 4282061331, 4281404943, 4286519580, 4286847516, 4286323485, 4286721078, 4286593611, 4284624957, 4282459950, 4280557601, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280294943, 4280819490, 4282853167, 4285806149, 4286855243, 4287051850, 4287249230, 4286528842, 4284363575, 4285215037, 4285613138, 4285285710, 4284489254, 4286191388, 4286060314, 4285797914, 4286322974, 4286391083, 4286065975, 4285477180, 4284362296, 4283575605, 4281344549, 4280294943, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280294943, 4281082148, 4282590766, 4285412162, 4286724426, 4286855499, 4286854987, 4286921036, 4287051853, 4287183438, 4286986573, 4286730844, 4289173144, 4282527281, 4285343539, 4286785845, 4286786359, 4286658629, 4284889671, 4283903288, 4282655788, 4282197034, 4281541414, 4280491808, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280229406, 4280688674, 4282656558, 4284558907, 4286068036, 4287051850, 4287183437, 4286854985, 4286724171, 4286658635, 4286723915, 4286133318, 4285214525, 4286004299, 4285608000, 4286986059, 4287248972, 4286987086, 4285682782, 4285025878, 4282789686, 4281540903, 4280819490, 4280426015, 4280229406, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280491808, 4281803561, 4283640630, 4284690236, 4285412160, 4286396488, 4287249231, 4286790475, 4286790221, 4286396491, 4284952896, 4281014046, 4280750615, 4283442222, 4286593099, 4286527563, 4284953412, 4285615448, 4283382593, 4281148711, 4280426272, 4280294943, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280229406, 4280426272, 4280885282, 4281147684, 4281738280, 4283772215, 4285609283, 4286003014, 4285871428, 4285740100, 4285609285, 4285084738, 4284625212, 4284690234, 4286330956, 4285871944, 4285610311, 4284955718, 4281476906, 4280360736, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4263386654, 4246609438, 4229832222, 4229832222, 4229832222, 4229832222, 4229832222, 4229832222, 4229832222, 4229832222, 4229897758, 4229897759, 4230029087, 4230553890, 4231078950, 4231275815, 4231275560, 4231537961, 4232128302, 4233112885, 4234097470, 4234753346, 4234819139, 4233506617, 4231800877, 4231079207, 4230094880, 4229832222, 4229832222, 4229832222, 4229832222, 4229832222, 4229832222, 4229832222, 4229832222, 4229832222, 4246609438, 4246609438, 4263386654, 4263386654, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
dd 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4263386654, 4246609438, 4196277790, 4196277790, 4196277790, 4213055006, 4229832222, 4213055006, 4196277790, 4129168926, 4112391710, 4078837278, 4078902814, 4095680030, 4062125598, 3927973407, 3844218656, 3777372193, 3744014884, 3727434533, 3744145957, 3844415522, 4011859743, 4162723358, 4246609438, 4263386654, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870, 4280163870
@TheGag96
Copy link

TheGag96 commented Apr 25, 2023

I got things working just by disabling the title screen and DRAW_SCREEN_EVERY_FRAME. I have a couple couple more bugs to list, if that's alright:

  • The alpha channel of the framebuffer should probably always be initialized to 0xFF. Without enabling DRAW_SCREEN_EVERY_FRAME and uncommenting that line of code to set the alpha, I don't think it's set properly. (Without any overriding on my part, the screen is somehow dark but not blank.)
  • When I enable DRAW_SCREEN_EVERY_FRAME, I get my screen looks like this (odd blue fade, no apple):
    image
    I'm not sure whether this is a problem with my emulator or the program.
  • Whenever you use the input register (0xFFFF), you always read a whole word from it - though I'd think you'd intend to read just a byte.
  • Whenever I go off the bottom of the screen, my emulator gets really slow and eventually hits some bad instruction and crashes. Any other side of the screen works fine. This again could totally be a me problem, but I'm not sure.

@charlesastaylor
Copy link
Author

@TheGag96 Hey! Awesome that you are trying to run this! To answer your questions:

Nope, this is not an old version, the initial revision was the version running in the demo video. But yes you are absolutely right that draw_title_screen macro was writing twice as much as it should have, pretty surprising that wasn't an issue for me running it. I have just updated the gist to fix that.

The DRAW_SCREEN_EVERY_FRAME thing was something I did early on when I initially switched to not drawing every frame. It is not expected to work now, I probably should have deleted it. The reason the background is a gradient you can see on line (in latest gist) 592.

My simulator doesn't care about the alpha channel, so you are right the program won't be correctly setting it. Probably you will find that the alpha channel is 1E for all pixels because when doing clear_screen it is copying the background colour into all channels.

Yep you are right about input register too, so many buffer overruns 😂. That one is pretty surprising it's not an issue as that will be reading outside of the memory allocated in my simulator. I'll fix that now!

Not sure what is happening when you go off bottom, it runs fine for me. It is true that when you are moving near the top of the screen it is executing ~400 instructions a frame, wheras at the bottom it is doing ~100. Because I'm not using mul, it has to do more adds when you are near the top.

@charlesastaylor
Copy link
Author

There is also at least one more buffer overrun somewhere, as if you set the screen colour to 100 things start freaking out. You can see this at the end of the demo video. I had no idea about that bug when I was recording and so me undoing everything and getting it back to working was a total 🙈.

@charlesastaylor
Copy link
Author

Fixed the input register overrun by making input register now be 0xFFFE.

Fixed alpha not always being 0xFF. clear_screen now writes 0xFF to alpha, and I hacked the draw_title_screen to output correct alpha also as turns out the image had alpha in it. Oopsie.

@TheGag96
Copy link

Hey no problem, it's a pretty cool little program! Thanks for looking into all of that. I'm going to have to do some debugging on my end with the off-the-botttom thing then...

@charlesastaylor
Copy link
Author

Apparently gist comments don't have the technology to add reactions so here you go instead: ♥

@charlesastaylor
Copy link
Author

@TheGag96 Did you get it running in the end? 😀

@TheGag96
Copy link

TheGag96 commented Apr 30, 2023

@charlesastaylor Yes I did! I had a bug in my implementation of the binary ops regarding signedness that reared its head when I got to a line that was like cmp ax, -1 when ax was -1.... Your program has been a great test case, lol.

Something random that helped me out, too: Implement one of your interrupts (like int3) to trigger a SIGINT/GDB breakpoint in your emulator. Super helpful.

@charlesastaylor
Copy link
Author

@TheGag96 Nice! Yep, I did something similar with int3, very helpful. I just had the case statement there and would add breakpoint in debugger when wanting to debug.

Jelly you're on the jai beta 😋

@TheGag96
Copy link

Email Jon and ask! Just be earnest about wanting to help out and he might let you in.

@hintron
Copy link

hintron commented Mar 11, 2024

Great work! I only had to tweak this a little to get it working in my simulator. Notably, I had to change %if !DRAW_SCREEN_EVERY_FRAME to %if DRAW_SCREEN_EVERY_FRAME == 1 to get it working with my (probably older) NASM. I also changed the interrupts to use interrupt 0x21 and then made the first interrupt set up the frame buffer address in addition to the width and height, so I know where in memory to pull the image from.

Image of the first frame (still working on the graphical part of my simulator to support more than one frame):

image

Here's the full changelog:

--- emulator/files/misc/-sna86.asm	2024-03-11 15:51:34.808704600 -0600
+++ emulator/files/snake-regress/snake.asm	2024-03-11 16:53:23.243899492 -0600
@@ -2,7 +2,7 @@
 ;                              Sna86.
 ;                     An 8086 simulator snake!
 ; -------------------------------------------------------------------
-;
+; MGH: Slightly modified from https://gist.github.com/charlesastaylor/18c7c8005fed9d0af1a3ee2b24fcd724. See also emulator/files/misc/-sna86.asm
 ; Assembly program intended to run in an 8086 simulator with functionaliy equal* to one made for homeworks
 ; up to Part 1 Episode 10 of the Peformance-Aware Programming Series (https://www.computerenhance.com/)
 ; by Casey Muratori. Demo - https://youtu.be/s_S4-QHeFMc.
@@ -11,9 +11,9 @@
 ;   and jmp because conditional jumps have limited range! They are both simple enough to implment if you
 ;   already have the above.
 ; * int is also needed for a couple of things:
-;   - int 0 is used to signal the size of the frame buffer to the simulator. Width is put in ax, height
-;     into bx.
-;   - int 15h is used for the program to signal it has finished a frame to allow the simulator to draw the
+;   - int 0x21 function 0x55 is used to signal the size of the frame buffer to the simulator. Width is put in bx, height
+;     into cx, and the frame buffer location in dx.
+;   - int 0x21 function 0x56 is used for the program to signal it has finished a frame to allow the simulator to draw the
 ;     frame buffer to the screen
 ;
 ; Input is handled via the input "register" at memory address 0xFFFE, with each bit corresponding to an input
@@ -252,12 +252,15 @@
 add ax, [frame_buffer_num_bytes]
 mov [snake], ax
 
-; Request frame buffer size using int 0
-mov ax, [screen_size]
+; MGH: Request frame buffer size using int 0x21 function 0x55 instead
+mov ah, 0x55
 mov bx, [screen_size]
-int 0
+mov cx, [screen_size]
+mov dx, [frame_buffer]
+int 0x21
 
-%if !DRAW_SCREEN_EVERY_FRAME
+; MGH: My nasm doesn't like `!`, so use `== 0` instead
+%if DRAW_SCREEN_EVERY_FRAME == 0
 ; Draw background
 ; Have to use constant color so that when we are "deleting" snake parts we know what color to use.
 ; @TODO If did want nicer background could load it into memory separate to frame buffer to refer to!
@@ -607,12 +610,12 @@
 draw_snake
 %endif
 
-; Use int 15 as a hacky way to signal to hosting simualtor to draw frame and sleep till next frame
+; Signal to hosting simualtor to draw frame and sleep till next frame
 ; There is something about on actualy 8086 used to call int 15h with ah=86h to do micro second sleeps but
 ; 1) details of it aren't obvious to me but also 2) that would require asm code to keep track of timings!
-; mov ah, 86h
-; mov cx, micro_seconds
-int 15h
+; MGH: Use int 0x21 function 0x56 instead
+mov ah, 0x56
+int 0x21
 
 ; @TODO: Clean up handling of menu screen. This is very spaghetti!
 cmp [game_state], word GAME_STATE_PLAY

Thanks for the fun challenge, and I hope to actually get it playable soon.

@charlesastaylor
Copy link
Author

@hintron Nice! Glad you made use of it 😀. Good luck getting more frames!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment