From 1c0a9314f85fa6482ccb24676dffbecf39a61584 Mon Sep 17 00:00:00 2001 From: Smileynator Date: Thu, 19 Jun 2025 17:17:05 +0200 Subject: [PATCH] Decompile sub_19048, IdlePinballGameMain, sub_19190, sub_19288 and sub_19304 (#114) * decompile IdlePinballGameMain documented gMain.subState Broken state due to gIdlePinballGameStateFuncs definition * Fixed definition of gIdlePinballGameStateFuncs * Decimpile sub_19048 * Decomp sub_19190 * Fixed the io_reg macro name for joystick without LR as an input check. * used proper macro's for field checks * Decompile sub_19288 and sub_19304 * cleanup --------- Co-authored-by: Marcus Huderle --- asm/rom_11B9C.s | 373 +------------------------------------ include/constants/fields.h | 13 +- include/functions.h | 17 +- include/gba/io_reg.h | 3 +- include/global.h | 13 +- include/main.h | 2 +- ld_script.txt | 2 +- src/pinball_game_main.c | 1 + src/rom_18784.c | 149 +++++++++++++++ 9 files changed, 186 insertions(+), 387 deletions(-) diff --git a/asm/rom_11B9C.s b/asm/rom_11B9C.s index a00ace9..9de0cac 100644 --- a/asm/rom_11B9C.s +++ b/asm/rom_11B9C.s @@ -9523,378 +9523,7 @@ _08018778: .4byte 0x000004B4 _0801877C: .4byte 0x000004B6 _08018780: .4byte 0x000004A4 - .section .text19028 - - thumb_func_start IdlePinballGameMain -IdlePinballGameMain: @ 0x08019028 - push {lr} - ldr r1, _08019040 @ =gIdlePinballGameStateFuncs - ldr r0, _08019044 @ =gMain - ldrb r0, [r0, #3] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r0, [r0] - bl _call_via_r0 - pop {r0} - bx r0 - .align 2, 0 -_08019040: .4byte gIdlePinballGameStateFuncs -_08019044: .4byte gMain - - thumb_func_start sub_19048 -sub_19048: @ 0x08019048 - push {r4, r5, lr} - ldr r1, _080190A4 @ =gMain - movs r2, #0 - str r2, [r1, #0x54] - movs r0, #1 - strb r0, [r1, #0xd] - ldr r0, _080190A8 @ =gUnknown_02031510 - str r2, [r0] - adds r5, r1, #0 - ldr r4, _080190AC @ =gUnknown_02031520 - adds r3, r5, #7 -_0801905E: - lsls r0, r2, #0x10 - asrs r0, r0, #0x10 - adds r2, r0, r4 - adds r1, r0, r3 - ldrb r1, [r1] - strb r1, [r2] - adds r0, #1 - lsls r0, r0, #0x10 - lsrs r2, r0, #0x10 - asrs r0, r0, #0x10 - cmp r0, #4 - ble _0801905E - adds r4, r5, #0 - ldrh r0, [r4, #0x30] - cmp r0, #0 - bne _0801908E - bl Random - ldr r1, [r4, #0x4c] - adds r0, r0, r1 - movs r1, #0x1e - bl __umodsi3 - strh r0, [r4, #0x30] -_0801908E: - ldrh r4, [r5, #0x30] - movs r0, #3 - ands r4, r0 - adds r0, r4, #0 - cmp r0, #1 - beq _080190D8 - cmp r0, #1 - bgt _080190B0 - cmp r0, #0 - beq _080190BA - b _0801911E - .align 2, 0 -_080190A4: .4byte gMain -_080190A8: .4byte gUnknown_02031510 -_080190AC: .4byte gUnknown_02031520 -_080190B0: - cmp r0, #2 - beq _080190F4 - cmp r0, #3 - beq _08019110 - b _0801911E -_080190BA: - ldr r1, _080190C8 @ =gUnknown_02031520 - ldr r0, _080190CC @ =0x00000A14 - strh r0, [r1, #6] - ldr r0, _080190D0 @ =gUnknown_081450F4 - str r0, [r1, #0x10] - ldr r0, _080190D4 @ =gUnknown_081531F4 - b _0801911C - .align 2, 0 -_080190C8: .4byte gUnknown_02031520 -_080190CC: .4byte 0x00000A14 -_080190D0: .4byte gUnknown_081450F4 -_080190D4: .4byte gUnknown_081531F4 -_080190D8: - ldr r1, _080190E8 @ =gUnknown_02031520 - movs r0, #0xf0 - lsls r0, r0, #4 - strh r0, [r1, #6] - ldr r0, _080190EC @ =gUnknown_0814F9B4 - str r0, [r1, #0x10] - ldr r0, _080190F0 @ =gUnknown_08156E60 - b _0801911C - .align 2, 0 -_080190E8: .4byte gUnknown_02031520 -_080190EC: .4byte gUnknown_0814F9B4 -_080190F0: .4byte gUnknown_08156E60 -_080190F4: - ldr r1, _08019104 @ =gUnknown_02031520 - movs r0, #0xd2 - lsls r0, r0, #4 - strh r0, [r1, #6] - ldr r0, _08019108 @ =gUnknown_08148934 - str r0, [r1, #0x10] - ldr r0, _0801910C @ =gUnknown_08154618 - b _0801911C - .align 2, 0 -_08019104: .4byte gUnknown_02031520 -_08019108: .4byte gUnknown_08148934 -_0801910C: .4byte gUnknown_08154618 -_08019110: - ldr r1, _08019134 @ =gUnknown_02031520 - ldr r0, _08019138 @ =0x00000E4C - strh r0, [r1, #6] - ldr r0, _0801913C @ =gUnknown_0814C174 - str r0, [r1, #0x10] - ldr r0, _08019140 @ =gUnknown_08155A3C -_0801911C: - str r0, [r1, #0xc] -_0801911E: - bl sub_49ED4 - adds r1, r4, #0 - cmp r1, #1 - beq _0801914E - cmp r1, #1 - bgt _08019144 - cmp r1, #0 - beq _08019156 - b _08019164 - .align 2, 0 -_08019134: .4byte gUnknown_02031520 -_08019138: .4byte 0x00000E4C -_0801913C: .4byte gUnknown_0814C174 -_08019140: .4byte gUnknown_08155A3C -_08019144: - cmp r1, #2 - beq _08019156 - cmp r1, #3 - beq _0801915E - b _08019164 -_0801914E: - movs r0, MUS_FIELD_SAPPHIRE - bl m4aSongNumStart - b _08019164 -_08019156: - movs r0, MUS_FIELD_RUBY - bl m4aSongNumStart - b _08019164 -_0801915E: - movs r0, MUS_FIELD_SAPPHIRE - bl m4aSongNumStart -_08019164: - ldr r3, _08019188 @ =gUnknown_02031520 - ldr r1, _0801918C @ =gMain+0x74 - movs r0, #0xcd - adds r0, r0, r1 - mov ip, r0 - ldrb r0, [r0] - movs r2, #0 - strb r0, [r3, #5] - mov r0, ip - strb r2, [r0] - subs r1, #0x74 - ldrh r0, [r1, #0x30] - adds r0, #1 - strh r0, [r1, #0x30] - pop {r4, r5} - pop {r0} - bx r0 - .align 2, 0 -_08019188: .4byte gUnknown_02031520 -_0801918C: .4byte gMain+0x74 - - thumb_func_start sub_19190 -sub_19190: @ 0x08019190 - push {r4, r5, lr} - ldr r0, _080191A8 @ =gCurrentPinballGame - ldr r2, [r0] - ldrb r1, [r2, #0x1d] - cmp r1, #1 - beq _080191C0 - cmp r1, #1 - bgt _080191AC - cmp r1, #0 - beq _080191B2 - b _0801927C - .align 2, 0 -_080191A8: .4byte gCurrentPinballGame -_080191AC: - cmp r1, #2 - beq _08019274 - b _0801927C -_080191B2: - movs r0, #1 - strb r0, [r2, #0x1d] - ldr r0, _080191BC @ =gMain - strb r1, [r0, #0xe] - b _0801927C - .align 2, 0 -_080191BC: .4byte gMain -_080191C0: - ldr r0, _080191D0 @ =gMain - ldrb r0, [r0, #4] - cmp r0, #1 - bhi _080191D4 - bl sub_4ACF0 - b _080191D8 - .align 2, 0 -_080191D0: .4byte gMain -_080191D4: - bl sub_4B000 -_080191D8: - ldr r3, _08019214 @ =gMain - ldr r0, [r3, #0x54] - ldr r1, _08019218 @ =gUnknown_02031520 - movs r4, #6 - ldrsh r2, [r1, r4] - adds r1, r0, #0 - adds r0, #1 - str r0, [r3, #0x54] - cmp r1, r2 - bls _080191F0 - movs r0, #1 - strb r0, [r3, #0xe] -_080191F0: - ldrb r0, [r3, #0x1c] - cmp r0, #0 - beq _080191FA - movs r0, #1 - strb r0, [r3, #0xe] -_080191FA: - ldrb r0, [r3, #0xe] - cmp r0, #0 - beq _0801927C - ldrb r0, [r3, #4] - cmp r0, #1 - bhi _0801921C - bl sub_1D4D0 - movs r0, #0 - bl sub_31BE8 - b _08019224 - .align 2, 0 -_08019214: .4byte gMain -_08019218: .4byte gUnknown_02031520 -_0801921C: - cmp r0, #3 - bne _08019224 - bl sub_356A0 -_08019224: - ldr r4, _0801925C @ =gMain - ldrb r1, [r4, #0xf] - movs r3, #2 - adds r0, r3, #0 - ands r0, r1 - ldr r2, _08019260 @ =gCurrentPinballGame - cmp r0, #0 - beq _08019248 - ldr r1, _08019264 @ =0x040000D4 - ldr r0, [r2] - ldr r5, _08019268 @ =0x0000111A - adds r0, r0, r5 - str r0, [r1] - ldr r0, _0801926C @ =0x05000200 - str r0, [r1, #4] - ldr r0, _08019270 @ =0x80000100 - str r0, [r1, #8] - ldr r0, [r1, #8] -_08019248: - ldr r0, [r2] - strb r3, [r0, #0x1d] - ldrb r0, [r4, #0xe] - cmp r0, #2 - bne _0801927C - movs r0, #1 - bl sub_4B408 - b _0801927C - .align 2, 0 -_0801925C: .4byte gMain -_08019260: .4byte gCurrentPinballGame -_08019264: .4byte 0x040000D4 -_08019268: .4byte 0x0000111A -_0801926C: .4byte 0x05000200 -_08019270: .4byte 0x80000100 -_08019274: - ldr r1, _08019284 @ =gMain - ldrb r0, [r1, #3] - adds r0, #1 - strb r0, [r1, #3] -_0801927C: - pop {r4, r5} - pop {r0} - bx r0 - .align 2, 0 -_08019284: .4byte gMain - - thumb_func_start sub_19288 -sub_19288: @ 0x08019288 - push {r4, r5, lr} - ldr r1, _080192E0 @ =gMain - adds r2, r1, #0 - adds r2, #0x36 - movs r0, #0 - strb r0, [r2] - ldr r2, _080192E4 @ =gUnknown_02031520 - ldrb r0, [r2, #5] - ldr r4, _080192E8 @ =0x00000141 - adds r3, r1, r4 - strb r0, [r3] - movs r3, #0 - adds r5, r1, #7 - adds r4, r2, #0 -_080192A4: - lsls r0, r3, #0x10 - asrs r0, r0, #0x10 - adds r2, r0, r5 - adds r1, r0, r4 - ldrb r1, [r1] - strb r1, [r2] - adds r0, #1 - lsls r0, r0, #0x10 - lsrs r3, r0, #0x10 - asrs r0, r0, #0x10 - cmp r0, #4 - ble _080192A4 - bl sub_02B4 - bl m4aMPlayAllStop - bl sub_0D10 - ldr r2, _080192E0 @ =gMain - ldr r0, _080192E4 @ =gUnknown_02031520 - movs r3, #6 - ldrsh r1, [r0, r3] - ldr r0, [r2, #0x54] - cmp r0, r1 - bhs _080192EC - movs r0, STATE_TITLE - bl SetMainGameState - b _080192F2 - .align 2, 0 -_080192E0: .4byte gMain -_080192E4: .4byte gUnknown_02031520 -_080192E8: .4byte 0x00000141 -_080192EC: - movs r0, STATE_SCORES_IDLE - bl SetMainGameState -_080192F2: - ldr r1, _08019300 @ =gMain - movs r0, #0 - str r0, [r1, #0x54] - pop {r4, r5} - pop {r0} - bx r0 - .align 2, 0 -_08019300: .4byte gMain - - thumb_func_start sub_19304 -sub_19304: @ 0x08019304 - push {lr} - ldr r0, _08019318 @ =gMain - ldrb r0, [r0, #4] - cmp r0, #1 - bls _08019312 - bl sub_19734 -_08019312: - pop {r0} - bx r0 - .align 2, 0 -_08019318: .4byte gMain + .section .text1931C thumb_func_start sub_1931C sub_1931C: @ 0x0801931C diff --git a/include/constants/fields.h b/include/constants/fields.h index 0a7e8fe..43021af 100644 --- a/include/constants/fields.h +++ b/include/constants/fields.h @@ -4,11 +4,12 @@ #define FIELD_RUBY 0 #define FIELD_SAPPHIRE 1 #define MAIN_FIELD_COUNT 2 -#define FIELD_DUSCLOPS (MAIN_FIELD_COUNT + 0) -#define FIELD_KECLEON (MAIN_FIELD_COUNT + 1) -#define FIELD_KYOGRE (MAIN_FIELD_COUNT + 2) -#define FIELD_GROUDON (MAIN_FIELD_COUNT + 3) -#define FIELD_RAYQUAZA (MAIN_FIELD_COUNT + 4) -#define FIELD_SPHEAL (MAIN_FIELD_COUNT + 5) +#define FIELD_BONUS_START 2 +#define FIELD_DUSCLOPS (FIELD_BONUS_START + 0) +#define FIELD_KECLEON (FIELD_BONUS_START + 1) +#define FIELD_KYOGRE (FIELD_BONUS_START + 2) +#define FIELD_GROUDON (FIELD_BONUS_START + 3) +#define FIELD_RAYQUAZA (FIELD_BONUS_START + 4) +#define FIELD_SPHEAL (FIELD_BONUS_START + 5) #endif // GUARD_CONSTANTS_FIELDS_H diff --git a/include/functions.h b/include/functions.h index 7e5404b..4a72615 100644 --- a/include/functions.h +++ b/include/functions.h @@ -409,15 +409,16 @@ extern void sub_18AE0(u8, u16*, u16*); extern s16 sub_18B50(struct Vector16*, u16*); extern void sub_18DAC(struct Vector16*, u16*, u8*); extern void sub_18F38(u8, u16*, u16*); -//extern ? IdlePinballGameMain(); -//extern ? sub_19048(); -//extern ? sub_19190(); -//extern ? sub_19288(); +extern void IdlePinballGameMain(); +extern void sub_19048();//gMain.subState = 0 +extern void sub_19190();//gMain.subState = 1 +extern void sub_4ABC8();//gMain.subState = 2 +extern void sub_19288();//gMain.subState = 3 //extern ? sub_19304(); //extern ? sub_1931C(); //extern ? sub_19490(); //extern ? sub_195C4(); -//extern ? sub_19734(); +extern void sub_19734(); //extern ? sub_19894(); //extern ? sub_19A20(); //extern ? sub_19B10(); @@ -447,6 +448,7 @@ extern void sub_1C5AC(); //extern ? sub_1C73C(); extern void sub_1C7F4(u16, u16); extern void sub_1D128(); +extern void sub_1D4D0(); //extern ? sub_1D5D8(); //extern ? sub_1DA74(); //extern ? sub_1DAD8(); @@ -578,6 +580,7 @@ extern void sub_340EC(); extern void sub_34450(); extern void sub_350F0(); extern void sub_351A8(); +extern void sub_356A0(); //extern ? sub_357B8(); //extern ? sub_35860(); //extern ? sub_35AA4(); @@ -636,8 +639,12 @@ extern void sub_472E4(); //extern ? sub_497BC(); //extern ? sub_49850(); //extern ? sub_49A34(); +extern void sub_4ACF0(); +extern void sub_4B000(); +extern void sub_4B408(s16); //extern ? sub_4CEA8(); //extern ? sub_4CEB4(); +extern void sub_49ED4(void); //extern ? sub_4D3D0(); //extern ? sub_4D648(); //extern ? sub_4D6C4(); diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h index 1d14aee..2eb9a9d 100644 --- a/include/gba/io_reg.h +++ b/include/gba/io_reg.h @@ -700,7 +700,8 @@ #define KEY_OR_INTR 0x0000 #define KEY_AND_INTR 0x8000 #define DPAD_ANY ((DPAD_RIGHT | DPAD_LEFT | DPAD_UP | DPAD_DOWN)) -#define JOY_EXCL_DPAD 0x030F +#define JOY_EXCL_LR (KEYS_MASK & ~(R_BUTTON | L_BUTTON)) +#define JOY_EXCL_DPAD (KEYS_MASK & ~(DPAD_ANY)) // interrupt flags #define INTR_FLAG_VBLANK (1 << 0) diff --git a/include/global.h b/include/global.h index 33a9cdc..0f3705a 100644 --- a/include/global.h +++ b/include/global.h @@ -506,7 +506,9 @@ struct Unk02031520_unk10 struct Unk02031520 { - /*0x00*/ u8 filler0[0x8]; + /*0x00*/ u8 eReaderBonuses[NUM_EREADER_CARDS]; + /*0x05*/ bool8 rumbleEnabled; + /*0x06*/ s16 unk6; /*0x08*/ s16 unk8; /*0x0A*/ u8 fillerA[0x2]; /*0x0C*/ struct PinballGame *unkC; @@ -530,12 +532,21 @@ struct Unk02031590 }; extern struct PinballGame *gCurrentPinballGame; +extern const StateFunc gIdlePinballGameStateFuncs[]; extern u32 gUnknown_02031510; extern struct Unk02031520 gUnknown_02031520; extern struct Unk02031590 gUnknown_02031590; extern u16 gUnknown_08137B3C[][6][16]; extern const u8 gUnknown_08137E14[][0x20]; extern const u8 gUnknown_08138834[0x2000]; +extern struct Unk02031520_unk10 gUnknown_081450F4; +extern struct Unk02031520_unk10 gUnknown_08148934; +extern struct Unk02031520_unk10 gUnknown_0814C174; +extern struct Unk02031520_unk10 gUnknown_0814F9B4; +extern struct PinballGame gUnknown_081531F4; +extern struct PinballGame gUnknown_08154618; +extern struct PinballGame gUnknown_08155A3C; +extern struct PinballGame gUnknown_08156E60; extern s32 gUnknown_081B36A4[64]; extern s32 gUnknown_082EE0E0[0x3E0]; extern const u16 gUnknown_08391A4C[0x1000]; diff --git a/include/main.h b/include/main.h index 8567af1..7425c98 100644 --- a/include/main.h +++ b/include/main.h @@ -74,7 +74,7 @@ struct Main /*0x48*/ int rngValue; /*0x4C*/ u32 systemFrameCount; /*0x50*/ int fieldFrameCount; - /*0x54*/ u8 filler54[0x4]; + /*0x54*/ u32 unk54; /*0x58*/ u32 unk58; /*0x5C*/ u32 unk5C; diff --git a/ld_script.txt b/ld_script.txt index d8c969a..acac873 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -49,7 +49,7 @@ SECTIONS src/rom_17634.o(.text); asm/rom_11B9C.o(.text176B0); src/rom_18784.o(.text); - asm/rom_11B9C.o(.text19028); + asm/rom_11B9C.o(.text1931C); src/rom_19B64.o(.text); src/rom_19D04.o(.text); asm/rom_11B9C.o(.text19E10); diff --git a/src/pinball_game_main.c b/src/pinball_game_main.c index 7e65677..8cb2e42 100644 --- a/src/pinball_game_main.c +++ b/src/pinball_game_main.c @@ -599,6 +599,7 @@ void sub_4AAD8(void) sub_11FC(); } +//gMain.subState = 2 void sub_4ABC8(void) { sub_111C(); diff --git a/src/rom_18784.c b/src/rom_18784.c index 3e5b728..8a8afc0 100644 --- a/src/rom_18784.c +++ b/src/rom_18784.c @@ -2,6 +2,8 @@ #include "variables.h" #include "types.h" #include "main.h" +#include "m4a.h" +#include "constants/bg_music.h" void sub_18784(u8 arg0) { @@ -374,3 +376,150 @@ void sub_18F38(u8 arg0_enum, u16 *arg1, u16 *arg2) break; } } + +void IdlePinballGameMain(void) +{ + gIdlePinballGameStateFuncs[gMain.subState](); +} + +void sub_19048(void) +{ + s16 i; + s16 unk30; + s8 unk30LowerBits; + + gMain.unk54 = 0; + gMain.unkD = 1; + gUnknown_02031510 = 0; + + for (i = 0; i < NUM_EREADER_CARDS; i++) + gUnknown_02031520.eReaderBonuses[i] = gMain.eReaderBonuses[i]; + + if (gMain.unk30 == 0) + gMain.unk30 = (Random() + gMain.systemFrameCount) % 30; + + unk30 = gMain.unk30; + unk30LowerBits = unk30 & 3; + switch (unk30LowerBits) + { + case 0: + gUnknown_02031520.unk6 = 0xA14; + gUnknown_02031520.unk10 = &gUnknown_081450F4; + gUnknown_02031520.unkC = &gUnknown_081531F4; + break; + case 1: + gUnknown_02031520.unk6 = 0xF00; + gUnknown_02031520.unk10 = &gUnknown_0814F9B4; + gUnknown_02031520.unkC = &gUnknown_08156E60; + break; + case 2: + gUnknown_02031520.unk6 = 0xD20; + gUnknown_02031520.unk10 = &gUnknown_08148934; + gUnknown_02031520.unkC = &gUnknown_08154618; + break; + case 3: + gUnknown_02031520.unk6 = 0xE4C; + gUnknown_02031520.unk10 = &gUnknown_0814C174; + gUnknown_02031520.unkC = &gUnknown_08155A3C; + break; + } + + sub_49ED4(); + + switch (unk30LowerBits) + { + case 0: + m4aSongNumStart(MUS_FIELD_RUBY); + break; + case 1: + m4aSongNumStart(MUS_FIELD_SAPPHIRE); + break; + case 2: + m4aSongNumStart(MUS_FIELD_RUBY); + break; + case 3: + m4aSongNumStart(MUS_FIELD_SAPPHIRE); + break; + } + + gUnknown_02031520.rumbleEnabled = gMain_saveData.rumbleEnabled; + gMain_saveData.rumbleEnabled = 0; + gMain.unk30++; +} + +void sub_19190() +{ + u8 unk1D; + + unk1D = gCurrentPinballGame->unk1D; + switch (unk1D) + { + case 0: + gCurrentPinballGame->unk1D = 1; + gMain.unkE = unk1D; + break; + case 1: + if (gMain.selectedField < MAIN_FIELD_COUNT) + sub_4ACF0(); + else + sub_4B000(); + + if (gMain.unk54++ > gUnknown_02031520.unk6) + gMain.unkE = 1; + + if (gMain.heldKeys & JOY_EXCL_LR) + gMain.unkE = 1; + + if (gMain.unkE != 0) + { + if (gMain.selectedField < MAIN_FIELD_COUNT) + { + sub_1D4D0(); + sub_31BE8(0); + } + else if (gMain.selectedField == FIELD_KECLEON) + { + sub_356A0(); + } + + if ((gMain.unkF & 2) != 0) + { + DmaCopy16(3, gCurrentPinballGame->unk111A, (void *)OBJ_PLTT, OBJ_PLTT_SIZE); + } + + gCurrentPinballGame->unk1D = 2; + if (gMain.unkE == 2) + sub_4B408(1); + } + break; + case 2: + gMain.subState++; + break; + } +} + +void sub_19288(void) +{ + s16 i; + + gMain.unk36 = 0; + gMain_saveData.rumbleEnabled = gUnknown_02031520.rumbleEnabled; + for (i = 0; i < NUM_EREADER_CARDS; i++) + gMain.eReaderBonuses[i] = gUnknown_02031520.eReaderBonuses[i]; + + sub_02B4(); + m4aMPlayAllStop(); + sub_0D10(); + if (gMain.unk54 < gUnknown_02031520.unk6) + SetMainGameState(STATE_TITLE); + else + SetMainGameState(STATE_SCORES_IDLE); + + gMain.unk54 = 0; +} + +void sub_19304(void) +{ + if (gMain.selectedField >= FIELD_BONUS_START) + sub_19734(); +} \ No newline at end of file