From 9ffc206ef090426c3ded7d5ccfc0d6a40abc169d Mon Sep 17 00:00:00 2001 From: Alexander Kramer Date: Fri, 16 Sep 2022 17:31:18 +0200 Subject: [PATCH] new main menu --- inc/init.asm | 15 ++++-- inc/input.asm | 113 ++++++++++++++++++++++++++------------------ inc/messages.asm | 28 ++++++++++- maps/background.asm | 4 +- maps/window.asm | 33 +------------ wordle.asm | 32 +++++++++++++ wordle.gb | Bin 16384 -> 16384 bytes 7 files changed, 141 insertions(+), 84 deletions(-) diff --git a/inc/init.asm b/inc/init.asm index 7027e3f..b9eeac7 100644 --- a/inc/init.asm +++ b/inc/init.asm @@ -2,17 +2,21 @@ init_state_menu: ld a, STATE_MENU ld [current_state], a + ld a, STATE_MENU_START + ld [sub_state], a ; set the background position ld a, 0 ld [BKG_POS_X_REGISTER], a ld [BKG_POS_Y_REGISTER], a + call show_message_menu_start + ; turn the screen on ld a, DISPLAY_ON + TLS_USE_LOC_8000 \ - + BKG_DISPLAY_ON + BKG_USE_LOC_9800 \ + + BKG_DISPLAY_ON + BKG_USE_LOC_9800 \ + WND_DISPLAY_OFF + WND_USE_LOC_9C00 \ - + OBJ_DISPLAY_OFF + OBJ_SIZE_8X8 + + OBJ_DISPLAY_ON + OBJ_SIZE_8X8 ld [LCD_CONTROL_REGISTER], a ret @@ -38,6 +42,9 @@ init_state_game: ld a, $5e ld [WND_POS_Y_REGISTER], a + ; clear messages + call clear_message + ; initialise some more variables ld a, 0 ld [selected_letter_x], a @@ -64,7 +71,7 @@ init_state_game: jp nz, .loop2 ; turn the screen on - ld a, DISPLAY_ON + TLS_USE_LOC_8000 \ + ld a, DISPLAY_ON + TLS_USE_LOC_8000 \ + BKG_DISPLAY_ON + BKG_USE_LOC_9800 \ + WND_DISPLAY_ON + WND_USE_LOC_9C00 \ + OBJ_DISPLAY_ON + OBJ_SIZE_8X8 @@ -148,7 +155,7 @@ load_window_map: ld bc, window ld hl, WND_LOC_9C00 ld d, 32 - ld e, 32 + ld e, 4 .loop: ld a, [bc] diff --git a/inc/input.asm b/inc/input.asm index be17f9c..3ba282d 100644 --- a/inc/input.asm +++ b/inc/input.asm @@ -1,44 +1,3 @@ -; Update the object data for the alphabet cursor -update_cursor_objects: - ld hl, obj_selected_letter - - ; vertical position - ld a, [selected_letter_y] - ld b, $08 - call multiply_ab - add a, $86 - ld [hl+], a - - ; horizontal position - ld a, [selected_letter_x] - ld b, $10 - call multiply_ab - add a, $14 - ld [hl+], a - - ; tile index - ld a, [selected_letter_x] - ld c, a - ld a, [selected_letter_y] - ld b, $09 - call multiply_ab - add a, c - inc a - - ; char 27 doesn't exist, it's the enter sign - cp a, 27 - jp nz, .not_enter - ld a, TILE_ENTER -.not_enter: - ld [hl+], a - - ; attributes - ld a, OBJ_ATTR_PALETTE1 - ld [hl+], a - ret - - - ; Read the current input state ; -> b: current keystates ; -> c: changed keys since last read @@ -85,12 +44,36 @@ read_input: ; React on input within the menu handle_input_menu: +.check_movement: ld a, c - and a, INPUT_START - jp z, .nothing + and a, INPUT_UP | INPUT_DOWN + jp z, .check_confirm + ld a, [sub_state] + xor a, %00000001 ; flip the last bit + ld [sub_state], a + and a, %00000001 + jp z, .switch_to_help +.switch_to_start + call show_message_menu_start + jp .check_confirm +.switch_to_help + call show_message_menu_help + jp .check_confirm + +.check_confirm + ld a, c + and a, INPUT_START | INPUT_A + jp z, .return + + ld a, [sub_state] + and a, STATE_MENU_START + jp z, .help_selected +.start_selected call init_state_game - -.nothing + jp .return +.help_selected + jp .return +.return ret @@ -271,3 +254,43 @@ delete_letter: pop hl ret + + +; Update the object data for the alphabet cursor +update_cursor_objects: + ld hl, obj_selected_letter + + ; vertical position + ld a, [selected_letter_y] + ld b, $08 + call multiply_ab + add a, $86 + ld [hl+], a + + ; horizontal position + ld a, [selected_letter_x] + ld b, $10 + call multiply_ab + add a, $14 + ld [hl+], a + + ; tile index + ld a, [selected_letter_x] + ld c, a + ld a, [selected_letter_y] + ld b, $09 + call multiply_ab + add a, c + inc a + + ; char 27 doesn't exist, it's the enter sign + cp a, 27 + jp nz, .not_enter + ld a, TILE_ENTER +.not_enter: + ld [hl+], a + + ; attributes + ld a, OBJ_ATTR_PALETTE1 + ld [hl+], a + ret diff --git a/inc/messages.asm b/inc/messages.asm index 62b170f..b58edab 100644 --- a/inc/messages.asm +++ b/inc/messages.asm @@ -1,3 +1,21 @@ +; Highlights the menu entry "start game" +show_message_menu_start: + ld de, message_menu_start + ld b, 0 + call show_message + ret + + + +; Highlights the menu entry "how it works" +show_message_menu_help: + ld de, message_menu_help + ld b, 0 + call show_message + ret + + + ; Inform that the current guess is not in the dictionary show_message_unknown: ld de, message_unknown @@ -43,8 +61,12 @@ ENDR ; <- de ; <- b show_message: + push hl + push bc + push de + ld hl, obj_message_letters - ld c, 32 + ld c, 36 .loop: ld a, [de] ld [hl], a @@ -55,6 +77,10 @@ show_message: ld a, b ld [message_timeout], a + + pop de + pop bc + pop hl ret diff --git a/maps/background.asm b/maps/background.asm index 0d4fe56..4b1877e 100644 --- a/maps/background.asm +++ b/maps/background.asm @@ -13,9 +13,9 @@ DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$ DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c DB $1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1b,$1b,$1b,$1b,$10,$12,$05,$13,$13,$1b,$1b,$13,$14,$01,$12,$14,$1b,$1b,$1b,$1b,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c +DB $1b,$1b,$1b,$1b,$1b,$13,$14,$01,$12,$14,$1b,$07,$01,$0d,$05,$1b,$1b,$1b,$1b,$1b,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c +DB $1b,$1b,$1b,$1b,$1b,$08,$0f,$17,$1b,$14,$0f,$1b,$10,$0c,$01,$19,$1b,$1b,$1b,$1b,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c DB $1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c diff --git a/maps/window.asm b/maps/window.asm index 81772ae..7a371f5 100644 --- a/maps/window.asm +++ b/maps/window.asm @@ -2,35 +2,4 @@ DB $1b,$1b,$01,$1b,$02,$1b,$03,$1b,$04,$1b,$05,$1b,$06,$1b,$07,$1b,$08,$1b,$09,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b DB $1b,$1b,$0a,$1b,$0b,$1b,$0c,$1b,$0d,$1b,$0e,$1b,$0f,$1b,$10,$1b,$11,$1b,$12,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b DB $1b,$1b,$13,$1b,$14,$1b,$15,$1b,$16,$1b,$17,$1b,$18,$1b,$19,$1b,$1a,$1b,$1e,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b -DB $1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c -DB $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c +DB $1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b diff --git a/wordle.asm b/wordle.asm index ff91d5b..62524e9 100644 --- a/wordle.asm +++ b/wordle.asm @@ -3,6 +3,8 @@ include "inc/constants.asm" ;; Game specific constants ; Game states STATE_MENU EQU %00000001 +STATE_MENU_START EQU %01000001 +STATE_MENU_HELP EQU %10000001 STATE_GAME EQU %00000010 STATE_LOST EQU %00000100 STATE_WON EQU %00001100 @@ -205,6 +207,29 @@ message_clear: DB $00, $00, $00, $00 DB $00, $00, $00, $00 DB $00, $00, $00, $00 + DB $00, $00, $00, $00 + +message_menu_start: + DB $88, $30, 19, OBJ_ATTR_PALETTE1 ; S + DB $88, $38, 20, OBJ_ATTR_PALETTE1 ; T + DB $88, $40, 01, OBJ_ATTR_PALETTE1 ; A + DB $88, $48, 18, OBJ_ATTR_PALETTE1 ; R + DB $88, $50, 20, OBJ_ATTR_PALETTE1 ; T + DB $88, $60, 07, OBJ_ATTR_PALETTE1 ; G + DB $88, $68, 01, OBJ_ATTR_PALETTE1 ; A + DB $88, $70, 13, OBJ_ATTR_PALETTE1 ; G + DB $88, $78, 05, OBJ_ATTR_PALETTE1 ; A + +message_menu_help: + DB $90, $30, 08, OBJ_ATTR_PALETTE1 ; H + DB $90, $38, 15, OBJ_ATTR_PALETTE1 ; O + DB $90, $40, 23, OBJ_ATTR_PALETTE1 ; W + DB $90, $50, 20, OBJ_ATTR_PALETTE1 ; T + DB $90, $58, 15, OBJ_ATTR_PALETTE1 ; O + DB $90, $68, 16, OBJ_ATTR_PALETTE1 ; P + DB $90, $70, 12, OBJ_ATTR_PALETTE1 ; L + DB $90, $78, 01, OBJ_ATTR_PALETTE1 ; A + DB $90, $80, 25, OBJ_ATTR_PALETTE1 ; Y message_unknown: DB $7a, $38, 21, OBJ_ATTR_PALETTE1 ; U @@ -215,6 +240,7 @@ message_unknown: DB $7a, $60, 23, OBJ_ATTR_PALETTE1 ; W DB $7a, $68, 14, OBJ_ATTR_PALETTE1 ; N DB $00, $00, 0, 0 + DB $00, $00, 0, 0 message_won: DB $7a, $38, 25, OBJ_ATTR_PALETTE1 ; Y @@ -225,6 +251,7 @@ message_won: DB $7a, $68, 14, OBJ_ATTR_PALETTE1 ; N DB $00, $00, 0, 0 DB $00, $00, 0, 0 + DB $00, $00, 0, 0 message_lost: DB $7a, $30, 9, OBJ_ATTR_PALETTE1 ; I @@ -235,6 +262,7 @@ message_lost: DB $7a, $60, 0, OBJ_ATTR_PALETTE1 ; guess[2] DB $7a, $68, 0, OBJ_ATTR_PALETTE1 ; guess[3] DB $7a, $70, 0, OBJ_ATTR_PALETTE1 ; guess[4] + DB $00, $00, 0, 0 @@ -270,6 +298,10 @@ input_state: current_state: DB +; Saves the state in the submenu +sub_state: + DB + ; Saves the current word current_word: DS 5 diff --git a/wordle.gb b/wordle.gb index f2cf247e092e12703f2a63c9bbbc027a146dab28..7debabe3baff578da91598f492071e2405c62c58 100644 GIT binary patch delta 1357 zcmah|Urbw77(eISdrr&b&n;~k&<$FO(J(cbOhN=Muq|xSOo&+mF;PrhgeS8lX7s{F z?=)LFd8xZT%moY&10Db+VaeF$!{Js;?j0tL_yydzP-_H{v}+3=r`?5pNPPPsAz_0_!yM zx9-V!3iG^(+zVK$?MmSmFJk*T7Vj!48yAVah{c>D+NoGm#U)j0mG*5cmWsY7cjSgnLNE*)$k;C>7 zaqxUy1l_0$H-!&ODAAxj2J#rlC=@}nAghn%X^^Lhvok!x&>eS<497k^IoV@>LSku$ z&Fd(Fcnh_ch@kD4lWcUQr4Q{1*(V=CB)AAkown zMYKvZaux2Zbm#irPZg2HsaXa7P9e{S3wwOj$a&q*rEcU@_l_c#n32=muawE67cgMt z!fqM}0t_0tKKG$A1>~V}*vOgg9uN|T&mjXg{#_A%)yNU|FGakrPC_N8pp=f>p;m<* zpuSG_kFA|4Rv~7{2i=24F=Rid!j`GiD%85L%ozpG$-)XRQunlK)}hgc^T4{H8R^Ym zcT3a%GjcEv@x)ZKM-J{lM$eP6P&`PGd11w`ueLzGOp|6nnuF3Kqqy7+F)XWkQ;V*( zI1!cmpyvUxqw1{^j!HNo;f#c{08TcW#VVSpC_lT_s@fedhtAL-gjeB2uHN)*bH=J^ z<3u#-uQH0rewpt0I#5HJ#(;EEM}%oMjhj#fLyh7+I^mD1u_CocsgvE>i7fKrk!r*u z)A#HdYTUQ4QP!NYC<|9c4Hz{^W9iLZxkg*Acl#M@oDPhcp)G87UEHt>^wM2`%~UGFS=(LP&)V+U0oHck4l*4((P%XFBh``PTj*j)oM(>Dd1CzB#cr1rUw7H{(qkj? z5yy+%^0A=R%slXV<1*BXyt)0Ce^ zAhH9)P^}{#CHnuy`gbhvU9Z(%^IB$oYh}nEz_o#p2UpRMwN@W|%3E_V6sQSlmAGMj zt^NVQq4m+`Ncdw-J(XzpYl+T)mgvJ;;#94c7y|okkCqq*ey&PO#Hf~R_iD+`8ZFs( oP)mY8IRf^$rX|l+YRMSZl4gTunZ03awzt*#viHQg=9y9c0jgy(X#fBK delta 1182 zcmah|Z)jUp6uN@2}w zr-=#!1!eXjj?qCVtJBp%u>-g6gSR(Kcuy}Hv>)o6q(~oKP()-f@*#R|tPK6)gZJb7 ze)rsS&OL`yDBwZ?pL?R~Cx+Cw*+7I!{w{YWnl8`d7xF_y9whQ*BA+Mn10olRl-Qz` zKdq)pQ?1DB$UBXdI;qtz@j4dsSiYx~1g;bD5tipQd0&?~T@Ey~R&fnWtb?XJbRixv z3ss9;9$=-@*uvFI+(MNnD~GJfa%I%D2ng~jQJQrDRIT!i^-|?&xO10RtGs%JSC_f@ zDO`&7_IHXFVtU-_Y1mO>{h>nWD#ShNTCK|Xg*r*ned;jTD-IJE7o#RRA2oW7mKiPH zDNcfX5@ZxJ(ZU0H8sur>Ze%7I`rMl*ncQ1PXH(*Bk}JEcXdx5vekvA-Yw^kvYkx|7 zOx)0tvqlC;w$Irj=^^l_RXGdD0{QZ6f9)=3L1jjinN}ywK;KB#W8%1G_4ZrAe&jA)s?Hk_LKoDT3?T>n!+8mHg zZLjSYJRb-F?6H09{iexw-S&xhUz20{EVOeD`su0!Z8{{7&Yo5Ij@;GDdw0kBV54YKM zBnaII4Wm6}ngfEUD|htmGVVpq40X$4IunlTxjGet)ZK>qmUw2e9WnFuHF2EUH^l^H zeWe#EGg{*|cpaj-^7@vFk?=>p8gz>E$cb#CXiwtH3 zPkEO~W0xgiabSm*IULHLDWDqIka{Lw;w>3y#%-p>|KC{M-&75}|H^Z#9l`N{vl2C& zsjhvk!44V@$710K?ue|ebbUjd@4F_Pa}Ry{uYV<)UM<8-!};}~;e?Wg^LTRfFZd(+ ASO5S3