From 8b2d19f09668b6e6896021965f493a2fd8d40e08 Mon Sep 17 00:00:00 2001 From: sixtenhugosson Date: Sat, 20 Jan 2024 12:18:57 +0100 Subject: [PATCH] Rewrote the scripting language. --- code/core/core.h | 5 +- code/core/core_math.h | 11 +- code/core/core_memory.cpp | 4 +- code/core/core_memory.h | 4 +- code/core/core_string.cpp | 11 +- code/core/core_string.h | 1 + code/core/core_thread_context.cpp | 10 +- code/generated/vn_assets.meta.c | 11 + code/generated/vn_assets.meta.h | 2 + code/generated/vn_scene.meta.h | 37 - .../{vn_scene.meta.c => vn_scene2.meta.c} | 0 code/generated/vn_scene2.meta.h | 164 +++ code/generated/vn_ui.meta.c | 38 +- code/generated/vn_ui.meta.h | 8 +- code/opengl_render.cpp | 69 +- code/opengl_render.h | 2 +- code/vn.cpp | 47 +- code/vn_animation_curve.cpp | 15 +- code/vn_asset.cpp | 24 +- code/vn_asset.h | 8 +- code/vn_assets.md | 21 +- code/vn_config.cpp | 10 +- code/vn_debug_info.cpp | 10 +- code/vn_font.cpp | 232 +-- code/vn_font.h | 16 +- code/vn_platform.h | 15 +- code/vn_render.cpp | 54 +- code/vn_render.h | 34 +- code/vn_scene.cpp | 1251 ----------------- code/vn_scene.h | 458 ------ code/vn_scene.md | 35 - code/vn_scene2.cpp | 1025 ++++++++++++++ code/vn_scene2.h | 292 ++++ code/vn_scene2.md | 145 ++ code/vn_scene_commands.cpp | 202 +++ code/vn_scene_view.cpp | 531 +++---- code/vn_scene_view.h | 40 +- code/vn_theme_dark.h | 8 +- code/vn_thread_context.h | 61 - code/vn_tokenizer.cpp | 39 +- code/vn_tokenizer.h | 20 +- code/vn_ui.cpp | 140 +- code/vn_ui.h | 46 +- code/vn_ui.md | 8 +- code/vn_ui_utils.cpp | 24 +- code/vn_ui_utils.h | 7 +- code/vn_workspace.cpp | 397 +++--- code/vn_workspace.h | 29 +- code/vn_workspace_commands.cpp | 2 +- code/vn_workspace_file_lister.cpp | 30 +- code/vn_workspace_nav_editor.cpp | 8 +- code/vn_workspace_text_editor.cpp | 575 ++++---- code/vn_workspace_text_editor.h | 22 +- code/vn_workspace_view.cpp | 90 +- code/vn_workspace_view.h | 9 +- code/win32__main.rdbg | Bin 485 -> 739 bytes code/win32_main.cpp | 56 +- config.vn | 2 +- data/fonts/fallback.ttf | Bin 0 -> 806504 bytes data/new_dialog.vns | 33 + data/proc_test.vns | 10 + data/scene.vnn | Bin 184 -> 0 bytes data/scene.vns | 55 - data/while_test.vns | 18 + 64 files changed, 3361 insertions(+), 3170 deletions(-) delete mode 100644 code/generated/vn_scene.meta.h rename code/generated/{vn_scene.meta.c => vn_scene2.meta.c} (100%) create mode 100644 code/generated/vn_scene2.meta.h delete mode 100644 code/vn_scene.cpp delete mode 100644 code/vn_scene.h delete mode 100644 code/vn_scene.md create mode 100644 code/vn_scene2.cpp create mode 100644 code/vn_scene2.h create mode 100644 code/vn_scene2.md create mode 100644 code/vn_scene_commands.cpp delete mode 100644 code/vn_thread_context.h create mode 100644 data/fonts/fallback.ttf create mode 100644 data/new_dialog.vns create mode 100644 data/proc_test.vns delete mode 100644 data/scene.vnn delete mode 100644 data/scene.vns create mode 100644 data/while_test.vns diff --git a/code/core/core.h b/code/core/core.h index 21c05f9..22916ee 100644 --- a/code/core/core.h +++ b/code/core/core.h @@ -177,9 +177,8 @@ do { (Sentinel)->Next = (Sentinel); (Sentinel)->Prev = (Sentinel); } while(0) (Element)->Prev->Next = (Element); #define SenDLLRemove(Element)\ -auto __Temp = (Element)->Next->Prev;\ -(Element)->Next->Prev = (Element)->Prev->Next;\ -(Element)->Prev->Next = __Temp; +(Element)->Next->Prev = (Element)->Prev;\ +(Element)->Prev->Next = (Element)->Next; #define SenDLLIsEmpty(Sentinel)\ ((Sentinel)->Next==(Sentinel)) diff --git a/code/core/core_math.h b/code/core/core_math.h index 92d50ca..6cf291c 100644 --- a/code/core/core_math.h +++ b/code/core/core_math.h @@ -4,6 +4,7 @@ #define CORE_MATH_H #include +#include //- sixten: Constants @@ -374,14 +375,4 @@ inline v2_s64 DimOfRange(range2_s64 Range); inline range2_s64 Intersection(range2_s64 A, range2_s64 B); inline v2_s64 CornerFromRange(range2_s64 Range, corner Corner); -//- sixten: Shorthand base types - -typedef v2_r32 v2; -typedef v3_r32 v3; -typedef v4_r32 v4; - -#define V2(...) V2R32(__VA_ARGS__) -#define V3(...) V3R32(__VA_ARGS__) -#define V4(...) V4R32(__VA_ARGS__) - #endif //CORE_MATH_H diff --git a/code/core/core_memory.cpp b/code/core/core_memory.cpp index df83f2b..748bf10 100644 --- a/code/core/core_memory.cpp +++ b/code/core/core_memory.cpp @@ -49,7 +49,7 @@ static void Fill(void *Dest, u8 Value, umm Count) //////////////////////////////// //- sixten: Memory Arena Functions -static arena *ArenaAlloc(u64 Size, b32 Chaining) +static arena *ArenaAlloc(u64 Size, b32 Chaining, char *Format, ...) { arena *Arena = 0; if(Chaining) @@ -113,7 +113,7 @@ static void *ArenaPushNoClear(arena *Arena, u64 Size) arena *Target = Arena->Prev; // sixten: We always append to the end of the list. if(Target->Position + Size + Arena->Align > Target->Size) { - arena *New = ArenaAlloc(Arena->Size, true); + arena *New = ArenaAlloc(Arena->Size, true, "Chain"); New->NotFirst = true; SenDLLInsertLast(Arena, New); Target = New; diff --git a/code/core/core_memory.h b/code/core/core_memory.h index c418c0b..582bd95 100644 --- a/code/core/core_memory.h +++ b/code/core/core_memory.h @@ -40,7 +40,7 @@ struct arena u64 Align; b32 Chaining; b32 NotFirst; - arena *Next; + arena *Next; arena *Prev; }; @@ -58,7 +58,7 @@ struct temp //////////////////////////////// //- sixten: Memory Arena Functions -static arena *ArenaAlloc(u64 Size, b32 Chaining = false); +static arena *ArenaAlloc(u64 Size, b32 Chaining, char *Format, ...); static void ArenaRelease(arena *Arena); static void *ArenaPushNoClear(arena *Arena, u64 Size); static void *ArenaPush(arena *Arena, u64 Size); diff --git a/code/core/core_string.cpp b/code/core/core_string.cpp index e2ed906..97ca961 100644 --- a/code/core/core_string.cpp +++ b/code/core/core_string.cpp @@ -212,12 +212,15 @@ static string PushFormatVariadic(arena *Arena, char *Format, va_list Arguments) string Result; Result.Count = stbsp_vsnprintf(0, 0, Format, ArgumentsCopy); + + va_end(ArgumentsCopy); + Result.Data = PushArrayNoClear(Arena, u8, Result.Count + 1); Result.Data[Result.Count] = 0; - - stbsp_vsnprintf((char *)Result.Data, (s32)Result.Count + 1, Format, Arguments); - - return(Result); + + stbsp_vsnprintf((char *)Result.Data, (s32)Result.Count + 1, Format, Arguments); + + return(Result); } static string PushFormat(arena *Arena, char *Format, ...) diff --git a/code/core/core_string.h b/code/core/core_string.h index ba74011..5e395dd 100644 --- a/code/core/core_string.h +++ b/code/core/core_string.h @@ -53,6 +53,7 @@ inline string MakeString(u8 *Data, s64 Count); inline string MakeString(u8 *Start, u8 *End); inline string MakeString(char *CString); #define StrLit(String) MakeString((u8 *)String, (s64)(ArrayCount(String) - 1)) +#define StrComp(String) {(s64)(ArrayCount(String) - 1), (u8 *)String} inline string16 MakeString16(u16 *Data, s64 Count); diff --git a/code/core/core_thread_context.cpp b/code/core/core_thread_context.cpp index c589605..91bd5f7 100644 --- a/code/core/core_thread_context.cpp +++ b/code/core/core_thread_context.cpp @@ -5,7 +5,7 @@ static thread_context AllocateThreadContext(void) thread_context Context = {}; for(s64 ArenaIndex = 0; ArenaIndex < ArrayCount(Context.Arenas); ArenaIndex += 1) { - Context.Arenas[ArenaIndex] = ArenaAlloc(Megabytes(2), true); + Context.Arenas[ArenaIndex] = ArenaAlloc(Megabytes(2), true, "Scratch Arena %i", ArenaIndex); } return(Context); } @@ -26,13 +26,13 @@ static temp GetScratch(arena **Conflicts, u64 ConflictCount) thread_context *Context = GetThreadContext(); for(u64 ArenaIndex = 0; - ArenaIndex < ArrayCount(Context->Arenas); - ++ArenaIndex) + ArenaIndex < ArrayCount(Context->Arenas); + ++ArenaIndex) { b32 FoundConflict = false; for(u64 ConflictIndex = 0; - ConflictIndex < ConflictCount; - ++ConflictIndex) + ConflictIndex < ConflictCount; + ++ConflictIndex) { arena *Conflict = Conflicts[ConflictIndex]; if(Conflict == Context->Arenas[ArenaIndex]) diff --git a/code/generated/vn_assets.meta.c b/code/generated/vn_assets.meta.c index 809b35b..939ad01 100644 --- a/code/generated/vn_assets.meta.c +++ b/code/generated/vn_assets.meta.c @@ -31,3 +31,14 @@ char * AssetNameLUT[7] = "MonikaLeaning", }; +r32 AssetScaleLUT[7] = +{ +0, +0, +1, +1, +0.017, +0.017, +0.033, +}; + diff --git a/code/generated/vn_assets.meta.h b/code/generated/vn_assets.meta.h index 241079c..0233f87 100644 --- a/code/generated/vn_assets.meta.h +++ b/code/generated/vn_assets.meta.h @@ -4,6 +4,8 @@ extern bool AssetIsPermanentLUT[7]; extern char * AssetNameLUT[7]; +extern r32 AssetScaleLUT[7]; + typedef s32 asset_id; enum { diff --git a/code/generated/vn_scene.meta.h b/code/generated/vn_scene.meta.h deleted file mode 100644 index b51e3b0..0000000 --- a/code/generated/vn_scene.meta.h +++ /dev/null @@ -1,37 +0,0 @@ -enum scene_operator -{ -S_Operator_Invalid, -S_Operator_Not, -S_Operator_Equal, -S_Operator_Equals, -S_Operator_NotEquals, -S_Operator_GreaterThanOrEquals, -S_Operator_LessThanOrEquals, -S_Operator_Greater, -S_Operator_Less, -S_Operator_Add, -S_Operator_Minus, -S_Operator_Multiply, -S_Operator_Divide, -}; - -inline scene_operator S_OperatorFromString(string String) -{ -scene_operator Result = S_Operator_Invalid; -if(0) {} -else if(AreEqual(String, StrLit("###"))) { Result = S_Operator_Invalid; } -else if(AreEqual(String, StrLit("!"))) { Result = S_Operator_Not; } -else if(AreEqual(String, StrLit("="))) { Result = S_Operator_Equal; } -else if(AreEqual(String, StrLit("=="))) { Result = S_Operator_Equals; } -else if(AreEqual(String, StrLit("!="))) { Result = S_Operator_NotEquals; } -else if(AreEqual(String, StrLit(">="))) { Result = S_Operator_GreaterThanOrEquals; } -else if(AreEqual(String, StrLit("<="))) { Result = S_Operator_LessThanOrEquals; } -else if(AreEqual(String, StrLit(">"))) { Result = S_Operator_Greater; } -else if(AreEqual(String, StrLit("<"))) { Result = S_Operator_Less; } -else if(AreEqual(String, StrLit("+"))) { Result = S_Operator_Add; } -else if(AreEqual(String, StrLit("-"))) { Result = S_Operator_Minus; } -else if(AreEqual(String, StrLit("*"))) { Result = S_Operator_Multiply; } -else if(AreEqual(String, StrLit("/"))) { Result = S_Operator_Divide; } -return(Result); -} - diff --git a/code/generated/vn_scene.meta.c b/code/generated/vn_scene2.meta.c similarity index 100% rename from code/generated/vn_scene.meta.c rename to code/generated/vn_scene2.meta.c diff --git a/code/generated/vn_scene2.meta.h b/code/generated/vn_scene2.meta.h new file mode 100644 index 0000000..474efb1 --- /dev/null +++ b/code/generated/vn_scene2.meta.h @@ -0,0 +1,164 @@ +enum scene2_opcode +{ +S2_Op_None, // does nothing (effectivly a nop) +S2_Op_Call, // stages runtime hook +S2_Op_Wait, // executes staged actions and waits for user input +S2_Op_Pop, // pops object from stack +S2_Op_PushBool, // pushes a boolean onto the stack +S2_Op_PushNumber, // pushes a number onto the stack +S2_Op_PushString, // pushes a string onto the stack +S2_Op_PushNil, // pushes `nil` onto the stack +S2_Op_PushVariable, // pushes a variable onto the stack +S2_Op_DuplicateStack, // duplicates the top N-most elements of the stack (specified in Arg as u64) +S2_Op_SetVariable, // pops the stack and stores the value in a variable +S2_Op_SetLocal, // defines a locally scoped variable +S2_Op_BeginBlock, // increases the variable stack depth +S2_Op_EndBlock, // decreases the variable stack depth +S2_Op_Jump, // performs a relative jump (specified in Arg as s64) +S2_Op_CondJump, // performs a relative jump (specified in Arg as s64) if the topmost element on the stack is non-zero +S2_Op_Add, // adds the two topmost elements of the stack +S2_Op_Subtract, // subtracts the topmost element of the stack by the second topmost element +S2_Op_Multiply, // multiplies the two topmost elements of the stack +S2_Op_Divide, // divides the topmost element of the stack by the second topmost element +S2_Op_Equals, // +S2_Op_Greater, // +S2_Op_Less, // +S2_Op_Not, // performs a not operation on the topmost element of the stack +S2_Op_Negate, // negates the topmost element of the stack +S2_Op_COUNT, +}; + +global read_only string S2_InstructionInfoLookup[] = +{ +StrComp("None"), +StrComp("Call"), +StrComp("Wait"), +StrComp("Pop"), +StrComp("PushBool"), +StrComp("PushNumber"), +StrComp("PushString"), +StrComp("PushNil"), +StrComp("PushVariable"), +StrComp("DuplicateStack"), +StrComp("SetVariable"), +StrComp("SetLocal"), +StrComp("BeginBlock"), +StrComp("EndBlock"), +StrComp("Jump"), +StrComp("CondJump"), +StrComp("Add"), +StrComp("Subtract"), +StrComp("Multiply"), +StrComp("Divide"), +StrComp("Equals"), +StrComp("Greater"), +StrComp("Less"), +StrComp("Not"), +StrComp("Negate"), +}; + +global read_only string S2_InstructionNameLookup[] = +{ +StrComp("does nothing (effectivly a nop)"), +StrComp("stages runtime hook"), +StrComp("executes staged actions and waits for user input"), +StrComp("pops object from stack"), +StrComp("pushes a boolean onto the stack"), +StrComp("pushes a number onto the stack"), +StrComp("pushes a string onto the stack"), +StrComp("pushes `nil` onto the stack"), +StrComp("pushes a variable onto the stack"), +StrComp("duplicates the top N-most elements of the stack (specified in Arg as u64)"), +StrComp("pops the stack and stores the value in a variable"), +StrComp("defines a locally scoped variable"), +StrComp("increases the variable stack depth"), +StrComp("decreases the variable stack depth"), +StrComp("performs a relative jump (specified in Arg as s64)"), +StrComp("performs a relative jump (specified in Arg as s64) if the topmost element on the stack is non-zero"), +StrComp("adds the two topmost elements of the stack"), +StrComp("subtracts the topmost element of the stack by the second topmost element"), +StrComp("multiplies the two topmost elements of the stack"), +StrComp("divides the topmost element of the stack by the second topmost element"), +StrComp(""), +StrComp(""), +StrComp(""), +StrComp("performs a not operation on the topmost element of the stack"), +StrComp("negates the topmost element of the stack"), +}; + +enum scene2_operator +{ +S2_Operator_Invalid, +S2_Operator_Not, +S2_Operator_Equal, +S2_Operator_Equals, +S2_Operator_NotEquals, +S2_Operator_GreaterThanOrEquals, +S2_Operator_LessThanOrEquals, +S2_Operator_Greater, +S2_Operator_Less, +S2_Operator_Add, +S2_Operator_Minus, +S2_Operator_Multiply, +S2_Operator_Divide, +}; + +inline scene2_operator S2_OperatorFromString(string String) +{ +scene2_operator Result = S2_Operator_Invalid; +if(0) {} +else if(AreEqual(String, StrLit("###"))) { Result = S2_Operator_Invalid; } +else if(AreEqual(String, StrLit("!"))) { Result = S2_Operator_Not; } +else if(AreEqual(String, StrLit("="))) { Result = S2_Operator_Equal; } +else if(AreEqual(String, StrLit("=="))) { Result = S2_Operator_Equals; } +else if(AreEqual(String, StrLit("!="))) { Result = S2_Operator_NotEquals; } +else if(AreEqual(String, StrLit(">="))) { Result = S2_Operator_GreaterThanOrEquals; } +else if(AreEqual(String, StrLit("<="))) { Result = S2_Operator_LessThanOrEquals; } +else if(AreEqual(String, StrLit(">"))) { Result = S2_Operator_Greater; } +else if(AreEqual(String, StrLit("<"))) { Result = S2_Operator_Less; } +else if(AreEqual(String, StrLit("+"))) { Result = S2_Operator_Add; } +else if(AreEqual(String, StrLit("-"))) { Result = S2_Operator_Minus; } +else if(AreEqual(String, StrLit("*"))) { Result = S2_Operator_Multiply; } +else if(AreEqual(String, StrLit("/"))) { Result = S2_Operator_Divide; } +return(Result); +} + +static S2_CALL_FUNCTION(S2_Call_Stub); // does nothing +static S2_CALL_FUNCTION(S2_Call_StackSanity); // does checks that the stack is at a certain depth +static S2_CALL_FUNCTION(S2_Call_TextAppend); // pops a value and appends it to the textbox +static S2_CALL_FUNCTION(S2_Call_NewLine); // appends a newline to the textbox +static S2_CALL_FUNCTION(S2_Call_TextClear); // clears the textbox +static S2_CALL_FUNCTION(S2_Call_ProcSet); // sets the current proc +static S2_CALL_FUNCTION(S2_Call_CharacterSet); // sets the state of a character +static S2_CALL_FUNCTION(S2_Call_CharacterRemove); // removes a character +static S2_CALL_FUNCTION(S2_Call_CharacterSetTalking); // makes a character talking +static S2_CALL_FUNCTION(S2_Call_CharacterUnsetAllTalking); // makes no characters talking + +global read_only scene2_call_function *S2_CallBindingLookup[] = +{ +S2_Call_Stub, +S2_Call_StackSanity, +S2_Call_TextAppend, +S2_Call_NewLine, +S2_Call_TextClear, +S2_Call_ProcSet, +S2_Call_CharacterSet, +S2_Call_CharacterRemove, +S2_Call_CharacterSetTalking, +S2_Call_CharacterUnsetAllTalking, +}; + +global read_only string S2_CallNameLookup[] = +{ +StrComp("none"), +StrComp("stack_sanity"), +StrComp("text_append"), +StrComp("text_newline"), +StrComp("text_clear"), +StrComp("proc_set"), +StrComp("ctr_set"), +StrComp("ctr_remove"), +StrComp("ctr_set_talking"), +StrComp("ctr_unset_all_talking"), +}; + diff --git a/code/generated/vn_ui.meta.c b/code/generated/vn_ui.meta.c index 9518956..d9c959a 100644 --- a/code/generated/vn_ui.meta.c +++ b/code/generated/vn_ui.meta.c @@ -3,12 +3,12 @@ inline void UI_PushWidth(ui_size Element) { ui *UI = UI_GetState(); Ass inline void UI_PushHeight(ui_size Element) { ui *UI = UI_GetState(); Assert(UI->Stacks.HeightStackUsed + 1 < ArrayCount(UI->Stacks.HeightStack)); UI->Stacks.HeightStack[UI->Stacks.HeightStackUsed++] = Element; } inline void UI_PushFixedX(r32 Element) { ui *UI = UI_GetState(); Assert(UI->Stacks.FixedXStackUsed + 1 < ArrayCount(UI->Stacks.FixedXStack)); UI->Stacks.FixedXStack[UI->Stacks.FixedXStackUsed++] = Element; } inline void UI_PushFixedY(r32 Element) { ui *UI = UI_GetState(); Assert(UI->Stacks.FixedYStackUsed + 1 < ArrayCount(UI->Stacks.FixedYStack)); UI->Stacks.FixedYStack[UI->Stacks.FixedYStackUsed++] = Element; } -inline void UI_PushTextColor(v4 Element) { ui *UI = UI_GetState(); Assert(UI->Stacks.TextColorStackUsed + 1 < ArrayCount(UI->Stacks.TextColorStack)); UI->Stacks.TextColorStack[UI->Stacks.TextColorStackUsed++] = Element; } -inline void UI_PushBackgroundColor(v4 Element) { ui *UI = UI_GetState(); Assert(UI->Stacks.BackgroundColorStackUsed + 1 < ArrayCount(UI->Stacks.BackgroundColorStack)); UI->Stacks.BackgroundColorStack[UI->Stacks.BackgroundColorStackUsed++] = Element; } -inline void UI_PushBorderColor(v4 Element) { ui *UI = UI_GetState(); Assert(UI->Stacks.BorderColorStackUsed + 1 < ArrayCount(UI->Stacks.BorderColorStack)); UI->Stacks.BorderColorStack[UI->Stacks.BorderColorStackUsed++] = Element; } +inline void UI_PushTextColor(v4_r32 Element) { ui *UI = UI_GetState(); Assert(UI->Stacks.TextColorStackUsed + 1 < ArrayCount(UI->Stacks.TextColorStack)); UI->Stacks.TextColorStack[UI->Stacks.TextColorStackUsed++] = Element; } +inline void UI_PushBackgroundColor(v4_r32 Element) { ui *UI = UI_GetState(); Assert(UI->Stacks.BackgroundColorStackUsed + 1 < ArrayCount(UI->Stacks.BackgroundColorStack)); UI->Stacks.BackgroundColorStack[UI->Stacks.BackgroundColorStackUsed++] = Element; } +inline void UI_PushBorderColor(v4_r32 Element) { ui *UI = UI_GetState(); Assert(UI->Stacks.BorderColorStackUsed + 1 < ArrayCount(UI->Stacks.BorderColorStack)); UI->Stacks.BorderColorStack[UI->Stacks.BorderColorStackUsed++] = Element; } inline void UI_PushBorderThickness(r32 Element) { ui *UI = UI_GetState(); Assert(UI->Stacks.BorderThicknessStackUsed + 1 < ArrayCount(UI->Stacks.BorderThicknessStack)); UI->Stacks.BorderThicknessStack[UI->Stacks.BorderThicknessStackUsed++] = Element; } inline void UI_PushLayoutAxis(axis2 Element) { ui *UI = UI_GetState(); Assert(UI->Stacks.LayoutAxisStackUsed + 1 < ArrayCount(UI->Stacks.LayoutAxisStack)); UI->Stacks.LayoutAxisStack[UI->Stacks.LayoutAxisStackUsed++] = Element; } -inline void UI_PushCornerRadius(r32 Element) { ui *UI = UI_GetState(); Assert(UI->Stacks.CornerRadiusStackUsed + 1 < ArrayCount(UI->Stacks.CornerRadiusStack)); UI->Stacks.CornerRadiusStack[UI->Stacks.CornerRadiusStackUsed++] = Element; } +inline void UI_PushCornerRadii(v4_r32 Element) { ui *UI = UI_GetState(); Assert(UI->Stacks.CornerRadiiStackUsed + 1 < ArrayCount(UI->Stacks.CornerRadiiStack)); UI->Stacks.CornerRadiiStack[UI->Stacks.CornerRadiiStackUsed++] = Element; } inline void UI_PushFont(font_id Element) { ui *UI = UI_GetState(); Assert(UI->Stacks.FontStackUsed + 1 < ArrayCount(UI->Stacks.FontStack)); UI->Stacks.FontStack[UI->Stacks.FontStackUsed++] = Element; } inline void UI_PushFontSize(r32 Element) { ui *UI = UI_GetState(); Assert(UI->Stacks.FontSizeStackUsed + 1 < ArrayCount(UI->Stacks.FontSizeStack)); UI->Stacks.FontSizeStack[UI->Stacks.FontSizeStackUsed++] = Element; } inline void UI_PushOffsetX(r32 Element) { ui *UI = UI_GetState(); Assert(UI->Stacks.OffsetXStackUsed + 1 < ArrayCount(UI->Stacks.OffsetXStack)); UI->Stacks.OffsetXStack[UI->Stacks.OffsetXStackUsed++] = Element; } @@ -24,7 +24,7 @@ inline void UI_PopBackgroundColor(void) { ui *UI = UI_GetState(); Ass inline void UI_PopBorderColor(void) { ui *UI = UI_GetState(); Assert(UI->Stacks.BorderColorStackUsed > 0); --UI->Stacks.BorderColorStackUsed; } inline void UI_PopBorderThickness(void) { ui *UI = UI_GetState(); Assert(UI->Stacks.BorderThicknessStackUsed > 0); --UI->Stacks.BorderThicknessStackUsed; } inline void UI_PopLayoutAxis(void) { ui *UI = UI_GetState(); Assert(UI->Stacks.LayoutAxisStackUsed > 0); --UI->Stacks.LayoutAxisStackUsed; } -inline void UI_PopCornerRadius(void) { ui *UI = UI_GetState(); Assert(UI->Stacks.CornerRadiusStackUsed > 0); --UI->Stacks.CornerRadiusStackUsed; } +inline void UI_PopCornerRadii(void) { ui *UI = UI_GetState(); Assert(UI->Stacks.CornerRadiiStackUsed > 0); --UI->Stacks.CornerRadiiStackUsed; } inline void UI_PopFont(void) { ui *UI = UI_GetState(); Assert(UI->Stacks.FontStackUsed > 0); --UI->Stacks.FontStackUsed; } inline void UI_PopFontSize(void) { ui *UI = UI_GetState(); Assert(UI->Stacks.FontSizeStackUsed > 0); --UI->Stacks.FontSizeStackUsed; } inline void UI_PopOffsetX(void) { ui *UI = UI_GetState(); Assert(UI->Stacks.OffsetXStackUsed > 0); --UI->Stacks.OffsetXStackUsed; } @@ -35,12 +35,12 @@ inline void UI_SetNextWidth(ui_size Element) { ui *UI = UI_GetState(); UI_PushWi inline void UI_SetNextHeight(ui_size Element) { ui *UI = UI_GetState(); UI_PushHeight(Element); UI->Stacks.AutoPopHeight = true; } inline void UI_SetNextFixedX(r32 Element) { ui *UI = UI_GetState(); UI_PushFixedX(Element); UI->Stacks.AutoPopFixedX = true; } inline void UI_SetNextFixedY(r32 Element) { ui *UI = UI_GetState(); UI_PushFixedY(Element); UI->Stacks.AutoPopFixedY = true; } -inline void UI_SetNextTextColor(v4 Element) { ui *UI = UI_GetState(); UI_PushTextColor(Element); UI->Stacks.AutoPopTextColor = true; } -inline void UI_SetNextBackgroundColor(v4 Element) { ui *UI = UI_GetState(); UI_PushBackgroundColor(Element); UI->Stacks.AutoPopBackgroundColor = true; } -inline void UI_SetNextBorderColor(v4 Element) { ui *UI = UI_GetState(); UI_PushBorderColor(Element); UI->Stacks.AutoPopBorderColor = true; } +inline void UI_SetNextTextColor(v4_r32 Element) { ui *UI = UI_GetState(); UI_PushTextColor(Element); UI->Stacks.AutoPopTextColor = true; } +inline void UI_SetNextBackgroundColor(v4_r32 Element) { ui *UI = UI_GetState(); UI_PushBackgroundColor(Element); UI->Stacks.AutoPopBackgroundColor = true; } +inline void UI_SetNextBorderColor(v4_r32 Element) { ui *UI = UI_GetState(); UI_PushBorderColor(Element); UI->Stacks.AutoPopBorderColor = true; } inline void UI_SetNextBorderThickness(r32 Element) { ui *UI = UI_GetState(); UI_PushBorderThickness(Element); UI->Stacks.AutoPopBorderThickness = true; } inline void UI_SetNextLayoutAxis(axis2 Element) { ui *UI = UI_GetState(); UI_PushLayoutAxis(Element); UI->Stacks.AutoPopLayoutAxis = true; } -inline void UI_SetNextCornerRadius(r32 Element) { ui *UI = UI_GetState(); UI_PushCornerRadius(Element); UI->Stacks.AutoPopCornerRadius = true; } +inline void UI_SetNextCornerRadii(v4_r32 Element) { ui *UI = UI_GetState(); UI_PushCornerRadii(Element); UI->Stacks.AutoPopCornerRadii = true; } inline void UI_SetNextFont(font_id Element) { ui *UI = UI_GetState(); UI_PushFont(Element); UI->Stacks.AutoPopFont = true; } inline void UI_SetNextFontSize(r32 Element) { ui *UI = UI_GetState(); UI_PushFontSize(Element); UI->Stacks.AutoPopFontSize = true; } inline void UI_SetNextOffsetX(r32 Element) { ui *UI = UI_GetState(); UI_PushOffsetX(Element); UI->Stacks.AutoPopOffsetX = true; } @@ -51,12 +51,12 @@ inline ui_size UI_FirstWidth(void) { ui *UI = UI_GetState(); return(UI->Stacks.W inline ui_size UI_FirstHeight(void) { ui *UI = UI_GetState(); return(UI->Stacks.HeightStack[0]); } inline r32 UI_FirstFixedX(void) { ui *UI = UI_GetState(); return(UI->Stacks.FixedXStack[0]); } inline r32 UI_FirstFixedY(void) { ui *UI = UI_GetState(); return(UI->Stacks.FixedYStack[0]); } -inline v4 UI_FirstTextColor(void) { ui *UI = UI_GetState(); return(UI->Stacks.TextColorStack[0]); } -inline v4 UI_FirstBackgroundColor(void) { ui *UI = UI_GetState(); return(UI->Stacks.BackgroundColorStack[0]); } -inline v4 UI_FirstBorderColor(void) { ui *UI = UI_GetState(); return(UI->Stacks.BorderColorStack[0]); } +inline v4_r32 UI_FirstTextColor(void) { ui *UI = UI_GetState(); return(UI->Stacks.TextColorStack[0]); } +inline v4_r32 UI_FirstBackgroundColor(void) { ui *UI = UI_GetState(); return(UI->Stacks.BackgroundColorStack[0]); } +inline v4_r32 UI_FirstBorderColor(void) { ui *UI = UI_GetState(); return(UI->Stacks.BorderColorStack[0]); } inline r32 UI_FirstBorderThickness(void) { ui *UI = UI_GetState(); return(UI->Stacks.BorderThicknessStack[0]); } inline axis2 UI_FirstLayoutAxis(void) { ui *UI = UI_GetState(); return(UI->Stacks.LayoutAxisStack[0]); } -inline r32 UI_FirstCornerRadius(void) { ui *UI = UI_GetState(); return(UI->Stacks.CornerRadiusStack[0]); } +inline v4_r32 UI_FirstCornerRadii(void) { ui *UI = UI_GetState(); return(UI->Stacks.CornerRadiiStack[0]); } inline font_id UI_FirstFont(void) { ui *UI = UI_GetState(); return(UI->Stacks.FontStack[0]); } inline r32 UI_FirstFontSize(void) { ui *UI = UI_GetState(); return(UI->Stacks.FontSizeStack[0]); } inline r32 UI_FirstOffsetX(void) { ui *UI = UI_GetState(); return(UI->Stacks.OffsetXStack[0]); } @@ -67,12 +67,12 @@ inline ui_size UI_TopWidth(void) { ui *UI = UI_GetState(); return(UI->Stacks.Wid inline ui_size UI_TopHeight(void) { ui *UI = UI_GetState(); return(UI->Stacks.HeightStack[UI->Stacks.HeightStackUsed - 1]); } inline r32 UI_TopFixedX(void) { ui *UI = UI_GetState(); return(UI->Stacks.FixedXStack[UI->Stacks.FixedXStackUsed - 1]); } inline r32 UI_TopFixedY(void) { ui *UI = UI_GetState(); return(UI->Stacks.FixedYStack[UI->Stacks.FixedYStackUsed - 1]); } -inline v4 UI_TopTextColor(void) { ui *UI = UI_GetState(); return(UI->Stacks.TextColorStack[UI->Stacks.TextColorStackUsed - 1]); } -inline v4 UI_TopBackgroundColor(void) { ui *UI = UI_GetState(); return(UI->Stacks.BackgroundColorStack[UI->Stacks.BackgroundColorStackUsed - 1]); } -inline v4 UI_TopBorderColor(void) { ui *UI = UI_GetState(); return(UI->Stacks.BorderColorStack[UI->Stacks.BorderColorStackUsed - 1]); } +inline v4_r32 UI_TopTextColor(void) { ui *UI = UI_GetState(); return(UI->Stacks.TextColorStack[UI->Stacks.TextColorStackUsed - 1]); } +inline v4_r32 UI_TopBackgroundColor(void) { ui *UI = UI_GetState(); return(UI->Stacks.BackgroundColorStack[UI->Stacks.BackgroundColorStackUsed - 1]); } +inline v4_r32 UI_TopBorderColor(void) { ui *UI = UI_GetState(); return(UI->Stacks.BorderColorStack[UI->Stacks.BorderColorStackUsed - 1]); } inline r32 UI_TopBorderThickness(void) { ui *UI = UI_GetState(); return(UI->Stacks.BorderThicknessStack[UI->Stacks.BorderThicknessStackUsed - 1]); } inline axis2 UI_TopLayoutAxis(void) { ui *UI = UI_GetState(); return(UI->Stacks.LayoutAxisStack[UI->Stacks.LayoutAxisStackUsed - 1]); } -inline r32 UI_TopCornerRadius(void) { ui *UI = UI_GetState(); return(UI->Stacks.CornerRadiusStack[UI->Stacks.CornerRadiusStackUsed - 1]); } +inline v4_r32 UI_TopCornerRadii(void) { ui *UI = UI_GetState(); return(UI->Stacks.CornerRadiiStack[UI->Stacks.CornerRadiiStackUsed - 1]); } inline font_id UI_TopFont(void) { ui *UI = UI_GetState(); return(UI->Stacks.FontStack[UI->Stacks.FontStackUsed - 1]); } inline r32 UI_TopFontSize(void) { ui *UI = UI_GetState(); return(UI->Stacks.FontSizeStack[UI->Stacks.FontSizeStackUsed - 1]); } inline r32 UI_TopOffsetX(void) { ui *UI = UI_GetState(); return(UI->Stacks.OffsetXStack[UI->Stacks.OffsetXStackUsed - 1]); } @@ -88,7 +88,7 @@ inline platform_cursor UI_TopHoverCursor(void) { ui *UI = UI_GetState(); return( #define UI_BorderColor(Element) DeferLoop(UI_PushBorderColor(Element), UI_PopBorderColor()) #define UI_BorderThickness(Element) DeferLoop(UI_PushBorderThickness(Element), UI_PopBorderThickness()) #define UI_LayoutAxis(Element) DeferLoop(UI_PushLayoutAxis(Element), UI_PopLayoutAxis()) -#define UI_CornerRadius(Element) DeferLoop(UI_PushCornerRadius(Element), UI_PopCornerRadius()) +#define UI_CornerRadii(Element) DeferLoop(UI_PushCornerRadii(Element), UI_PopCornerRadii()) #define UI_Font(Element) DeferLoop(UI_PushFont(Element), UI_PopFont()) #define UI_FontSize(Element) DeferLoop(UI_PushFontSize(Element), UI_PopFontSize()) #define UI_OffsetX(Element) DeferLoop(UI_PushOffsetX(Element), UI_PopOffsetX()) @@ -108,7 +108,7 @@ Assert(UI->Stacks.BackgroundColorStackUsed > 0); Box->BackgroundColor = UI Assert(UI->Stacks.BorderColorStackUsed > 0); Box->BorderColor = UI->Stacks.BorderColorStack[UI->Stacks.BorderColorStackUsed - 1]; if(UI->Stacks.AutoPopBorderColor) { UI_PopBorderColor(); UI->Stacks.AutoPopBorderColor = false; } Assert(UI->Stacks.BorderThicknessStackUsed > 0); Box->BorderThickness = UI->Stacks.BorderThicknessStack[UI->Stacks.BorderThicknessStackUsed - 1]; if(UI->Stacks.AutoPopBorderThickness) { UI_PopBorderThickness(); UI->Stacks.AutoPopBorderThickness = false; } Assert(UI->Stacks.LayoutAxisStackUsed > 0); Box->LayoutAxis = UI->Stacks.LayoutAxisStack[UI->Stacks.LayoutAxisStackUsed - 1]; if(UI->Stacks.AutoPopLayoutAxis) { UI_PopLayoutAxis(); UI->Stacks.AutoPopLayoutAxis = false; } -Assert(UI->Stacks.CornerRadiusStackUsed > 0); Box->CornerRadius = UI->Stacks.CornerRadiusStack[UI->Stacks.CornerRadiusStackUsed - 1]; if(UI->Stacks.AutoPopCornerRadius) { UI_PopCornerRadius(); UI->Stacks.AutoPopCornerRadius = false; } +Assert(UI->Stacks.CornerRadiiStackUsed > 0); Box->CornerRadii = UI->Stacks.CornerRadiiStack[UI->Stacks.CornerRadiiStackUsed - 1]; if(UI->Stacks.AutoPopCornerRadii) { UI_PopCornerRadii(); UI->Stacks.AutoPopCornerRadii = false; } Assert(UI->Stacks.FontStackUsed > 0); Box->Font = UI->Stacks.FontStack[UI->Stacks.FontStackUsed - 1]; if(UI->Stacks.AutoPopFont) { UI_PopFont(); UI->Stacks.AutoPopFont = false; } Assert(UI->Stacks.FontSizeStackUsed > 0); Box->FontSize = UI->Stacks.FontSizeStack[UI->Stacks.FontSizeStackUsed - 1]; if(UI->Stacks.AutoPopFontSize) { UI_PopFontSize(); UI->Stacks.AutoPopFontSize = false; } Assert(UI->Stacks.OffsetXStackUsed > 0); Box->Offset.x = UI->Stacks.OffsetXStack[UI->Stacks.OffsetXStackUsed - 1]; if(UI->Stacks.AutoPopOffsetX) { UI_PopOffsetX(); UI->Stacks.AutoPopOffsetX = false; } diff --git a/code/generated/vn_ui.meta.h b/code/generated/vn_ui.meta.h index f0ad51f..8a93a73 100644 --- a/code/generated/vn_ui.meta.h +++ b/code/generated/vn_ui.meta.h @@ -5,12 +5,12 @@ ui_size WidthStack[64]; s32 WidthStackUsed; b32 AutoPopWidth; ui_size HeightStack[64]; s32 HeightStackUsed; b32 AutoPopHeight; r32 FixedXStack[64]; s32 FixedXStackUsed; b32 AutoPopFixedX; r32 FixedYStack[64]; s32 FixedYStackUsed; b32 AutoPopFixedY; -v4 TextColorStack[64]; s32 TextColorStackUsed; b32 AutoPopTextColor; -v4 BackgroundColorStack[64]; s32 BackgroundColorStackUsed; b32 AutoPopBackgroundColor; -v4 BorderColorStack[64]; s32 BorderColorStackUsed; b32 AutoPopBorderColor; +v4_r32 TextColorStack[64]; s32 TextColorStackUsed; b32 AutoPopTextColor; +v4_r32 BackgroundColorStack[64]; s32 BackgroundColorStackUsed; b32 AutoPopBackgroundColor; +v4_r32 BorderColorStack[64]; s32 BorderColorStackUsed; b32 AutoPopBorderColor; r32 BorderThicknessStack[64]; s32 BorderThicknessStackUsed; b32 AutoPopBorderThickness; axis2 LayoutAxisStack[64]; s32 LayoutAxisStackUsed; b32 AutoPopLayoutAxis; -r32 CornerRadiusStack[64]; s32 CornerRadiusStackUsed; b32 AutoPopCornerRadius; +v4_r32 CornerRadiiStack[64]; s32 CornerRadiiStackUsed; b32 AutoPopCornerRadii; font_id FontStack[64]; s32 FontStackUsed; b32 AutoPopFont; r32 FontSizeStack[64]; s32 FontSizeStackUsed; b32 AutoPopFontSize; r32 OffsetXStack[64]; s32 OffsetXStackUsed; b32 AutoPopOffsetX; diff --git a/code/opengl_render.cpp b/code/opengl_render.cpp index 530ae44..7a30c3b 100644 --- a/code/opengl_render.cpp +++ b/code/opengl_render.cpp @@ -131,9 +131,9 @@ static RENDER_FILL_REGION(OpenGL_FillRegion) glBindTexture(GL_TEXTURE_2D, Texture.ID); glTexSubImage2D(GL_TEXTURE_2D, 0, - DestP.x, DestP.y, DestDim.x, DestDim.y, - OpenGL_InternalFormatFromTextureFormat(Texture.Format), - GL_UNSIGNED_BYTE, Data); + DestP.x, DestP.y, DestDim.x, DestDim.y, + OpenGL_InternalFormatFromTextureFormat(Texture.Format), + GL_UNSIGNED_BYTE, Data); glBindTexture(GL_TEXTURE_2D, 0); } @@ -358,8 +358,8 @@ Out_Color = Color*TextureFactor*BorderFactor*SDFFactor; temp Scratch = GetScratch(0, 0); for(s32 TextureIndex = 0; - TextureIndex < MAX_BOUND_TEXTURES; - ++TextureIndex) + TextureIndex < MAX_BOUND_TEXTURES; + ++TextureIndex) { string Name = PushFormat(Scratch.Arena, "TextureSamplers[%i]", TextureIndex); s32 Location = glGetUniformLocation(Program.ID, (char *)Name.Data); @@ -381,7 +381,7 @@ static instanced_quad_program OpenGL_CompileInstacedQuadProgram(void) in v4 In_Source; in s32 In_TextureIndex; in u32 In_Color[4]; - in r32 In_CornerRadius; + in r32 In_CornerRadius[4]; in r32 In_EdgeSoftness; in r32 In_BorderThickness; )GLSL" @@ -421,7 +421,7 @@ Color.r = r32((ColorData >> 24) & 255u)/255.0; Color.b = r32((ColorData >> 8) & 255u)/255.0; Color.a = r32((ColorData >> 0) & 255u)/255.0; -CornerRadius = In_CornerRadius; +CornerRadius = In_CornerRadius[gl_VertexID]; EdgeSoftness = In_EdgeSoftness; BorderThickness = In_BorderThickness; @@ -457,10 +457,14 @@ return(Result); void main() { +r32 SDFFactor = 1; r32 SoftnessPadding = Max(0, EdgeSoftness*2-1); +if(EdgeSoftness != 0 || CornerRadius != 0) +{ r32 Dist = RoundedRect(DestP, DestCenter, DestHalfSize - SoftnessPadding, CornerRadius); -r32 SDFFactor = 1 - smoothstep(0, 2*EdgeSoftness, Dist); + SDFFactor = 1 - smoothstep(0, 2*EdgeSoftness, Dist); +} r32 BorderFactor = 1; if(BorderThickness != 0) @@ -476,7 +480,7 @@ BorderFactor = smoothstep(0, 2*EdgeSoftness, InsideDist); } v4 TextureFactor = texture(TextureSamplers[TextureIndex], SourceP); -Out_Color = Color*SDFFactor*BorderFactor*TextureFactor; +Out_Color = Color*TextureFactor*SDFFactor*BorderFactor; } )GLSL"; @@ -491,7 +495,10 @@ Out_Color = Color*SDFFactor*BorderFactor*TextureFactor; Program.ColorID[1] = glGetAttribLocation(Program.ID, "In_Color[1]"); Program.ColorID[2] = glGetAttribLocation(Program.ID, "In_Color[2]"); Program.ColorID[3] = glGetAttribLocation(Program.ID, "In_Color[3]"); - Program.CornerRadiusID = glGetAttribLocation(Program.ID, "In_CornerRadius"); + Program.CornerRadiusID[0] = glGetAttribLocation(Program.ID, "In_CornerRadius[0]"); + Program.CornerRadiusID[1] = glGetAttribLocation(Program.ID, "In_CornerRadius[1]"); + Program.CornerRadiusID[2] = glGetAttribLocation(Program.ID, "In_CornerRadius[2]"); + Program.CornerRadiusID[3] = glGetAttribLocation(Program.ID, "In_CornerRadius[3]"); Program.EdgeSoftnessID = glGetAttribLocation(Program.ID, "In_EdgeSoftness"); Program.BorderThicknessID = glGetAttribLocation(Program.ID, "In_BorderThickness"); @@ -500,8 +507,8 @@ Out_Color = Color*SDFFactor*BorderFactor*TextureFactor; temp Scratch = GetScratch(0, 0); for(s32 TextureIndex = 0; - TextureIndex < MAX_BOUND_TEXTURES; - ++TextureIndex) + TextureIndex < MAX_BOUND_TEXTURES; + ++TextureIndex) { string Name = PushFormat(Scratch.Arena, "TextureSamplers[%i]", TextureIndex); s32 Location = glGetUniformLocation(Program.ID, (char *)Name.Data); @@ -583,7 +590,10 @@ static void OpenGL_BeginProgram(instanced_quad_program *Program) OpenGL_EnableIntegerVertexAttribute(Program->ColorID[1], 1, GL_UNSIGNED_INT, instanced_quad, Color[1]); OpenGL_EnableIntegerVertexAttribute(Program->ColorID[2], 1, GL_UNSIGNED_INT, instanced_quad, Color[2]); OpenGL_EnableIntegerVertexAttribute(Program->ColorID[3], 1, GL_UNSIGNED_INT, instanced_quad, Color[3]); - OpenGL_EnableFloatVertexAttribute(Program->CornerRadiusID, 1, GL_FLOAT, instanced_quad, CornerRadius); + OpenGL_EnableFloatVertexAttribute(Program->CornerRadiusID[0], 1, GL_FLOAT, instanced_quad, CornerRadius[0]); + OpenGL_EnableFloatVertexAttribute(Program->CornerRadiusID[1], 1, GL_FLOAT, instanced_quad, CornerRadius[1]); + OpenGL_EnableFloatVertexAttribute(Program->CornerRadiusID[2], 1, GL_FLOAT, instanced_quad, CornerRadius[2]); + OpenGL_EnableFloatVertexAttribute(Program->CornerRadiusID[3], 1, GL_FLOAT, instanced_quad, CornerRadius[3]); OpenGL_EnableFloatVertexAttribute(Program->EdgeSoftnessID, 1, GL_FLOAT, instanced_quad, EdgeSoftness); OpenGL_EnableFloatVertexAttribute(Program->BorderThicknessID, 1, GL_FLOAT, instanced_quad, BorderThickness); } @@ -597,7 +607,10 @@ static void OpenGL_EndProgram(instanced_quad_program *Program) OpenGL_DisableVertexAttribute(Program->ColorID[1]); OpenGL_DisableVertexAttribute(Program->ColorID[2]); OpenGL_DisableVertexAttribute(Program->ColorID[3]); - OpenGL_DisableVertexAttribute(Program->CornerRadiusID); + OpenGL_DisableVertexAttribute(Program->CornerRadiusID[0]); + OpenGL_DisableVertexAttribute(Program->CornerRadiusID[1]); + OpenGL_DisableVertexAttribute(Program->CornerRadiusID[2]); + OpenGL_DisableVertexAttribute(Program->CornerRadiusID[3]); OpenGL_DisableVertexAttribute(Program->EdgeSoftnessID); OpenGL_DisableVertexAttribute(Program->BorderThicknessID); @@ -669,7 +682,7 @@ static opengl_context OpenGL_SetupContext(vn_render_commands *RenderCommands, um return(Context); } -static void OpenGL_BeginFrame(vn_render_commands *RenderCommands, v2 RenderDim) +static void OpenGL_BeginFrame(vn_render_commands *RenderCommands, v2_r32 RenderDim) { RenderCommands->PushBufferAt = RenderCommands->PushBufferBase; #if VN_USE_INSTANCING @@ -705,8 +718,13 @@ static void OpenGL_EndFrame(opengl_context *Context, vn_render_commands *RenderC glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, IndexSize, IndexData); #endif + glBindBuffer(GL_ARRAY_BUFFER, Context->InstancedQuadBuffer); + OpenGL_BeginProgram(&Context->InstancedQuadProgram); + glUniform2f(Context->InstancedQuadProgram.UniformResolutionLocation, + RenderCommands->RenderDim.x, RenderCommands->RenderDim.y); + for(u8 *PushBufferAt = RenderCommands->PushBufferBase; - PushBufferAt < RenderCommands->PushBufferAt;) + PushBufferAt < RenderCommands->PushBufferAt;) { render_command_header *Header = (render_command_header *)PushBufferAt; PushBufferAt += sizeof(*Header); @@ -731,27 +749,20 @@ static void OpenGL_EndFrame(opengl_context *Context, vn_render_commands *RenderC render_texture_mapping *Mapping = &Command->Mapping; for(s32 TextureIndex = 0; - TextureIndex < Mapping->TexturesUsed; - ++TextureIndex) + TextureIndex < Mapping->TexturesUsed; + ++TextureIndex) { opengl_texture Texture = OpenGL_TextureFromHandle(Mapping->Textures[TextureIndex]); glActiveTexture(GL_TEXTURE0 + TextureIndex); glBindTexture(GL_TEXTURE_2D, Texture.ID); } - glBindBuffer(GL_ARRAY_BUFFER, Context->InstancedQuadBuffer); void *VertexData = RenderCommands->InstancedQuadBase+Command->QuadBufferIndex; umm VertexSize = Command->QuadCount*sizeof(instanced_quad); glBufferSubData(GL_ARRAY_BUFFER, 0, VertexSize, VertexData); - OpenGL_BeginProgram(&Context->InstancedQuadProgram); - glUniform2f(Context->InstancedQuadProgram.UniformResolutionLocation, - RenderCommands->RenderDim.x, RenderCommands->RenderDim.y); - glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, Command->QuadCount); - OpenGL_EndProgram(&Context->InstancedQuadProgram); - glBindTexture(GL_TEXTURE_2D, 0); } break; @@ -782,13 +793,13 @@ static void OpenGL_EndFrame(opengl_context *Context, vn_render_commands *RenderC OpenGL_BeginProgram(&Context->QuadProgram); glUniform2f(Context->QuadProgram.UniformResolutionLocation, - RenderCommands->RenderDim.x, RenderCommands->RenderDim.y); + RenderCommands->RenderDim.x, RenderCommands->RenderDim.y); render_texture_mapping *Mapping = &Command->Mapping; for(s32 TextureIndex = 0; - TextureIndex < Mapping->TexturesUsed; - ++TextureIndex) + TextureIndex < Mapping->TexturesUsed; + ++TextureIndex) { opengl_texture Texture = OpenGL_TextureFromHandle(Mapping->Textures[TextureIndex]); glActiveTexture(GL_TEXTURE0 + TextureIndex); @@ -807,5 +818,7 @@ static void OpenGL_EndFrame(opengl_context *Context, vn_render_commands *RenderC } } + OpenGL_EndProgram(&Context->InstancedQuadProgram); + glBindBuffer(GL_ARRAY_BUFFER, 0); } \ No newline at end of file diff --git a/code/opengl_render.h b/code/opengl_render.h index 7af0e6c..0f6435e 100644 --- a/code/opengl_render.h +++ b/code/opengl_render.h @@ -38,7 +38,7 @@ struct instanced_quad_program u32 SourceID; u32 TextureIndexID; u32 ColorID[4]; - u32 CornerRadiusID; + u32 CornerRadiusID[4]; u32 EdgeSoftnessID; u32 BorderThicknessID; diff --git a/code/vn.cpp b/code/vn.cpp index e5783f0..7f625b7 100644 --- a/code/vn.cpp +++ b/code/vn.cpp @@ -25,7 +25,7 @@ global debug_settings *DEBUG_DebugSettings = 0; #include "vn_text_op.h" #include "vn_ui.h" #include "vn_ui_utils.h" -#include "vn_scene.h" +#include "vn_scene2.h" #include "vn_scene_view.h" #include "vn_animation_curve.h" #include "vn_theme_dark.h" @@ -47,7 +47,7 @@ global vn_render_commands *GlobalRenderCommands = 0; #include "vn_ui.cpp" #include "vn_ui_utils.cpp" #include "vn_animation_curve.cpp" -#include "vn_scene.cpp" +#include "vn_scene2.cpp" #include "vn_scene_view.cpp" #if VN_INTERNAL @@ -70,8 +70,6 @@ struct vn_state animation_curve_state AnimationCurveState; b32 EditorMode; - render_handle BackgroundTexture; - scene_view SceneView; #if VN_INTERNAL @@ -95,20 +93,18 @@ VN_UPDATE_AND_RENDER(VN_UpdateAndRender) //- sixten: initialize application state if(!Memory->State) { - arena *Arena = ArenaAlloc(Kilobytes(24), true); + arena *Arena = ArenaAlloc(Kilobytes(24), true, "VN State Arena"); State = Memory->State = PushStruct(Arena, vn_state); State->Arena = Arena; - State->FrameArena = ArenaAlloc(Kilobytes(1), true); + State->FrameArena = ArenaAlloc(Kilobytes(1), true, "VN Frame Arena"); - State->GlyphAtlas = CreateGlyphAtlas(RenderCommands); + State->GlyphAtlas = F_CreateGlyphAtlas(RenderCommands, 2048, 128); State->Config = CreateConfig(); //- sixten: load assets State->Assets.AllocateTexture = RenderCommands->AllocateTexture; LoadPermanentAssets(&State->Assets); - State->BackgroundTexture = TextureFromAssetID(AssetID_DemoBackground); - //- sixten: setup config binds and load current config { Config_BindS32(State->Config, StrLit("Platform/RefreshRate"), &Input->RefreshRate, 60); @@ -125,28 +121,21 @@ VN_UPDATE_AND_RENDER(VN_UpdateAndRender) Config_ReadFile(State->Config, StrLit("config.vn")); } - scene_view *SceneView = &State->SceneView; - SV_Init(SceneView, State->Arena); - - //- sixten: load startup scene - temp Scratch = GetScratch(); - string SceneInput = Platform_ReadEntireFile(Scratch.Arena, StrLit("data/scene.vns")); - compiled_scene Scene = S_ScriptFromText(Scratch.Arena, SceneInput); - SV_SetCurrentSource(&Scene); - ReleaseScratch(Scratch); - - SceneView->TestHappy = TextureFromAssetID(AssetID_ArthurHappy); - SceneView->TestNormal = TextureFromAssetID(AssetID_ArthurNormal); - SceneView->MonikaLeaning = TextureFromAssetID(AssetID_MonikaLeaning); - - SceneView->BackgroundTexture = State->BackgroundTexture; - + SV_Init(&State->SceneView); UI_Init(&State->UI); AC_Init(&State->AnimationCurveState); #if VN_INTERNAL W_Init(&State->Workspace); #endif + + + //- sixten: load startup scene + temp Scratch = GetScratch(); + compiled_scene2 Scene = S2_CompiledFromString(Scratch.Arena, Platform_ReadEntireFile(Scratch.Arena, StrLit("data/while_test.vns"))); + SV_SetCurrentSource(&Scene); + ReleaseScratch(Scratch); + return; } @@ -208,7 +197,7 @@ VN_UPDATE_AND_RENDER(VN_UpdateAndRender) //- sixten: render the frame { render_group Group = BeginRenderGroup(RenderCommands); - PushClear(&Group, V3(0.1, 0.1, 0.1)); + PushClear(&Group, V3R32(0.1, 0.1, 0.1)); UI_RenderFrame(&Group, State->GlyphAtlas); @@ -216,17 +205,17 @@ VN_UPDATE_AND_RENDER(VN_UpdateAndRender) r32 DEBUGDisplayOffsetY = 20; if(DEBUG_DebugSettings->ListHotAndActive) { - PushText(&Group, State->GlyphAtlas, Font_Regular, V2(5, RenderCommands->RenderDim.y - DEBUGDisplayOffsetY), 15, Color_Grey, + PushText(&Group, State->GlyphAtlas, Font_Regular, V2R32(5, RenderCommands->RenderDim.y - DEBUGDisplayOffsetY), 15, Color_Grey, PushFormat(State->UI.FrameArena, "Hot: %S:%llu", UI_BoxStringFromKey(UI_HotKey()), UI_HotKey())); DEBUGDisplayOffsetY += 20; - PushText(&Group, State->GlyphAtlas, Font_Regular, V2(5, RenderCommands->RenderDim.y - DEBUGDisplayOffsetY), 15, Color_Grey, + PushText(&Group, State->GlyphAtlas, Font_Regular, V2R32(5, RenderCommands->RenderDim.y - DEBUGDisplayOffsetY), 15, Color_Grey, PushFormat(State->UI.FrameArena, "Active: %S:%llu", UI_BoxStringFromKey(UI_ActiveKey()), UI_ActiveKey())); DEBUGDisplayOffsetY += 20; } if(DEBUG_DebugSettings->RenderFPSCounter) { - PushText(&Group, State->GlyphAtlas, Font_Regular, V2(5, RenderCommands->RenderDim.y - DEBUGDisplayOffsetY), 15, Color_Grey, + PushText(&Group, State->GlyphAtlas, Font_Regular, V2R32(5, RenderCommands->RenderDim.y - DEBUGDisplayOffsetY), 15, Color_Grey, PushFormat(State->UI.FrameArena, "FPS: %.2f", 1.0f/Input->dtForFrame)); DEBUGDisplayOffsetY += 20; diff --git a/code/vn_animation_curve.cpp b/code/vn_animation_curve.cpp index c58c98b..6e9cb24 100644 --- a/code/vn_animation_curve.cpp +++ b/code/vn_animation_curve.cpp @@ -15,7 +15,7 @@ inline void AC_SetState(animation_curve_state *State) static void AC_Init(animation_curve_state *State) { - State->Arena = ArenaAlloc(Kilobytes(32), true); + State->Arena = ArenaAlloc(Kilobytes(32), true, "Animation Curve State Arena"); } inline animation_curve_key AC_GenerateKeyFromString(string String) @@ -37,8 +37,8 @@ static animation_curve_entry *AC_GetEntryByKey(animation_curve_key Key, r32 Init animation_curve_entry *Result = 0; for(animation_curve_entry *Entry = Bucket->First; - Entry != 0; - Entry = Entry->Next) + Entry != 0; + Entry = Entry->Next) { if(AreEqual(Entry->Key, Key)) { @@ -90,7 +90,10 @@ inline void AC_SetValue(string Name, r32 Value) inline r32 AC_AnimateValueDirect(r32 Target, r32 Duration, r32 *Value) { animation_curve_state *State = AC_GetState(); - + + //- sixten: make sure the value is valid + if(*Value != *Value) *Value = 0; + r32 Result = *Value; r32 Rate = 1.0 - Pow(2, -(10.0 / Duration * State->dtForFrame)); @@ -131,8 +134,8 @@ static void AC_NewFrame(animation_curve_state *State, r32 dtForFrame) // sixten: Prune untouched entries. for(s32 BucketIndex = 0; - BucketIndex < ArrayCount(State->Buckets); - ++BucketIndex) + BucketIndex < ArrayCount(State->Buckets); + ++BucketIndex) { animation_curve_bucket *Bucket = State->Buckets + BucketIndex; diff --git a/code/vn_asset.cpp b/code/vn_asset.cpp index 05a489b..2d3b899 100644 --- a/code/vn_asset.cpp +++ b/code/vn_asset.cpp @@ -69,10 +69,30 @@ static void LoadPermanentAssets(assets *Assets) } } -static render_handle TextureFromAssetID(asset_id ID) +static render_handle A_TextureFromAssetID(asset_id ID) { Assert(ID >= AssetID_None && ID < AssetID_COUNT); - asset *Asset = GetAssets()->Assets + ID; return(Asset->Handle); +} + +static r32 A_ScaleFromAssetID(asset_id ID) +{ + Assert(ID >= AssetID_None && ID < AssetID_COUNT); + r32 Result = AssetScaleLUT[ID]; + return(Result); +} + +static asset_id A_AssetIDFromString(string String) +{ + asset_id Result = AssetID_None; + for(u64 AssetIndex = 0; AssetIndex < AssetID_COUNT; AssetIndex += 1) + { + if(AreEqual(String, MakeString(AssetNameLUT[AssetIndex]))) + { + Result = AssetIndex; + break; + } + } + return(Result); } \ No newline at end of file diff --git a/code/vn_asset.h b/code/vn_asset.h index 0a42b29..69aa40b 100644 --- a/code/vn_asset.h +++ b/code/vn_asset.h @@ -18,6 +18,8 @@ struct assets static assets *GetAssets(); static void SetAssets(assets *Assets); -static void LoadAsset(asset_id ID); -static void LoadPermanentAssets(assets *Assets); -static render_handle TextureFromAssetID(asset_id ID); \ No newline at end of file +static void A_LoadAsset(asset_id ID); +static void A_LoadPermanentAssets(assets *Assets); +static render_handle A_TextureFromAssetID(asset_id ID); +static r32 A_ScaleFromAssetID(asset_id ID); +static asset_id A_AssetIDFromString(string String); \ No newline at end of file diff --git a/code/vn_assets.md b/code/vn_assets.md index 60f7fc0..2aa2133 100644 --- a/code/vn_assets.md +++ b/code/vn_assets.md @@ -1,22 +1,22 @@ -@table(Name, Path, IsPermanent) assets_desc: +@table(Name, Path, IsPermanent, Scale) assets_desc: { - { None, "", true } - { Error, "backgrounds/unknown.png", true } + { None, "", true, 0 } + { Error, "backgrounds/unknown.png", true, 0 } //////////////////////////////// //~ sixten: backgrounds - { DemoBackground, "backgrounds/test.jpg", false } - { DDLCBackground, "backgrounds/ddlc.png", false } + { DemoBackground, "backgrounds/test.jpg", false, 1 } + { DDLCBackground, "backgrounds/ddlc.png", false, 1 } //////////////////////////////// //~ sixten: characters //- sixten: arthur - { ArthurNormal, "characters/test_normal.png", false } - { ArthurHappy, "characters/test_happy.png", false } + { ArthurNormal, "characters/test_normal.png", false, 0.017 } + { ArthurHappy, "characters/test_happy.png", false, 0.017 } //- sixten: monika - { MonikaLeaning, "characters/monika_leaning.png", false } + { MonikaLeaning, "characters/monika_leaning.png", false, 0.033 } } @@ -47,4 +47,9 @@ { @expand(assets_desc s) `"$(s.Name)",`; +} +@table_gen_data(`r32`) AssetScaleLUT: +{ + @expand(assets_desc s) + `$(s.Scale),`; } \ No newline at end of file diff --git a/code/vn_config.cpp b/code/vn_config.cpp index 051b5c1..dbc091a 100644 --- a/code/vn_config.cpp +++ b/code/vn_config.cpp @@ -1,6 +1,6 @@ static config *CreateConfig(void) { - arena *Arena = ArenaAlloc(Kilobytes(4), true); + arena *Arena = ArenaAlloc(Kilobytes(4), true, "Config Arena"); config *Config = PushStruct(Arena, config); Config->Arena = Arena; return(Config); @@ -14,8 +14,8 @@ static config_entry *Config_FindEntryByName(config *Config, string Name) config_entry_bucket *Bucket = Config->EntryBuckets + BucketSlot; for(config_entry *Entry = Bucket->First; - Entry != 0; - Entry = Entry->Next) + Entry != 0; + Entry = Entry->Next) { if(AreEqual(Entry->Name, Name)) { @@ -254,8 +254,8 @@ static void Config_WriteFile(config *Config, string Path) string LastDir = MakeString(0, 0LL); for(config_entry *Entry = Config->FirstInternal; - Entry != 0; - Entry = Entry->NextInternal) + Entry != 0; + Entry = Entry->NextInternal) { s64 LastSlash = LastIndexOf(Entry->Name, '/'); Assert(LastSlash != -1); diff --git a/code/vn_debug_info.cpp b/code/vn_debug_info.cpp index ca0973e..2c6f066 100644 --- a/code/vn_debug_info.cpp +++ b/code/vn_debug_info.cpp @@ -6,7 +6,7 @@ per_thread debug_info *ThreadLocal_DebugInfo = 0; //- sixten: manage state static debug_info *DI_DebugInfoAlloc(void) { - arena *Arena = ArenaAlloc(Kilobytes(1), true); + arena *Arena = ArenaAlloc(Kilobytes(1), true, "Debug Info Arena"); debug_info *Result = PushStruct(Arena, debug_info); Result->Arena = Arena; return(Result); @@ -57,8 +57,8 @@ static void DI_BuildInfo(void) UI_SetNextCornerRadius(4.0f); UI_SetNextHoverCursor(PlatformCursor_ArrowAll); ui_box *Box = UI_MakeBox(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBorder|UI_BoxFlag_Clickable| - UI_BoxFlag_HotAnimation|UI_BoxFlag_FloatingX|UI_BoxFlag_FloatingY|UI_BoxFlag_Clip, - StrLit("DI Container")); + UI_BoxFlag_HotAnimation|UI_BoxFlag_FloatingX|UI_BoxFlag_FloatingY|UI_BoxFlag_Clip, + StrLit("DI Container")); UI_Parent(Box) { UI_Size(UI_Percent(1, 1), UI_ChildrenSum(1, 1)) UI_Row() UI_Width(UI_TextContent(15, 1)) UI_Height(UI_TextContent(15, 1)) @@ -95,8 +95,8 @@ static void DI_BuildInfo(void) UI_StoreDragV2(DebugInfo->RelativeP); } - v2 StartP = UI_GetDragV2(); - v2 EndP = StartP + Signal.DragDelta; + v2_r32 StartP = UI_GetDragV2(); + v2_r32 EndP = StartP + Signal.DragDelta; DebugInfo->RelativeP = EndP; } Box->FixedP = DebugInfo->RelativeP; diff --git a/code/vn_font.cpp b/code/vn_font.cpp index 1396515..e5bf593 100644 --- a/code/vn_font.cpp +++ b/code/vn_font.cpp @@ -2,13 +2,13 @@ global read_only s32 Font_Oversample = 2; -inline s32 GetSubpixelSegmentAtP(r32 Value) +inline s32 F_SubpixelSegmentFromP(r32 Value) { s32 Result = (s32)(Value - Floor(Value))*GLYPH_SUBPIXEL_SEGMENTS; return(Result); } -static void RasterizeGlyph(glyph_atlas *Atlas, font_id Font, glyph *Glyph, u32 Codepoint, r32 Size, s32 Subpixel) +static void F_RasterizeGlyph(glyph_atlas *Atlas, font_id Font, glyph *Glyph, u32 Codepoint, r32 Size, s32 Subpixel) { Glyph->Font = Font; Glyph->Codepoint = Codepoint; @@ -58,7 +58,7 @@ static void RasterizeGlyph(glyph_atlas *Atlas, font_id Font, glyph *Glyph, u32 C Atlas->BitmapBuffer); } -static glyph *GetGlyph(glyph_atlas *Atlas, font_id Font, u32 Codepoint, r32 Size, s32 Subpixel) +static glyph *F_GlyphFromAtlas(glyph_atlas *Atlas, font_id Font, u32 Codepoint, r32 Size, s32 Subpixel) { glyph *Glyph = 0; @@ -92,7 +92,7 @@ static glyph *GetGlyph(glyph_atlas *Atlas, font_id Font, u32 Codepoint, r32 Size DLLRemove_NP(Atlas->LRUFirst, Atlas->LRULast, Glyph, LRUNext, LRUPrev); } - RasterizeGlyph(Atlas, Font, Glyph, Codepoint, Size, Subpixel); + F_RasterizeGlyph(Atlas, Font, Glyph, Codepoint, Size, Subpixel); } DLLInsertLast_NP(Atlas->LRUFirst, Atlas->LRULast, Glyph, LRUNext, LRUPrev); @@ -100,134 +100,140 @@ static glyph *GetGlyph(glyph_atlas *Atlas, font_id Font, u32 Codepoint, r32 Size return(Glyph); } -static glyph_atlas *CreateGlyphAtlas(vn_render_commands *RenderCommands, - s32 BitmapSize = DEFAULT_GLYPH_ATLAS_DIM, - s32 GlyphSize = MAX_GLYPH_SIZE) +static loaded_font F_CreateFontFromFile(arena *Arena, string Filepath) { - arena *Arena = ArenaAlloc(Megabytes(1), true); - glyph_atlas *Atlas = PushStruct(Arena, glyph_atlas); - Atlas->Arena = Arena; - - Atlas->BitmapSize = BitmapSize; - Atlas->GlyphSize = GlyphSize; - - Atlas->MaxGlyphCount = (DEFAULT_GLYPH_ATLAS_DIM / MAX_GLYPH_SIZE)*(DEFAULT_GLYPH_ATLAS_DIM / MAX_GLYPH_SIZE); - Atlas->Glyphs = PushArray(Atlas->Arena, glyph, Atlas->MaxGlyphCount); - - Atlas->RenderCommands = RenderCommands; - Atlas->Texture = RenderCommands->AllocateTexture(V2S32(BitmapSize, BitmapSize), Render_TextureFormat_R8, false, 0); - - Atlas->Fonts[Font_Regular].Data = Platform_ReadEntireFile(Atlas->Arena, StrLit("data/fonts/Roboto-Regular.ttf")); - Atlas->Fonts[Font_Bold].Data = Platform_ReadEntireFile(Atlas->Arena, StrLit("data/fonts/Roboto-Bold.ttf")); - Atlas->Fonts[Font_Monospace].Data = Platform_ReadEntireFile(Atlas->Arena, StrLit("data/fonts/DejaVuSansMono.ttf")); - Atlas->Fonts[Font_MonospaceOblique].Data = Platform_ReadEntireFile(Atlas->Arena, StrLit("data/fonts/DejaVuSansMono-Oblique.ttf")); - Atlas->Fonts[Font_Fancy].Data = Platform_ReadEntireFile(Atlas->Arena, StrLit("data/fonts/Merriweather-Regular.ttf")); - Atlas->Fonts[Font_Icons].Data = Platform_ReadEntireFile(Atlas->Arena, StrLit("data/fonts/icons.ttf")); - - for(s32 FontIndex = 0; - FontIndex < Font_Count; - ++FontIndex) - { - loaded_font *Font = Atlas->Fonts + FontIndex; - stbtt_InitFont(&Font->Info, - Font->Data.Data, - stbtt_GetFontOffsetForIndex(Font->Data.Data, 0)); - - stbtt_GetFontVMetrics(&Font->Info, &Font->Ascent, &Font->Descent, &Font->LineGap); - } - - Atlas->BitmapBuffer = PushArray(Atlas->Arena, u8, GlyphSize*GlyphSize); - - return(Atlas); + loaded_font Result = {}; + Result.Data = Platform_ReadEntireFile(Arena, Filepath); + if(!Result.Data.Count) + { + Result.Data = Platform_ReadEntireFile(Arena, StrLit("data/fonts/fallback.ttf")); + if(!Result.Data.Count) + { + temp Scratch = GetScratch(&Arena, 1); + Platform.ShowMessage(PushFormat(Scratch.Arena, "Unable to fallback font.", Filepath), Platform_Message_Fatal); + ReleaseScratch(Scratch); + } + } + stbtt_InitFont(&Result.Info, Result.Data.Data, stbtt_GetFontOffsetForIndex(Result.Data.Data, 0)); + stbtt_GetFontVMetrics(&Result.Info, &Result.Ascent, &Result.Descent, &Result.LineGap); + + return(Result); +} + +static glyph_atlas *F_CreateGlyphAtlas(vn_render_commands *RenderCommands, s32 BitmapSize, s32 GlyphSize) +{ + arena *Arena = ArenaAlloc(Megabytes(1), true, "Glyph Atlas Arena"); + glyph_atlas *Atlas = PushStruct(Arena, glyph_atlas); + Atlas->Arena = Arena; + + Atlas->BitmapSize = BitmapSize; + Atlas->GlyphSize = GlyphSize; + + Atlas->MaxGlyphCount = (BitmapSize / GlyphSize)*(BitmapSize / GlyphSize); + Atlas->Glyphs = PushArray(Atlas->Arena, glyph, Atlas->MaxGlyphCount); + + Atlas->RenderCommands = RenderCommands; + Atlas->Texture = RenderCommands->AllocateTexture(V2S32(BitmapSize, BitmapSize), Render_TextureFormat_R8, false, 0); + + Atlas->Fonts[Font_Regular] = F_CreateFontFromFile(Atlas->Arena, StrLit("data/fonts/Roboto-Regular.ttf")); + Atlas->Fonts[Font_Bold] = F_CreateFontFromFile(Atlas->Arena, StrLit("data/fonts/Roboto-Bold.ttf")); + Atlas->Fonts[Font_Monospace] = F_CreateFontFromFile(Atlas->Arena, StrLit("data/fonts/DejaVuSansMono.ttf")); + Atlas->Fonts[Font_MonospaceOblique] = F_CreateFontFromFile(Atlas->Arena, StrLit("data/fonts/DejaVuSansMono-Oblique.ttf")); + Atlas->Fonts[Font_Fancy] = F_CreateFontFromFile(Atlas->Arena, StrLit("data/fonts/Merriweather-Regular.ttf")); + Atlas->Fonts[Font_Icons] = F_CreateFontFromFile(Atlas->Arena, StrLit("data/fonts/icons.ttf")); + + Atlas->BitmapBuffer = PushArray(Atlas->Arena, u8, GlyphSize*GlyphSize); + + return(Atlas); } static r32 PushText(render_group *Group, glyph_atlas *Atlas, font_id Font, - v2 P, r32 Size, v4 Color, + v2_r32 P, r32 Size, v4_r32 Color, string Text) { - r32 OffsetX = 0; - u8 *TextBegin = Text.Data; - u8 *TextEnd = TextBegin+Text.Count; - for(u8 *Byte = TextBegin; Byte < TextEnd;) - { - string_decode Decode = DecodeUTF8Codepoint(Byte, TextEnd-Byte); - Byte += Decode.Size; - u32 Codepoint = Decode.Codepoint; - - glyph *Glyph = GetGlyph(Atlas, Font, Codepoint, Size*Font_Oversample, GetSubpixelSegmentAtP(P.x*Font_Oversample)); - Assert(Glyph); - - v2 GlyphP = P + Glyph->Offset*(1.0 / Font_Oversample) + V2(OffsetX, 1); - - v2 RenderDim = ConvertV2ToR32(Glyph->P1 - Glyph->P0); - v2 Dim = RenderDim*(1.0 / Font_Oversample); - - PushTexturedQuad(Group, + r32 OffsetX = 0; + u8 *TextBegin = Text.Data; + u8 *TextEnd = TextBegin+Text.Count; + for(u8 *Byte = TextBegin; Byte < TextEnd;) + { + string_decode Decode = DecodeUTF8Codepoint(Byte, TextEnd-Byte); + Byte += Decode.Size; + u32 Codepoint = Decode.Codepoint; + + glyph *Glyph = F_GlyphFromAtlas(Atlas, Font, Codepoint, Size*Font_Oversample, F_SubpixelSegmentFromP(P.x*Font_Oversample)); + Assert(Glyph); + + v2_r32 GlyphP = P + Glyph->Offset*(1.0 / Font_Oversample) + V2R32(OffsetX, 1); + + v2_r32 RenderDim = ConvertV2ToR32(Glyph->P1 - Glyph->P0); + v2_r32 Dim = RenderDim*(1.0 / Font_Oversample); + + PushTexturedQuad(Group, Range2R32(GlyphP, GlyphP+Dim), Range2R32(ConvertV2ToR32(Glyph->P0), ConvertV2ToR32(Glyph->P1)), - Color, Color, Color, Color, 0, 0, 0, Atlas->Texture); - - OffsetX += Glyph->Advance/Font_Oversample; - } - return(OffsetX); + Color, Color, Color, Color, 0, 0, 0, 0, 0, 0, Atlas->Texture); + + OffsetX += Glyph->Advance/Font_Oversample; + } + return(OffsetX); } static void PushTextF(render_group *Group, glyph_atlas *Atlas, font_id Font, - v2 P, r32 Size, v4 Color, + v2_r32 P, r32 Size, v4_r32 Color, char *Format, ...) { - temp Scratch = GetScratch(0, 0); - - va_list Arguments; - va_start(Arguments, Format); - string String = PushFormatVariadic(Scratch.Arena, Format, Arguments); - va_end(Arguments); - - PushText(Group, Atlas, Font, P, Size, Color, String); - - ReleaseScratch(Scratch); + temp Scratch = GetScratch(0, 0); + + va_list Arguments; + va_start(Arguments, Format); + string String = PushFormatVariadic(Scratch.Arena, Format, Arguments); + va_end(Arguments); + + PushText(Group, Atlas, Font, P, Size, Color, String); + + ReleaseScratch(Scratch); } inline r32 CalculateRasterizedTextWidth(glyph_atlas *Atlas, font_id Font, r32 Size, string Text) { - r32 X = 0; - - u8 *TextBegin = Text.Data; - u8 *TextEnd = TextBegin+Text.Count; - for(u8 *Byte = TextBegin; Byte < TextEnd;) - { - string_decode Decode = DecodeUTF8Codepoint(Byte, TextEnd-Byte); - Byte += Decode.Size; - u32 Codepoint = Decode.Codepoint; - - glyph *Glyph = GetGlyph(Atlas, Font, Codepoint, Size*Font_Oversample, GetSubpixelSegmentAtP(X*Font_Oversample)); - Assert(Glyph); - - X += Glyph->Advance/Font_Oversample; - } - - return(X); + r32 X = 0; + + u8 *TextBegin = Text.Data; + u8 *TextEnd = TextBegin+Text.Count; + for(u8 *Byte = TextBegin; Byte < TextEnd;) + { + string_decode Decode = DecodeUTF8Codepoint(Byte, TextEnd-Byte); + Byte += Decode.Size; + u32 Codepoint = Decode.Codepoint; + + glyph *Glyph = F_GlyphFromAtlas(Atlas, Font, Codepoint, Size*Font_Oversample, F_SubpixelSegmentFromP(X*Font_Oversample)); + Assert(Glyph); + + X += Glyph->Advance/Font_Oversample; + } + + return(X); } inline r32 CalculateRasterizedTextHeight(glyph_atlas *Atlas, font_id Font, r32 Size, string Text) { - r32 Scale = stbtt_ScaleForMappingEmToPixels(&Atlas->Fonts[Font].Info, Size)/ - stbtt_ScaleForPixelHeight(&Atlas->Fonts[Font].Info, Size); - - r32 Y = Size*Scale; - - u8 *TextBegin = Text.Data; - u8 *TextEnd = TextBegin+Text.Count; - for(u8 *Byte = TextBegin; Byte < TextEnd;) - { - string_decode Decode = DecodeUTF8Codepoint(Byte, TextEnd-Byte); - Byte += Decode.Size; - u32 Codepoint = Decode.Codepoint; - - if(Codepoint == '\n') - { - Y += Size*Scale; - } - } - return(Y); + r32 Scale = stbtt_ScaleForMappingEmToPixels(&Atlas->Fonts[Font].Info, Size)/ + stbtt_ScaleForPixelHeight(&Atlas->Fonts[Font].Info, Size); + + r32 Y = Size*Scale; + + u8 *TextBegin = Text.Data; + u8 *TextEnd = TextBegin+Text.Count; + for(u8 *Byte = TextBegin; Byte < TextEnd;) + { + string_decode Decode = DecodeUTF8Codepoint(Byte, TextEnd-Byte); + Byte += Decode.Size; + u32 Codepoint = Decode.Codepoint; + + if(Codepoint == '\n') + { + Y += Size*Scale; + } + } + return(Y); } \ No newline at end of file diff --git a/code/vn_font.h b/code/vn_font.h index 9f4a5d5..f49a6eb 100644 --- a/code/vn_font.h +++ b/code/vn_font.h @@ -86,13 +86,10 @@ struct glyph v2_s32 P0; v2_s32 P1; - v2 Offset; + v2_r32 Offset; r32 Advance; }; -#define DEFAULT_GLYPH_ATLAS_DIM 1024*2 -#define MAX_GLYPH_SIZE 128 - #define STB_TRUETYPE_IMPLEMENTATION #include "third_party/stb_truetype.h" @@ -127,4 +124,15 @@ struct glyph_atlas loaded_font Fonts[Font_Count]; }; + +//////////////////////////////// +//~ sixten: Font Atlas Functions + +inline s32 F_SubpixelSegmentFromP(r32 Value); +static void F_RasterizeGlyph(glyph_atlas *Atlas, font_id Font, glyph *Glyph, u32 Codepoint, r32 Size, s32 Subpixel); +static glyph *F_GlyphFromAtlas(glyph_atlas *Atlas, font_id Font, u32 Codepoint, r32 Size, s32 Subpixel); +static loaded_font F_CreateFontFromFile(arena *Arena, string Filepath); +static glyph_atlas *F_CreateGlyphAtlas(vn_render_commands *RenderCommands, s32 BitmapSize, s32 GlyphSize); + + #endif //VN_FONT_H diff --git a/code/vn_platform.h b/code/vn_platform.h index 1493f5a..4c2e672 100644 --- a/code/vn_platform.h +++ b/code/vn_platform.h @@ -13,8 +13,9 @@ enum { - PlatformAccess_Read = 0x1, - PlatformAccess_Write = 0x2, + PlatformAccess_Read = 0x1, + PlatformAccess_Write = 0x2, + PlatformAccess_OpenAlways = 0x4, }; typedef u32 platform_access_flags; @@ -120,8 +121,8 @@ struct platform_event platform_modifiers Modifiers; platform_key Key; u32 Codepoint; - v2 P; - v2 Scroll; + v2_r32 P; + v2_r32 Scroll; }; struct platform_event_list @@ -173,7 +174,7 @@ struct vn_render_commands s32 QuadIndexCount; #endif - v2 RenderDim; + v2_r32 RenderDim; }; // sixten: Services the application provides to the platform @@ -183,8 +184,8 @@ struct vn_input // sixten: Platform to application platform_event_list *EventList; - v2 MouseP; - v2 dMouseP; + v2_r32 MouseP; + v2_r32 dMouseP; r32 dtForFrame; diff --git a/code/vn_render.cpp b/code/vn_render.cpp index 45ccde1..a97401f 100644 --- a/code/vn_render.cpp +++ b/code/vn_render.cpp @@ -60,7 +60,7 @@ inline render_group BeginRenderGroup(vn_render_commands *Commands) return(Group); } -inline void PushClear(render_group *Group, v3 Color) +inline void PushClear(render_group *Group, v3_r32 Color) { render_command_clear *Command = PushCommand(Group, render_command_clear); Command->Color = Color; @@ -92,7 +92,7 @@ inline s32 GetTextureIndexForCommand(render_texture_mapping *Mapping, render_han return(Result); } -inline u32 PackV4ToU32(v4 V) +inline u32 PackV4ToU32(v4_r32 V) { u32 Result = ((u8)(Clamp01(V.x)*255.0)<<24) | @@ -106,8 +106,9 @@ inline u32 PackV4ToU32(v4 V) static void PushTexturedQuad(render_group *Group, range2_r32 Dest, range2_r32 Source, - v4 Color00, v4 Color10, v4 Color01, v4 Color11, - r32 CornerRadius, r32 EdgeSoftness, r32 BorderThickness, + v4_r32 Color00, v4_r32 Color10, v4_r32 Color01, v4_r32 Color11, + r32 CornerRadius00, r32 CornerRadius10, r32 CornerRadius01, r32 CornerRadius11, + r32 EdgeSoftness, r32 BorderThickness, render_handle Texture) { vn_render_commands *Commands = Group->Commands; @@ -145,7 +146,10 @@ static void PushTexturedQuad(render_group *Group, Quad->Color[1] = PackV4ToU32(Color01); Quad->Color[2] = PackV4ToU32(Color10); Quad->Color[3] = PackV4ToU32(Color11); - Quad->CornerRadius = CornerRadius; + Quad->CornerRadius[0] = CornerRadius00; + Quad->CornerRadius[1] = CornerRadius01; + Quad->CornerRadius[2] = CornerRadius10; + Quad->CornerRadius[3] = CornerRadius11; Quad->EdgeSoftness = EdgeSoftness; Quad->BorderThickness = BorderThickness; @@ -261,19 +265,45 @@ static void PushTexturedQuad(render_group *Group, #endif inline void PushQuad(render_group *Group, range2_r32 Dest, - v4 Color00, v4 Color01, v4 Color10, v4 Color11, - r32 CornerRadius, r32 EdgeSoftness, r32 BorderThickness) + v4_r32 Color00, v4_r32 Color01, v4_r32 Color10, v4_r32 Color11, + r32 CornerRadius00, r32 CornerRadius01, r32 CornerRadius10, r32 CornerRadius11, + r32 EdgeSoftness, r32 BorderThickness) { - PushTexturedQuad(Group, Dest, Range2R32(V2(0, 0), V2(0, 0)), Color00, Color01, Color10, Color11, - CornerRadius, EdgeSoftness, BorderThickness, Group->Commands->WhiteTexture); + PushTexturedQuad(Group, Dest, Range2R32(V2R32(0, 0), V2R32(0, 0)), + Color00, Color01, Color10, Color11, + CornerRadius00, CornerRadius01, CornerRadius10, CornerRadius11, + EdgeSoftness, BorderThickness, Group->Commands->WhiteTexture); } inline void PushQuad(render_group *Group, range2_r32 Dest, - v4 Color, + v4_r32 Color, + r32 CornerRadius00, r32 CornerRadius01, r32 CornerRadius10, r32 CornerRadius11, + r32 EdgeSoftness, r32 BorderThickness) +{ + PushTexturedQuad(Group, Dest, Range2R32(V2R32(0, 0), V2R32(0, 0)), + Color, Color, Color, Color, + CornerRadius00, CornerRadius01, CornerRadius10, CornerRadius11, + EdgeSoftness, BorderThickness, Group->Commands->WhiteTexture); +} + +inline void PushQuad(render_group *Group, range2_r32 Dest, + v4_r32 Color00, v4_r32 Color01, v4_r32 Color10, v4_r32 Color11, r32 CornerRadius, r32 EdgeSoftness, r32 BorderThickness) { - PushTexturedQuad(Group, Dest, Range2R32(V2(0, 0), V2(0, 0)), Color, Color, Color, Color, - CornerRadius, EdgeSoftness, BorderThickness, Group->Commands->WhiteTexture); + PushTexturedQuad(Group, Dest, Range2R32(V2R32(0, 0), V2R32(0, 0)), + Color00, Color01, Color10, Color11, + CornerRadius, CornerRadius, CornerRadius, CornerRadius, + EdgeSoftness, BorderThickness, Group->Commands->WhiteTexture); +} + +inline void PushQuad(render_group *Group, range2_r32 Dest, + v4_r32 Color, + r32 CornerRadius, r32 EdgeSoftness, r32 BorderThickness) +{ + PushTexturedQuad(Group, Dest, Range2R32(V2R32(0, 0), V2R32(0, 0)), + Color, Color, Color, Color, + CornerRadius, CornerRadius, CornerRadius, CornerRadius, + EdgeSoftness, BorderThickness, Group->Commands->WhiteTexture); } inline void PushClip(render_group *Group, range2_r32 Clip) diff --git a/code/vn_render.h b/code/vn_render.h index 5bd29ec..b5e3e60 100644 --- a/code/vn_render.h +++ b/code/vn_render.h @@ -6,22 +6,22 @@ #define MAX_BOUND_TEXTURES 16 #define MAX_QUAD_COUNT 128*1024 -#define ColorFromHex(Value) V4((((Value) >> 24) & 0xFF) / 255.0, (((Value) >> 16) & 0xFF) / 255.0, (((Value) >> 8) & 0xFF) / 255.0, (((Value) >> 0) & 0xFF) / 255.0) +#define ColorFromHex(Value) V4R32((((Value) >> 24) & 0xFF) / 255.0, (((Value) >> 16) & 0xFF) / 255.0, (((Value) >> 8) & 0xFF) / 255.0, (((Value) >> 0) & 0xFF) / 255.0) #define Brighten(Color, Amount) (Color*(Amount)) #define Darken(Color, Amount) (Color*(1.0/(Amount))) -read_only v4 Color_Black = V4(0, 0, 0, 1); -read_only v4 Color_White = V4(1, 1, 1, 1); -read_only v4 Color_Grey = V4(0.5, 0.5, 0.5, 1); -read_only v4 Color_Red = V4(1, 0, 0, 1); -read_only v4 Color_Green = V4(0, 1, 0, 1); -read_only v4 Color_Blue = V4(0, 0, 1, 1); -read_only v4 Color_Yellow = V4(1, 1, 0, 1); -read_only v4 Color_Magenta = V4(1, 0, 1, 1); -read_only v4 Color_Cyan = V4(0, 1, 1, 1); +read_only v4_r32 Color_Black = V4R32(0, 0, 0, 1); +read_only v4_r32 Color_White = V4R32(1, 1, 1, 1); +read_only v4_r32 Color_Grey = V4R32(0.5, 0.5, 0.5, 1); +read_only v4_r32 Color_Red = V4R32(1, 0, 0, 1); +read_only v4_r32 Color_Green = V4R32(0, 1, 0, 1); +read_only v4_r32 Color_Blue = V4R32(0, 0, 1, 1); +read_only v4_r32 Color_Yellow = V4R32(1, 1, 0, 1); +read_only v4_r32 Color_Magenta = V4R32(1, 0, 1, 1); +read_only v4_r32 Color_Cyan = V4R32(0, 1, 1, 1); -#define SetAlpha(Color, Value) V4(Color.x, Color.y, Color.z, Value) +#define SetAlpha(Color, Value) V4R32(Color.x, Color.y, Color.z, Value) enum render_texture_format { @@ -50,7 +50,7 @@ enum render_command_type struct render_command_clear { - v3 Color; + v3_r32 Color; }; struct render_texture_mapping @@ -99,19 +99,19 @@ struct instanced_quad range2_r32 Source; u32 TextureIndex; u32 Color[4]; - r32 CornerRadius; + r32 CornerRadius[4]; r32 EdgeSoftness; r32 BorderThickness; }; struct quad_vertex { - v2 P; - v2 SourceP; + v2_r32 P; + v2_r32 SourceP; u32 TextureIndex; u32 Color; - v2 ToCenter; // sixten: ToCenter = Center - P - v2 HalfSize; + v2_r32 ToCenter; // sixten: ToCenter = Center - P + v2_r32 HalfSize; r32 CornerRadius; r32 EdgeSoftness; r32 BorderThickness; diff --git a/code/vn_scene.cpp b/code/vn_scene.cpp deleted file mode 100644 index 32edf2e..0000000 --- a/code/vn_scene.cpp +++ /dev/null @@ -1,1251 +0,0 @@ -#include "generated/vn_scene.meta.h" -#include "generated/vn_scene.meta.c" - -//////////////////////////////// -//~ sixten: Scene Compiler Functions - -static void S_ParseError(scene_compiler *Compiler, char *Message, s64 TokenOffset) -{ - if(!Compiler->InPanicMode) - { - Compiler->EncounteredError = true; - Compiler->InPanicMode = true; - scene_compile_error *Error = PushStruct(Compiler->Arena, scene_compile_error); - Error->Message = PushFormat(Compiler->Arena, Message); - Error->Token = Compiler->At[TokenOffset]; - QueuePush(Compiler->Errors.First, Compiler->Errors.Last, Error); - Compiler->Errors.Count += 1; - } -} - -static void S_EmitByte(scene_compiler *Compiler, u8 Byte) -{ - scene_emission_target *Target = &Compiler->TargetStack[Compiler->TargetStackIndex]; - scene_bytecode_bucket *Bucket = Target->Bucket; - scene_bytecode_chunk *Chunk = Bucket->Last; - if(!Chunk || Chunk->Count >= ArrayCount(Chunk->Data) || (Target->Type == S_EmissionTarget_Named && !AreEqual(Chunk->Name, Target->Name))) - { - Chunk = PushStruct(Target->Arena, scene_bytecode_chunk); - Chunk->Name = Target->Name; - - QueuePush(Bucket->First, Bucket->Last, Chunk); - Bucket->Count += 1; - } - Chunk->Data[Chunk->Count] = Byte; - Chunk->Count += 1; -} - -static void S_EmitU32(scene_compiler *Compiler, u32 Value) -{ - S_EmitByte(Compiler, Value >> 0); - S_EmitByte(Compiler, Value >> 8); - S_EmitByte(Compiler, Value >> 16); - S_EmitByte(Compiler, Value >> 24); -} - -static void S_EmitBucket(scene_compiler *Compiler, scene_bytecode_bucket *Bucket) -{ - for(scene_bytecode_chunk *Chunk = Bucket->First; Chunk != 0; Chunk = Chunk->Next) - { - for(s64 Index = 0; Index < Chunk->Count; Index += 1) - { - S_EmitByte(Compiler, Chunk->Data[Index]); - } - } -} - -static u64 S_MakeConstant(scene_compiler *Compiler, scene_value Value) -{ - scene_value_chunk *Chunk = Compiler->LastValueChunk; - if(!Chunk || Chunk->Count >= ArrayCount(Chunk->Values)) - { - Chunk = PushStruct(Compiler->Arena, scene_value_chunk); - QueuePush(Compiler->FirstValueChunk, Compiler->LastValueChunk, Chunk); - } - u64 Result = Compiler->ValueCount; - Chunk->Values[Chunk->Count] = Value; - Chunk->Count += 1; - Compiler->ValueCount += 1; - return(Result); -} - -static void S_EmitConstant(scene_compiler *Compiler, scene_value Value) -{ - S_EmitByte(Compiler, S_Op_Constant); - S_EmitU32(Compiler, S_MakeConstant(Compiler, Value)); -} - -static void S_SetEmissionTarget(scene_compiler *Compiler, scene_emission_target Target) -{ - Compiler->TargetStack[Compiler->TargetStackIndex] = Target; -} - -static void S_PushEmissionTarget(scene_compiler *Compiler, scene_emission_target Target) -{ - Compiler->TargetStackIndex += 1; - Compiler->TargetStack[Compiler->TargetStackIndex] = Target; -} - -static void S_PopEmissionTarget(scene_compiler *Compiler) -{ - Compiler->TargetStackIndex -= 1; -} - -static void S_AdvanceCompiler(scene_compiler *Compiler) -{ - Compiler->At += 1; -} - -static scene_parse_rule S_ParseRuleFromToken(scene_compiler *Compiler, token Token) -{ - scene_parse_rule Result = {}; - switch(Token.Kind) - { - case TokenKind_ParenthesisOpen: { Result = { S_ParseGrouping, 0, S_Precedence_None }; } break; - case TokenKind_Bang: { Result = { S_ParseUnary, 0, S_Precedence_None }; } break; - case TokenKind_Minus: { Result = { S_ParseUnary, S_ParseBinary, S_Precedence_Term }; } break; - case TokenKind_Plus: { Result = { 0, S_ParseBinary, S_Precedence_Term }; } break; - case TokenKind_Star: { Result = { 0, S_ParseBinary, S_Precedence_Factor }; } break; - case TokenKind_Slash: { Result = { 0, S_ParseBinary, S_Precedence_Factor }; } break; - case TokenKind_EqualEqual: { Result = { 0, S_ParseBinary, S_Precedence_Equality }; } break; - case TokenKind_BangEqual: { Result = { 0, S_ParseBinary, S_Precedence_Equality }; } break; - case TokenKind_Greater: { Result = { 0, S_ParseBinary, S_Precedence_Comparison }; } break; - case TokenKind_GreaterEqual: { Result = { 0, S_ParseBinary, S_Precedence_Comparison }; } break; - case TokenKind_Less: { Result = { 0, S_ParseBinary, S_Precedence_Comparison }; } break; - case TokenKind_LessEqual: { Result = { 0, S_ParseBinary, S_Precedence_Comparison }; } break; - case TokenKind_False: { Result = { S_ParseLiteral, 0, S_Precedence_None }; } break; - case TokenKind_True: { Result = { S_ParseLiteral, 0, S_Precedence_None }; } break; - case TokenKind_Numeric: { Result = { S_ParseNumber, 0, S_Precedence_None }; } break; - case TokenKind_StringLiteral: { Result = { S_ParseString, 0, S_Precedence_None }; } break; - case TokenKind_Identifier: { Result = { S_ParseVariable, 0, S_Precedence_None }; } break; - default: - { - //InvalidCodepath; - } break; - } - - return(Result); -} - -static token S_ConsumeToken(scene_compiler *Compiler, token_kind Kind, char *Message) -{ - token Token = Compiler->At[0]; - string String = T_StringFromToken(Compiler->Text, Token); - if(Token.Kind != Kind) - { - S_ParseError(Compiler, Message); - } - - Compiler->At += 1; - return(Token); -} - -static void S_ParseTopLevelDeclaration(scene_compiler *Compiler) -{ - if(Compiler->At[0].Kind == TokenKind_Proc) - { - Compiler->At += 1; - S_ParseProcedure(Compiler); - } - else if(Compiler->At[0].Kind == TokenKind_Var) - { - Compiler->At += 1; - S_ParseVariableDeclaration(Compiler); - } - else if(Compiler->At[0].Kind == TokenKind_Nav) - { - Compiler->At += 1; - S_ParseNavFilePath(Compiler); - } - else if(Compiler->At[0].Kind == TokenKind_Background) - { - Compiler->At += 1; - S_ParseBackgroundAsset(Compiler); - } - else - { - S_ParseError(Compiler, "Expected top-level declaration (proc, var, background or nav).", 0); - Compiler->At += 1; - } -} - -static void S_ParseNavFilePath(scene_compiler *Compiler) -{ - token NameToken = Compiler->At[0]; - Compiler->At += 1; - - if(NameToken.Kind == TokenKind_StringLiteral) - { - Compiler->NavFileName = Substring(Compiler->Text, Pad(NameToken.Range, -1)); - if(Compiler->At[0].Kind == TokenKind_Semicolon) - { - // sixten: all good - Compiler->At += 1; - } - else - { - S_ParseError(Compiler, "Expected ';'.", 0); - } - } - else - { - S_ParseError(Compiler, "Expected nav file name."); - } -} - -static void S_ParseBackgroundAsset(scene_compiler *Compiler) -{ - token AssetNameToken = Compiler->At[0]; - Compiler->At += 1; - if(AssetNameToken.Kind == TokenKind_Identifier) - { - //- sixten: find asset id by name - string AssetName = Substring(Compiler->Text, AssetNameToken.Range); - Compiler->BackgroundTexture = AssetID_None; - for(u64 AssetIndex = 0; AssetIndex < AssetID_COUNT; AssetIndex += 1) - { - if(AreEqual(MakeString(AssetNameLUT[AssetIndex]), AssetName)) - { - Compiler->BackgroundTexture = AssetIndex; - goto ValidAssetFound; - } - } - S_ParseError(Compiler, "Invalid asset name."); - - ValidAssetFound:; - if(Compiler->At[0].Kind == TokenKind_Semicolon) - { - // sixten: all good - Compiler->At += 1; - } - else - { - S_ParseError(Compiler, "Expected ';'.", 0); - } - } -} - -static void S_ParseProcedure(scene_compiler *Compiler) -{ - token NameToken = S_ConsumeToken(Compiler, TokenKind_Identifier, "Expected procedure name after 'proc'"); - S_ConsumeToken(Compiler, TokenKind_CurlyOpen, "Expected '{' after procedure name."); - - if(!Compiler->InPanicMode) - { - string Name = T_StringFromToken(Compiler->Text, NameToken); - scene_bytecode_bucket *Bucket = &Compiler->ProcBuckets[HashString(Name)%ArrayCount(Compiler->ProcBuckets)]; - S_SetEmissionTarget(Compiler, S_NamedEmissionTarget(Compiler->Arena, Bucket, Name)); - - for(;Compiler->At < Compiler->TokensEnd;) - { - if(Compiler->At[0].Kind == TokenKind_CurlyClose) - { - Compiler->At += 1; - break; - } - else - { - S_ParseDeclaration(Compiler); - } - } - } -} -static void S_ParseDeclaration(scene_compiler *Compiler) -{ - switch(Compiler->At[0].Kind) - { - case TokenKind_Var: - { - Compiler->At += 1; - S_ParseVariableDeclaration(Compiler); - } break; - case TokenKind_Jump: - { - Compiler->At += 1; - S_ParseJumpStatement(Compiler); - } break; - case TokenKind_Branch: - { - Compiler->At += 1; - S_ParseBranchStatement(Compiler); - } break; - case TokenKind_At: - { - Compiler->At += 1; - - token IdentifierToken = S_ConsumeToken(Compiler, TokenKind_Identifier, "Expected identifier after '@'"); - S_EmitConstant(Compiler, S_MakeSourceRef(IdentifierToken)); - - if(Compiler->At->Kind == TokenKind_ParenthesisOpen) - { - Compiler->At += 1; - token StateToken = S_ConsumeToken(Compiler, TokenKind_Identifier, "Expected character state."); - S_ConsumeToken(Compiler, TokenKind_ParenthesisClose, "Expected ')' after character state."); - - S_EmitConstant(Compiler, S_MakeSourceRef(StateToken)); - } - else - { - S_EmitConstant(Compiler, S_MakeNil()); - } - - S_EmitByte(Compiler, S_Op_ShowCharacter); - - if(Compiler->At->Kind == TokenKind_Semicolon) - { - Compiler->At += 1; - } - } break; - case TokenKind_StringLiteral: - { - S_ParseExpression(Compiler); - - //- sixten: parse tags - { - b32 EmitAwait = true; - b32 EmitClear = true; - for(;Compiler->At[0].Kind == TokenKind_PoundSign;) - { - Compiler->At += 1; - token TagToken = S_ConsumeToken(Compiler, TokenKind_Identifier, "Expected tag name after '#'."); - string TagString = T_StringFromToken(Compiler->Text, TagToken); - if(AreEqual(TagString, StrLit("noclear"))) - { - EmitClear = false; - } - else if(AreEqual(TagString, StrLit("noawait"))) - { - EmitAwait = false; - } - else - { - S_ParseError(Compiler, "Unknown tag."); - } - } - - if(EmitClear) - { - S_EmitByte(Compiler, S_Op_ClearDialog); - } - - S_EmitByte(Compiler, S_Op_LineEntry); - - if(EmitAwait) - { - S_EmitByte(Compiler, S_Op_AwaitInput); - } - - S_ConsumeToken(Compiler, TokenKind_Semicolon, "Expected ';' after statement."); - } - } break; - default: - { - S_ParseStatement(Compiler); - S_EmitByte(Compiler, S_Op_Pop); - } break; - } - - if(Compiler->InPanicMode) - { - for(;Compiler->At < Compiler->TokensEnd;) - { - if(Compiler->At[-1].Kind == TokenKind_Semicolon) - { - goto End; - } - - switch(Compiler->At[0].Kind) - { - case TokenKind_Var: goto End; - case TokenKind_StringLiteral: goto End; - case TokenKind_Jump: goto End; - case TokenKind_Branch: goto End; - default: break; - } - - Compiler->At += 1; - } - - End: - Compiler->InPanicMode = false; - } -} - -static void S_ParseVariableDeclaration(scene_compiler *Compiler) -{ - S_ConsumeToken(Compiler, TokenKind_Identifier, "Expected variable name."); - u64 NameConstant = S_MakeConstant(Compiler, S_MakeSourceRef(Compiler->At[-1])); - - if(Compiler->At[0].Kind == TokenKind_Equal) - { - Compiler->At += 1; - S_ParseExpression(Compiler); - } - else - { - S_EmitByte(Compiler, S_Op_Nil); - } - - S_ConsumeToken(Compiler, TokenKind_Semicolon, "Expected ';' after variable declaration."); - - S_EmitByte(Compiler, S_Op_DefineGlobal); - - Assert(NameConstant < U32_Max); - S_EmitU32(Compiler, NameConstant); -} - -static void S_ParseVariable(scene_compiler *Compiler, b32 CanAssign) -{ - S_ParseNamedVariable(Compiler, Compiler->At[-1], CanAssign); -} - -static void S_ParseNamedVariable(scene_compiler *Compiler, token Token, b32 CanAssign) -{ - u64 NameConstant = S_MakeConstant(Compiler, S_MakeSourceRef(Token)); - if(CanAssign && Compiler->At[0].Kind == TokenKind_Equal) - { - Compiler->At += 1; - S_ParseExpression(Compiler); - S_EmitByte(Compiler, S_Op_SetGlobal); - } - else - { - S_EmitByte(Compiler, S_Op_GetGlobal); - } - S_EmitU32(Compiler, NameConstant); -} - -static void S_ParseJumpStatement(scene_compiler *Compiler) -{ - S_ConsumeToken(Compiler, TokenKind_Identifier, "Expected jump destination."); - token DestToken = Compiler->At[-1]; - - S_EmitByte(Compiler, S_Op_Jump); - S_EmitU32(Compiler, S_MakeConstant(Compiler, S_MakeSourceRef(DestToken))); - - S_ConsumeToken(Compiler, TokenKind_Semicolon, "Expected ';' after jump statement."); -} - -static void S_ParseBranchStatement(scene_compiler *Compiler) -{ - temp Scratch = GetScratch(); - - scene_branch_case *FirstBranch = 0, *LastBranch = 0; - - S_ConsumeToken(Compiler, TokenKind_CurlyOpen, "Expected '{' after 'branch'."); - for(;Compiler->At < Compiler->TokensEnd;) - { - if(Compiler->At[0].Kind == TokenKind_CurlyClose) - { - Compiler->At += 1; - break; - } - else - { - //- sixten: parse branch declarations - switch(Compiler->At[0].Kind) - { - case TokenKind_StringLiteral: - { - scene_branch_case *Branch = S_ParseBranchCase(Compiler, Scratch.Arena); - QueuePush(FirstBranch, LastBranch, Branch); - } break; - - default: - { - S_ParseError(Compiler, "Expected branch case."); - Compiler->At += 1; - } break; - } - } - } - - //- sixten: emit add_branch calls - for(scene_branch_case *Branch = FirstBranch; Branch != 0; Branch = Branch->Next) - { - S_EmitByte(Compiler, S_Op_AddBranch); - S_EmitU32(Compiler, S_MakeConstant(Compiler, S_MakeSourceRef(Branch->Name))); - S_EmitU32(Compiler, S_MakeConstant(Compiler, S_MakeOffset(0))); - scene_value_chunk *Chunk = Compiler->LastValueChunk; - Branch->OffsetValue = &Chunk->Values[Chunk->Count-1]; - } - - S_EmitByte(Compiler, S_Op_Halt); - - // sixten: We need to keep track of the amount of bytes that have been emitted between branch cases, such that we can patch our relative jumps - // to point to the correct address. - s64 BaseOffset = 0; - - //- sixten: emit branch contents - for(scene_branch_case *Branch = FirstBranch; Branch != 0; Branch = Branch->Next) - { - //- sixten: patch branch jump dest - Branch->OffsetValue->Offset = BaseOffset; - - if(Branch->Bucket.Count > 0) - { - S_EmitBucket(Compiler, &Branch->Bucket); - BaseOffset += (Branch->Bucket.Count - 1)*ArrayCount(scene_bytecode_chunk::Data)+Branch->Bucket.Last->Count; - } - - S_EmitByte(Compiler, S_Op_JumpClose); - BaseOffset += 1; - S_EmitU32(Compiler, S_MakeConstant(Compiler, S_MakeOffset(BaseOffset))); - BaseOffset += 4; - - scene_value_chunk *Chunk = Compiler->LastValueChunk; - Branch->EndOffsetValue = &Chunk->Values[Chunk->Count-1]; - } - - //- sixten: patch the last jump - for(scene_branch_case *Branch = FirstBranch; Branch != 0; Branch = Branch->Next) - { - // sixten(NOTE): This little line here feels rather sketchy, it may one day fail on us. - Branch->EndOffsetValue->Offset = BaseOffset-Branch->EndOffsetValue->Offset-4; - } - - ReleaseScratch(Scratch); -} - -static scene_branch_case *S_ParseBranchCase(scene_compiler *Compiler, arena *Arena) -{ - scene_branch_case *Branch = PushStruct(Arena, scene_branch_case); - Branch->Name = S_ConsumeToken(Compiler, TokenKind_StringLiteral, "Expected branch label at start of branch case."); - - S_ConsumeToken(Compiler, TokenKind_CurlyOpen, "Expected '{' after branch label."); - - S_PushEmissionTarget(Compiler, S_RawEmissionTarget(Arena, &Branch->Bucket)); - for(;Compiler->At < Compiler->TokensEnd;) - { - if(Compiler->At[0].Kind == TokenKind_CurlyClose) - { - Compiler->At += 1; - break; - } - else - { - S_ParseDeclaration(Compiler); - } - } - S_PopEmissionTarget(Compiler); - - return(Branch); -} - -static void S_ParseStatement(scene_compiler *Compiler) -{ - S_ParseExpression(Compiler); - S_ConsumeToken(Compiler, TokenKind_Semicolon, "Expected ';' after statement."); -} - -static void S_ParseExpression(scene_compiler *Compiler) -{ - S_ParsePrecedence(Compiler, S_Precedence_Assignment); -} - -static void S_ParseLiteral(scene_compiler *Compiler, b32 CanAssign) -{ - string Value = T_StringFromToken(Compiler->Text, Compiler->At[-1]); - switch(Compiler->At[-1].Kind) - { - case TokenKind_False: { S_EmitByte(Compiler, S_Op_False); } break; - case TokenKind_True: { S_EmitByte(Compiler, S_Op_True); } break; - InvalidDefaultCase; - } -} - -static void S_ParseNumber(scene_compiler *Compiler, b32 CanAssign) -{ - r64 Value = DoubleFromString(T_StringFromToken(Compiler->Text, Compiler->At[-1])); - - S_EmitConstant(Compiler, S_MakeNumber(Value)); -} - -static void S_ParseString(scene_compiler *Compiler, b32 CanAssign) -{ - S_EmitConstant(Compiler, S_MakeSourceRef(Pad(Compiler->At[-1].Range, -1))); -} - -static void S_ParseGrouping(scene_compiler *Compiler, b32 CanAssign) -{ - S_ParseExpression(Compiler); - S_ConsumeToken(Compiler, TokenKind_ParenthesisClose, "Expected ')' after expression."); -} - -static void S_ParseUnary(scene_compiler *Compiler, b32 CanAssign) -{ - scene_operator Operator = S_OperatorFromString(T_StringFromToken(Compiler->Text, Compiler->At[-1])); - S_ParsePrecedence(Compiler, S_Precedence_Unary); - - switch(Operator) - { - case S_Operator_Minus: { S_EmitByte(Compiler, S_Op_Negate); } break; - case S_Operator_Not: { S_EmitByte(Compiler, S_Op_Not); } break; - InvalidDefaultCase; - } -} - -static void S_ParseBinary(scene_compiler *Compiler, b32 CanAssign) -{ - token Token = Compiler->At[-1]; - scene_operator Operator = S_OperatorFromString(T_StringFromToken(Compiler->Text, Token)); - scene_parse_rule Rule = S_ParseRuleFromToken(Compiler, Token); - S_ParsePrecedence(Compiler, (scene_precedence)(Rule.Precedence + 1)); - - switch(Operator) - { - case S_Operator_Add: { S_EmitByte(Compiler, S_Op_Add); } break; - case S_Operator_Minus: { S_EmitByte(Compiler, S_Op_Subtract); } break; - case S_Operator_Multiply: { S_EmitByte(Compiler, S_Op_Multiply); } break; - case S_Operator_Divide: { S_EmitByte(Compiler, S_Op_Divide); } break; - case S_Operator_Equals: { S_EmitByte(Compiler, S_Op_Equal); } break; - case S_Operator_NotEquals: { S_EmitByte(Compiler, S_Op_Equal); S_EmitByte(Compiler, S_Op_Not); } break; - case S_Operator_Greater: { S_EmitByte(Compiler, S_Op_Greater); } break; - case S_Operator_GreaterThanOrEquals: { S_EmitByte(Compiler, S_Op_Less); S_EmitByte(Compiler, S_Op_Not); } break; - case S_Operator_Less: { S_EmitByte(Compiler, S_Op_Less); } break; - case S_Operator_LessThanOrEquals: { S_EmitByte(Compiler, S_Op_Greater); S_EmitByte(Compiler, S_Op_Not); } break; - InvalidDefaultCase; - } -} - -static void S_ParsePrecedence(scene_compiler *Compiler, scene_precedence Precedence) -{ - b32 CanAssign = (Precedence <= S_Precedence_Assignment); - - S_AdvanceCompiler(Compiler); - scene_parse_rule Rule = S_ParseRuleFromToken(Compiler, Compiler->At[-1]); - if(Rule.PrefixRule) - { - Rule.PrefixRule(Compiler, CanAssign); - } - else - { - S_ParseError(Compiler, "Expected expression."); - } - - - while(Precedence <= (Rule = S_ParseRuleFromToken(Compiler, Compiler->At[0])).Precedence) - { - S_AdvanceCompiler(Compiler); - Rule.InfixRule(Compiler, CanAssign); - } - - if(CanAssign && Compiler->At[0].Kind == TokenKind_Equal) - { - S_ParseError(Compiler, "Invalid assignment target."); - } -} - -struct proc_from_chunks_result -{ - scene_proc *Proc; - scene_bytecode_chunk *NextChunk; -}; - -static proc_from_chunks_result S_ProcFromChunks(arena *Arena, scene_bytecode_chunk *First) -{ - Assert(First != 0); - string ChunkName = First->Name; - - //- sixten: find required bytes - s64 RequiredBytes = 0; - scene_bytecode_chunk *NextChunk = 0; - { - scene_bytecode_chunk *Chunk = First; - for(;Chunk != 0 && AreEqual(Chunk->Name, ChunkName); Chunk = Chunk->Next) - { - RequiredBytes += Chunk->Count; - } - NextChunk = Chunk; - } - - scene_proc *Proc = PushStruct(Arena, scene_proc); - Proc->Name = ChunkName; - Proc->Data = PushArray(Arena, u8, RequiredBytes); - Proc->Count = RequiredBytes; - - //- sixten: copy over data from chunks - u8 *Dest = Proc->Data; - for(scene_bytecode_chunk *Chunk = First; Chunk != NextChunk; Chunk = Chunk->Next) - { - Copy(Dest, Chunk->Data, Chunk->Count); - Dest += Chunk->Count; - } - - //- sixten: fill & return - proc_from_chunks_result Result; - { - Result.Proc = Proc; - Result.NextChunk = NextChunk; - } - return(Result); -} - -static compiled_scene S_ScriptFromText(arena *Arena, string Text) -{ - compiled_scene Result = {}; - - temp Scratch = GetScratch(&Arena, 1); - tokenize_result TokenizeResult = T_TokenizeFromText(Arena, Text, T_IsIrregular); - - scene_compiler Compiler = {}; - { - Compiler.Arena = Scratch.Arena; - Compiler.Text = Text; - Compiler.TokensBegin = TokenizeResult.Tokens.Tokens; - Compiler.TokensEnd = Compiler.TokensBegin+TokenizeResult.Tokens.Count; - Compiler.At = Compiler.TokensBegin; - }; - S_SetEmissionTarget(&Compiler, S_RawEmissionTarget(Compiler.Arena, &Compiler.GlobalScope)); - - //- sixten: append tokenization errors - b32 FoundTokenizationError = false; - for(tokenizer_message *Message = TokenizeResult.Messages.First; Message != 0; Message = Message->Next) - { - if(Message->Kind == T_MessageKind_Error) - { - S_ParseError(&Compiler, (char *)Message->String.Data); - FoundTokenizationError = true; - } - } - - //- sixten: tokens -> bytecode - if(!FoundTokenizationError) - { - for(;Compiler.At < Compiler.TokensEnd;) - { - S_ParseTopLevelDeclaration(&Compiler); - } - } - - //- sixten: bake global scope - if(Compiler.GlobalScope.First) - { - proc_from_chunks_result ProcResult = S_ProcFromChunks(Arena, Compiler.GlobalScope.First); - Result.GlobalScope = ProcResult.Proc; - } - - //- sixten: bake compiled chunks - for(s64 BucketIndex = 0; BucketIndex < ArrayCount(Compiler.ProcBuckets); BucketIndex += 1) - { - scene_bytecode_bucket *Bucket = &Compiler.ProcBuckets[BucketIndex]; - for(scene_bytecode_chunk *Chunk = Bucket->First; Chunk != 0;) - { - proc_from_chunks_result ProcResult = S_ProcFromChunks(Arena, Chunk); - s64 Hash = HashString(Chunk->Name); - scene_proc_bucket *DestBucket = &Result.Buckets[Hash%ArrayCount(Result.Buckets)]; - QueuePush(DestBucket->First, DestBucket->Last, ProcResult.Proc); - Chunk = ProcResult.NextChunk; - } - } - - //- sixten: bake value chunks - { - Result.Values = PushArray(Arena, scene_value, Compiler.ValueCount); - Result.ValueCount = Compiler.ValueCount; - scene_value *Dest = Result.Values; - for(scene_value_chunk *Chunk = Compiler.FirstValueChunk; Chunk != 0; Chunk = Chunk->Next) - { - Copy(Dest, Chunk->Values, Chunk->Count*sizeof(scene_value)); - Dest += Chunk->Count; - } - } - - //- sixten: copy errors - for(scene_compile_error *Error = Compiler.Errors.First; Error != 0; Error = Error->Next) - { - scene_compile_error *New = PushStruct(Arena, scene_compile_error); - New->Message = PushString(Arena, Error->Message); - New->Token = Error->Token; - QueuePush(Result.Errors.First, Result.Errors.Last, New); - } - - Result.Errors.Count = Compiler.Errors.Count; - - //- sixten: copy nav file name - Result.NavFileName = Compiler.NavFileName; - - //- sixten: copy background texture handle - Result.BackgroundTexture = Compiler.BackgroundTexture; - - // sixten(IMPORTANT): The text is assumed to remain in memory for the duration of the scene. - Result.Source = Text; - - Result.IsValid = !Compiler.EncounteredError; - - ReleaseScratch(Scratch); - return(Result); -} - -static compiled_scene S_CopyCompiledScene(arena *Arena, compiled_scene *Compiled) -{ - compiled_scene Result = {}; - - //- sixten(TODO): copy over the errors - //Assert(Compiled->Errors.Count == 0); - - //- sixten: copy the global scope - if(Compiled->GlobalScope) - { - Result.GlobalScope = PushStruct(Arena, scene_proc); - Result.GlobalScope->Name = PushString(Arena, Compiled->GlobalScope->Name); - Result.GlobalScope->Data = PushArray(Arena, u8, Compiled->GlobalScope->Count); - Copy(Result.GlobalScope->Data, Compiled->GlobalScope->Data, Compiled->GlobalScope->Count); - Result.GlobalScope->Count = Compiled->GlobalScope->Count; - } - - //- sixten: copy the procs - for(s64 BucketIndex = 0; BucketIndex < ArrayCount(Compiled->Buckets); BucketIndex += 1) - { - scene_proc_bucket *SourceBucket = &Compiled->Buckets[BucketIndex]; - scene_proc_bucket *DestBucket = &Result.Buckets[BucketIndex]; - for(scene_proc *Proc = SourceBucket->First; Proc != 0; Proc = Proc->Next) - { - scene_proc *NewProc = PushStruct(Arena, scene_proc); - NewProc->Name = PushString(Arena, Proc->Name); - NewProc->Data = PushArray(Arena, u8, Proc->Count); - Copy(NewProc->Data, Proc->Data, Proc->Count); - NewProc->Count = Proc->Count; - QueuePush(DestBucket->First, DestBucket->Last, NewProc); - } - } - - //- sixten: copy the values - Result.Values = PushArray(Arena, scene_value, Compiled->ValueCount); - Copy(Result.Values, Compiled->Values, Compiled->ValueCount*sizeof(scene_value)); - Result.ValueCount = Compiled->ValueCount; - - //- sixten: copy the source - Result.Source = PushString(Arena, Compiled->Source); - - //- sixten: copy nav file - Result.NavFileName = PushString(Arena, Compiled->NavFileName); - - //- sixten: copy background texture handle - Result.BackgroundTexture = Compiled->BackgroundTexture; - - Result.IsValid = true;//Compiled->IsValid; // sixten(TODO): I don't know why this is commented out. - - return(Result); -} - -//////////////////////////////// -//~ sixten: Scene Runtime Functions -static void S_RuntimeError(scene_runtime *Runtime, string Message) -{ - scene_runtime_error *Error = PushStruct(Runtime->ErrorArena, scene_runtime_error); - Error->Message = PushString(Runtime->ErrorArena, Message); - DLLInsertLast(Runtime->Errors.First, Runtime->Errors.Last, Error); - Runtime->Errors.Count += 1; -} - -static void S_RuntimeErrorF(scene_runtime *Runtime, char *Format, ...) -{ - va_list Arguments; - va_start(Arguments, Format); - - scene_runtime_error *Error = PushStruct(Runtime->ErrorArena, scene_runtime_error); - Error->Message = PushFormatVariadic(Runtime->ErrorArena, Format, Arguments); - DLLInsertLast(Runtime->Errors.First, Runtime->Errors.Last, Error); - Runtime->Errors.Count += 1; - - va_end(Arguments); -} - -static scene_named_value *S_FindGlobalVariableByName(scene_runtime *Runtime, string Name, b32 AlwaysCreate) -{ - scene_named_value *Result = 0; - - u64 Hash = HashString(Name); - scene_named_value_bucket *Bucket = &Runtime->GlobalVariableBuckets[Hash%ArrayCount(Runtime->GlobalVariableBuckets)]; - - //- sixten: search for the value in the bucket - for(scene_named_value_node *Node = Bucket->First; Node != 0; Node = Node->Next) - { - scene_named_value *Value = &Node->NamedValue; - if(AreEqual(Name, Value->Name)) - { - Result = Value; - break; - } - } - - //- sixten: create it if it doesn't exist - if(Result == 0) - { - //- sixten: check the free list first - scene_named_value_bucket *FreeList = &Runtime->GlobalVariableFreeList; - scene_named_value_node *Node = FreeList->First; - if(Node) - { - DLLRemove(FreeList->First, FreeList->Last, Node); - } - else - { - Node = PushStruct(Runtime->RuntimeArena, scene_named_value_node); - } - DLLInsertLast(Bucket->First, Bucket->Last, Node); - - Result = &Node->NamedValue; - Result->Name = Name; - } - - return(Result); -} - -static scene_proc *S_FindProcByName(compiled_scene *Compiled, string Name) -{ - scene_proc *Result = 0; - u64 Hash = HashString(Name); - scene_proc_bucket *Bucket = &Compiled->Buckets[Hash%ArrayCount(Compiled->Buckets)]; - for(scene_proc *Proc = Bucket->First; Proc != 0; Proc = Proc->Next) - { - if(AreEqual(Proc->Name, Name)) - { - Result = Proc; - break; - } - } - return(Result); -} - -static void S_PushStack(scene_runtime *Runtime, scene_value Value) -{ - scene_runtime_stack *Stack = &Runtime->Stack; - if(Stack->Count < ArrayCount(Stack->Stack)) - { - Stack->Stack[Stack->Count] = Value; - Stack->Count += 1; - } - else - { - S_RuntimeError(Runtime, StrLit("Stack overflow")); - } -} - -static scene_value S_PopStack(scene_runtime *Runtime) -{ - scene_value Result = {}; - scene_runtime_stack *Stack = &Runtime->Stack; - if(Stack->Count > 0) - { - Stack->Count -= 1; - Result = Stack->Stack[Stack->Count]; - } - else - { - S_RuntimeError(Runtime, StrLit("Stack underflow")); - } - return(Result); -} - -static scene_value S_PopStackAndImplicitConvert(scene_runtime *Runtime) -{ - scene_value Result = S_PopStack(Runtime); - if(Result.Kind == S_ValueKind_SourceRef) - { - Result.Kind = S_ValueKind_String; - Result.String = Substring(Runtime->Compiled.Source, Result.SourceRef); - } - return(Result); -} - -static void S_SetCurrentProc(scene_runtime *Runtime, scene_proc *Proc) -{ - Runtime->CurrentProc = Proc; - Runtime->IP = 0; - Runtime->BranchCount = 0; -} - -static void S_ResetRuntime(scene_runtime *Runtime) -{ - S_SetCurrentProc(Runtime, 0); - Fill(Runtime->GlobalVariableBuckets, 0, sizeof(Runtime->GlobalVariableBuckets)); - ZeroStruct(&Runtime->GlobalVariableFreeList); - - ZeroStruct(&Runtime->Errors); - - if(Runtime->RuntimeArena) - { - ArenaClear(Runtime->RuntimeArena); - } - else - { - Runtime->RuntimeArena = ArenaAlloc(Kilobytes(16)); - } -} - -static scene_runtime_result S_Run(scene_runtime *Runtime, arena *Arena, b32 AdvanceOnAwait) -{ - scene_runtime_result Result = {}; - compiled_scene *Compiled = &Runtime->Compiled; - - Assert(Runtime != 0); - Assert(Compiled->IsValid); - - // sixten(NOTE): This will only work on little endian architectures. -#define S_ReadU32() (Runtime->IP += 4, *(u32 *)(Data+Runtime->IP-4)) -#define S_ReadValue() Compiled->Values[S_ReadU32()] - - //- sixten: run the bytecode interpreter - if(Runtime->CurrentProc) - { - if(Runtime->IP < Runtime->CurrentProc->Count) - { - u8 *Data = Runtime->CurrentProc->Data; - - switch(Data[Runtime->IP]) - { - case S_Op_Constant: - { - Runtime->IP += 1; - S_PushStack(Runtime, S_ReadValue()); - } break; - - case S_Op_Pop: - { - Runtime->IP += 1; - S_PopStack(Runtime); - } break; - - case S_Op_Nil: - { - Runtime->IP += 1; - S_PushStack(Runtime, S_MakeNil()); - } break; - - case S_Op_True: - { - Runtime->IP += 1; - S_PushStack(Runtime, S_MakeBoolean(true)); - } break; - - case S_Op_False: - { - Runtime->IP += 1; - S_PushStack(Runtime, S_MakeBoolean(false)); - } break; - - case S_Op_Add: - { - Runtime->IP += 1; - scene_value Value1 = S_PopStackAndImplicitConvert(Runtime); - scene_value Value2 = S_PopStackAndImplicitConvert(Runtime); - if(Value1.Kind == S_ValueKind_Number && Value2.Kind == S_ValueKind_Number) - { - S_PushStack(Runtime, S_MakeNumber(Value1.Number + Value2.Number)); - } - else if(Value1.Kind == S_ValueKind_String && Value2.Kind == S_ValueKind_String) - { - S_RuntimeError(Runtime, StrLit("String concatination is not yet supported.")); - } - else - { - S_RuntimeError(Runtime, StrLit("This operation is not supported.")); - } - } break; - - case S_Op_Subtract: - { - Runtime->IP += 1; - scene_value Value1 = S_PopStack(Runtime); - scene_value Value2 = S_PopStack(Runtime); - if(Value1.Kind == S_ValueKind_Number && Value2.Kind == S_ValueKind_Number) - { - S_PushStack(Runtime, S_MakeNumber(Value1.Number - Value2.Number)); - } - else - { - S_RuntimeError(Runtime, StrLit("This operation is not supported.")); - } - } break; - - case S_Op_Multiply: - case S_Op_Divide: - { - S_RuntimeError(Runtime, StrLit("This operation is not supported.")); - } break; - - case S_Op_DefineGlobal: - { - Runtime->IP += 1; - scene_value Value = Runtime->Compiled.Values[S_ReadU32()]; - if(Value.Kind == S_ValueKind_SourceRef) - { - string Name = Substring(Runtime->Compiled.Source, Value.SourceRef); - scene_named_value *NamedValue = S_FindGlobalVariableByName(Runtime, Name); - if(!NamedValue->Initialized) - { - NamedValue->Initialized = true; - scene_value TargetValue = S_PopStackAndImplicitConvert(Runtime); - NamedValue->Value = TargetValue; - } - else - { - S_RuntimeErrorF(Runtime, "Global %S is already defined.", Name); - } - } - else - { - S_RuntimeError(Runtime, StrLit("Incorrect value kind when retrieving global name.")); - } - - } break; - - case S_Op_Jump: - { - Runtime->IP += 1; - scene_value Value = S_ReadValue(); - if(Value.Kind == S_ValueKind_SourceRef) - { - string JumpDest = Substring(Compiled->Source, Value.SourceRef); - scene_proc *Dest = S_FindProcByName(Compiled, JumpDest); - if(Dest) - { - S_SetCurrentProc(Runtime, Dest); - } - else - { - S_RuntimeErrorF(Runtime, "Trying to jump to unknown proc: %S", JumpDest); - } - } - else - { - S_RuntimeErrorF(Runtime, "Incorrect value kind when retrieving jump destination."); - } - } break; - - case S_Op_JumpClose: - { - Runtime->IP += 1; - scene_value OffsetValue = S_ReadValue(); - if(OffsetValue.Kind == S_ValueKind_Offset) - { - Runtime->IP += OffsetValue.Offset; - } - else - { - S_RuntimeErrorF(Runtime, "Incorrect value kind when retrieving offset."); - } - } break; - - case S_Op_AddBranch: - { - Runtime->IP += 1; - scene_value BranchName = S_ReadValue(); - if(BranchName.Kind == S_ValueKind_SourceRef) - { - scene_value Offset = S_ReadValue(); - if(Offset.Kind == S_ValueKind_Offset) - { - branch_case *Branch = &Runtime->Branches[Runtime->BranchCount]; - Branch->Name = Substring(Compiled->Source, Pad(BranchName.SourceRef, -1)); - Branch->Offset = Offset.Offset; - Runtime->BranchCount += 1; - } - else - { - S_RuntimeErrorF(Runtime, "Incorrect value kind when retrieving offset."); - } - } - else - { - S_RuntimeErrorF(Runtime, "Incorrect value kind when retrieving branch name."); - } - } break; - - case S_Op_Halt: { Result.ReachedAwait = true; } break; - - case S_Op_AwaitInput: - { - if(AdvanceOnAwait) - { - Runtime->IP += 1; - } - Result.ReachedAwait = true; - } break; - - case S_Op_ClearDialog: - { - scene_textbox_action *Action = PushStructNoClear(Arena, scene_textbox_action); - Action->Kind = S_TextboxActionKind_Set; - Action->String = StrLit(""); - QueuePush(Runtime->FirstTextboxAction, Runtime->LastTextboxAction, Action); - - Runtime->IP += 1; - } break; - - case S_Op_ShowCharacter: - { - Runtime->IP += 1; - - scene_value State = S_PopStackAndImplicitConvert(Runtime); - scene_value CharacterValue = S_PopStackAndImplicitConvert(Runtime); - - string Character = StrLit(""); - if(CharacterValue.Kind == S_ValueKind_String) - { - Character = CharacterValue.String; - } - else - { - S_RuntimeErrorF(Runtime, "Incorrect value kind when retrieving character name."); - } - - // sixten: create & apply character action - scene_character_action *Action = PushStruct(Arena, scene_character_action); - Action->Target = Character; - - if(State.Kind == S_ValueKind_Nil) - { - Action->State = CR_State_Invalid; - } - else - { - Action->State = CR_CharacterStateFromString(State.String); - } - DLLInsertLast(Runtime->FirstCharacterAction, Runtime->LastCharacterAction, Action); - } break; - - case S_Op_LineEntry: - { - scene_textbox_action *Action = PushStructNoClear(Arena, scene_textbox_action); - Action->Kind = S_TextboxActionKind_Append; - - Runtime->IP += 1; - - scene_value Value = S_PopStack(Runtime); - if(Value.Kind == S_ValueKind_SourceRef) - { - Action->String = Substring(Compiled->Source, Value.SourceRef); - QueuePush(Runtime->FirstTextboxAction, Runtime->LastTextboxAction, Action); - } - else - { - S_RuntimeErrorF(Runtime, "Incorrect value kind when retrieving line entry."); - } - - } break; - - default: - { - S_RuntimeErrorF(Runtime, "Unknown bytecode op: 0x%02x", Data[Runtime->IP]); - } break; - } - } - else - { - Result.ReachedAwait = true; - Runtime->CurrentProc = 0; - } - } - else - { - S_RuntimeErrorF(Runtime, "No main entry was found"); - } - - Result.HadError = !DLLIsEmpty(Runtime->Errors.First); - - Runtime->LastResult = Result; - return(Result); -} \ No newline at end of file diff --git a/code/vn_scene.h b/code/vn_scene.h deleted file mode 100644 index 28cb2fc..0000000 --- a/code/vn_scene.h +++ /dev/null @@ -1,458 +0,0 @@ -/* date = July 30th 2023 7:45 pm */ - -#ifndef VN_SCENE_H -#define VN_SCENE_H - -// sixten(IMPORTANT): The arena that the scene is compiled on -// is assumed to be the same it runs on, i.e. the interpreter relies -// on the memory addresses being the same during compilation and -// runtime. -// We also assume that the original text and tokenization remains in -// memory, for the duration of the scene. - -//////////////////////////////// -//~ sixten: Scene Compilation Types -struct scene_compile_error -{ - scene_compile_error *Next; - string Message; - token Token; -}; - -struct scene_compile_error_list -{ - scene_compile_error *First; - scene_compile_error *Last; - s64 Count; -}; - -enum scene_opcode -{ - S_Op_Invalid = 0, - - S_Op_Constant, - S_Op_Pop, - - S_Op_Nil, - S_Op_True, - S_Op_False, - - S_Op_Add, - S_Op_Subtract, - S_Op_Multiply, - S_Op_Divide, - - S_Op_Equal, - S_Op_Greater, - S_Op_Less, - - S_Op_Negate, - S_Op_Not, - - S_Op_DefineGlobal, - S_Op_GetGlobal, - S_Op_SetGlobal, - - S_Op_Jump, - S_Op_JumpClose, - S_Op_AddBranch, - S_Op_Halt, - - S_Op_AwaitInput, - S_Op_ClearDialog, - S_Op_LineEntry, - S_Op_ShowCharacter, -}; - -struct scene_bytecode_chunk -{ - scene_bytecode_chunk *Next; - string Name; - s64 Count; - u8 Data[4096]; -}; - -struct scene_bytecode_bucket -{ - scene_bytecode_chunk *First; - scene_bytecode_chunk *Last; - s64 Count; -}; - -enum scene_value_kind -{ - S_ValueKind_Nil = 0, - S_ValueKind_Number, - S_ValueKind_Boolean, - S_ValueKind_Pointer, - S_ValueKind_SourceRef, - S_ValueKind_String, - S_ValueKind_Offset, -}; - -struct scene_value -{ - scene_value_kind Kind; - union - { - r64 Number; - b32 Boolean; - u64 Pointer; - range1_s64 SourceRef; - string String; - s64 Offset; - }; -}; - -struct scene_value_chunk -{ - scene_value_chunk *Next; - s64 Count; - scene_value Values[512]; -}; - -enum scene_precedence -{ - S_Precedence_None, - S_Precedence_Assignment, - S_Precedence_Or, - S_Precedence_And, - S_Precedence_Equality, - S_Precedence_Comparison, - S_Precedence_Term, - S_Precedence_Factor, - S_Precedence_Unary, - S_Precedence_Call, - S_Precedence_Primary, -}; - -typedef void scene_parse_function(struct scene_compiler *Compiler, b32 CanAssign); - -struct scene_parse_rule -{ - scene_parse_function *PrefixRule; - scene_parse_function *InfixRule; - scene_precedence Precedence; -}; - -enum scene_emission_target_type -{ - S_EmissionTarget_Raw, - S_EmissionTarget_Named, -}; - -struct scene_emission_target -{ - arena *Arena; - scene_bytecode_bucket *Bucket; - scene_emission_target_type Type; - string Name; -}; - -struct scene_branch_case -{ - scene_branch_case *Next; - token Name; - scene_bytecode_bucket Bucket; - scene_value *OffsetValue; - scene_value *EndOffsetValue; -}; - -struct scene_character_action -{ - scene_character_action *Next; - scene_character_action *Prev; - - string Target; - character_state State; -}; - -struct scene_compiler -{ - arena *Arena; - - b32 InPanicMode; - b32 EncounteredError; - scene_compile_error_list Errors; - - string Text; - token *TokensBegin; - token *TokensEnd; - token *At; - - scene_bytecode_bucket GlobalScope; - scene_bytecode_bucket ProcBuckets[32]; - - scene_emission_target TargetStack[16]; - s32 TargetStackIndex; - - scene_value_chunk *FirstValueChunk; - scene_value_chunk *LastValueChunk; - s64 ValueCount; - - string NavFileName; - asset_id BackgroundTexture; -}; - -//////////////////////////////// -//~ sixten: Compiled Scene Types -struct scene_proc -{ - // sixten: scene data - string Name; - u8 *Data; - s64 Count; - - // sixten: hash link - scene_proc *Next; -}; - -struct scene_proc_bucket -{ - scene_proc *First; - scene_proc *Last; -}; - -struct compiled_scene -{ - scene_proc *GlobalScope; - scene_proc_bucket Buckets[16]; - scene_value *Values; - s64 ValueCount; - string Source; - string NavFileName; - asset_id BackgroundTexture; - scene_compile_error_list Errors; - b32 IsValid; -}; - -//////////////////////////////// -//~ sixten: Scene Runtime Types -struct scene_runtime_error -{ - scene_runtime_error *Next; - scene_runtime_error *Prev; - string Message; -}; - -struct scene_runtime_error_list -{ - scene_runtime_error *First; - scene_runtime_error *Last; - s64 Count; -}; - -struct scene_named_value -{ - b32 Initialized; - string Name; - scene_value Value; -}; - -struct scene_named_value_node -{ - scene_named_value_node *Next; - scene_named_value_node *Prev; - scene_named_value NamedValue; -}; - -struct scene_named_value_bucket -{ - s64 Count; - scene_named_value_node *First; - scene_named_value_node *Last; -}; - -struct scene_runtime_result -{ - b32 HadError; - b32 ReachedAwait; -}; - -enum scene_textbox_action_kind -{ - S_TextboxActionKind_Set, - S_TextboxActionKind_Append, -}; - -struct scene_textbox_action -{ - scene_textbox_action *Next; - scene_textbox_action_kind Kind; - string String; -}; - -struct branch_case -{ - string Name; - s64 Offset; -}; - -struct scene_runtime_stack -{ - scene_value Stack[128]; - s32 Count; -}; - -struct scene_runtime -{ - compiled_scene Compiled; - - // sixten: runtime state - arena *RuntimeArena; - scene_proc *CurrentProc; - s64 IP; - scene_runtime_stack Stack; - scene_named_value_bucket GlobalVariableBuckets[16]; - scene_named_value_bucket GlobalVariableFreeList; - - // sixten: errors - arena *ErrorArena; - scene_runtime_error_list Errors; - - // sixten: branches - branch_case Branches[16]; - s64 BranchCount; - - // sixten: result - scene_runtime_result LastResult; - scene_textbox_action *FirstTextboxAction; - scene_textbox_action *LastTextboxAction; - scene_character_action *FirstCharacterAction; - scene_character_action *LastCharacterAction; -}; - -//////////////////////////////// -//~ sixten: Scene Compiler Functions - -//- sixten: value helpers -inline scene_value S_MakeNil(void) -{ - scene_value Result; - Result.Kind = S_ValueKind_Nil; - return(Result); -} - -inline scene_value S_MakeNumber(r64 Value) -{ - scene_value Result; - Result.Kind = S_ValueKind_Number; - Result.Number = Value; - return(Result); -} - -inline scene_value S_MakeBoolean(b32 Value) -{ - scene_value Result; - Result.Kind = S_ValueKind_Boolean; - Result.Boolean = Value; - return(Result); -} - -inline scene_value S_MakePointer(void *Value) -{ - scene_value Result; - Result.Kind = S_ValueKind_Pointer; - Result.Pointer = PointerToU64(Value); - return(Result); -} - -inline scene_value S_MakeSourceRef(token Token) -{ - scene_value Result; - Result.Kind = S_ValueKind_SourceRef; - Result.SourceRef = Token.Range; - return(Result); -} - -inline scene_value S_MakeSourceRef(range1_s64 Range) -{ - scene_value Result; - Result.Kind = S_ValueKind_SourceRef; - Result.SourceRef = Range; - return(Result); -} - -inline scene_value S_MakeOffset(s64 Offset) -{ - scene_value Result; - Result.Kind = S_ValueKind_Offset; - Result.Offset = Offset; - return(Result); -} - -//- sixten: error messaging -static void S_ParseError(scene_compiler *Compiler, char *Message, s64 TokenOffset = -1); - -//- sixten: bytecode helpers -static void S_EmitByte(scene_compiler *Compiler, u8 Byte); -static void S_EmitU32(scene_compiler *Compiler, u32 Value); -static void S_EmitBucket(scene_compiler *Compiler, scene_bytecode_bucket *Bucket); -static u64 S_MakeConstant(scene_compiler *Compiler, scene_value Value); -static void S_EmitConstant(scene_compiler *Compiler, scene_value Value); -static void S_SetEmissionTarget(scene_compiler *Compiler, scene_emission_target Target); -static void S_PushEmissionTarget(scene_compiler *Compiler, scene_emission_target Target); -static void S_PopEmissionTarget(scene_compiler *Compiler); - -inline scene_emission_target S_RawEmissionTarget(arena *Arena, scene_bytecode_bucket *Bucket) -{ - scene_emission_target Target = {}; - Target.Arena = Arena; - Target.Bucket = Bucket; - Target.Type = S_EmissionTarget_Raw; - return(Target); -} - -inline scene_emission_target S_NamedEmissionTarget(arena *Arena, scene_bytecode_bucket *Bucket, string Name) -{ - scene_emission_target Target = {}; - Target.Arena = Arena; - Target.Bucket = Bucket; - Target.Type = S_EmissionTarget_Named; - Target.Name = Name; - return(Target); -} - -//- sixten: parsing helpers -static void S_AdvanceCompiler(scene_compiler *Compiler); -static scene_parse_rule S_ParseRuleFromToken(scene_compiler *Compiler, token Token); -static token S_ConsumeToken(scene_compiler *Compiler, token_kind Kind, char *Message); - -//- sixten: parsing -static void S_ParseTopLevelDeclaration(scene_compiler *Compiler); -static void S_ParseProcedure(scene_compiler *Compiler); -static void S_ParseDeclaration(scene_compiler *Compiler); -static void S_ParseVariableDeclaration(scene_compiler *Compiler); -static void S_ParseVariable(scene_compiler *Compiler, b32 CanAssign); -static void S_ParseNamedVariable(scene_compiler *Compiler, token Token, b32 CanAssign); -static void S_ParseNavFilePath(scene_compiler *Compiler); -static void S_ParseBackgroundAsset(scene_compiler *Compiler); -static void S_ParseLineEntry(scene_compiler *Compiler); -static void S_ParseJumpStatement(scene_compiler *Compiler); -static void S_ParseBranchStatement(scene_compiler *Compiler); -static scene_branch_case *S_ParseBranchCase(scene_compiler *Compiler, arena *Arena); -static void S_ParseStatement(scene_compiler *Compiler); -static void S_ParseExpression(scene_compiler *Compiler); -static void S_ParseLiteral(scene_compiler *Compiler, b32 CanAssign); -static void S_ParseNumber(scene_compiler *Compiler, b32 CanAssign); -static void S_ParseString(scene_compiler *Compiler, b32 CanAssign); -static void S_ParseGrouping(scene_compiler *Compiler, b32 CanAssign); -static void S_ParseUnary(scene_compiler *Compiler, b32 CanAssign); -static void S_ParseBinary(scene_compiler *Compiler, b32 CanAssign); -static void S_ParsePrecedence(scene_compiler *Compiler, scene_precedence Precedence); - -//- sixten: debugging -static string S_DisassembleBytecode(scene_compiler *Compiler, scene_bytecode_chunk *Chunk, arena *Arena); - -//- sixten: compilation -static compiled_scene S_ScriptFromText(arena *Arena, string Text); -static compiled_scene S_CopyCompiledScene(arena *Arena, compiled_scene *Compiled); - -//////////////////////////////// -//~ sixten: Scene Runtime Functions -static scene_proc *S_FindProcByName(compiled_scene *Compiled, string Name); -static scene_named_value *S_FindGlobalVariableByName(scene_runtime *Runtime, string Name, b32 AlwaysCreate = true); -static void S_ResetRuntime(scene_runtime *Runtime); -static scene_runtime_result S_Run(scene_runtime *Runtime, arena *Arena, b32 AdvanceOnAwait); - -#endif //VN_SCENE_H diff --git a/code/vn_scene.md b/code/vn_scene.md deleted file mode 100644 index 59c77de..0000000 --- a/code/vn_scene.md +++ /dev/null @@ -1,35 +0,0 @@ -@table(Name, Operator) scene_operator_table: -{ - { Invalid, "###" } - { Not, "!" } - { Equal, "=" } - { Equals, "==" } - { NotEquals, "!=" } - { GreaterThanOrEquals, ">=" } - { LessThanOrEquals, "<=" } - { Greater, ">" } - { Less, "<" } - { Add, "+" } - { Minus, "-" } - { Multiply "*" } - { Divide, "/" } -} - -@table_gen -{ - `enum scene_operator`; - `{`; - @expand(scene_operator_table s) `S_Operator_$(s.Name),`; - `};`; -} - -@table_gen -{ - `inline scene_operator S_OperatorFromString(string String)`; - `{`; - `scene_operator Result = S_Operator_Invalid;`; - `if(0) {}`; - @expand(scene_operator_table s) `else if(AreEqual(String, StrLit("$(s.Operator)")))$(=>40) { Result = S_Operator_$(s.Name); }`; - `return(Result);`;; - `}`; -} \ No newline at end of file diff --git a/code/vn_scene2.cpp b/code/vn_scene2.cpp new file mode 100644 index 0000000..d74a324 --- /dev/null +++ b/code/vn_scene2.cpp @@ -0,0 +1,1025 @@ +#include "generated/vn_scene2.meta.c" + + +//////////////////////////////// +//~ sixten: Scene Message Functions +static void S2_PushMessage(arena *Arena, scene2_message_list *List, token Token, string Message) +{ + scene2_message *Node = PushStruct(Arena, scene2_message); + Node->Message = PushString(Arena, Message); + Node->Token = Token; + QueuePush(List->First, List->Last, Node); + List->Count += 1; +} +static void S2_PushMessageFV(arena *Arena, scene2_message_list *List, token Token, char *Format, va_list Arguments) +{ + scene2_message *Node = PushStruct(Arena, scene2_message); + Node->Message = PushFormatVariadic(Arena, Format, Arguments); + Node->Token = Token; + QueuePush(List->First, List->Last, Node); + List->Count += 1; +} +static void S2_PushMessageF(arena *Arena, scene2_message_list *List, token Token, char *Format, ...) +{ + va_list Arguments; + va_start(Arguments, Format); + S2_PushMessageFV(Arena, List, Token, Format, Arguments); + va_end(Arguments); +} +static scene2_message_list S2_CopyMessageList(arena *Arena, scene2_message_list *Source) +{ + scene2_message_list List = {}; + for(scene2_message *Message = Source->First; Message != 0; Message = Message->Next) + { + S2_PushMessage(Arena, &List, Message->Token, Message->Message); + } + return(List); +} +static void S2_ConcatMessageList(arena *Arena, scene2_message_list *Dest, scene2_message_list *Source) +{ + for(scene2_message *Message = Source->First; Message != 0; Message = Message->Next) + { + S2_PushMessage(Arena, Dest, Message->Token, Message->Message); + } +} + + +//////////////////////////////// +//~ sixten: Scene Action Functions +static void S2_SceneActionPush(scene2_action_list *List, scene2_action *Action) +{ + QueuePush(List->First, List->Last, Action); + List->Count += 1; +} + + +//////////////////////////////// +//~ sixten: Scene Parsing Helpers +static token S2_Token(scene2_compiler *Compiler) +{ + token Token = {}; + if(Compiler->At >= 0 && Compiler->At < Compiler->Tokens.Count) + { + Token = Compiler->Tokens.Tokens[Compiler->At]; + } + return(Token); +} +static token S2_NextToken(scene2_compiler *Compiler) +{ + token Token = {}; + if(Compiler->At+1 >= 0 && Compiler->At+1 < Compiler->Tokens.Count) + { + Token = Compiler->Tokens.Tokens[Compiler->At+1]; + } + return(Token); +} +static string S2_StringFromToken(scene2_compiler *Compiler, token Token) +{ + string Result = Substring(Compiler->Source, Intersection(Token.Range, Range1S64(0, Compiler->Source.Count))); + return(Result); +} +static string S2_TokenString(scene2_compiler *Compiler) +{ + string Result = S2_StringFromToken(Compiler, S2_Token(Compiler)); + return(Result); +} +static void S2_ParseError(scene2_compiler *Compiler, token Token, string Message) +{ + S2_PushMessage(Compiler->Arena, &Compiler->Messages, Token, Message); + Compiler->InPanicMode = true; +} +static token S2_Consume(scene2_compiler *Compiler, token_kind Expected, string Message) +{ + if(S2_Token(Compiler).Kind != Expected) + { + S2_ParseError(Compiler, S2_Token(Compiler), Message); + } + token Result = Compiler->Tokens.Tokens[Compiler->At]; + S2_Advance(Compiler); + return(Result); +} +static void S2_Advance(scene2_compiler *Compiler) +{ + Compiler->At += 1; +} +static scene2_parse_rule S2_ParseRuleFromToken(scene2_compiler *Compiler, token Token) +{ + scene2_parse_rule Result = {}; + switch(Token.Kind) + { + case TokenKind_ParenthesisOpen: { Result = { S2_ParseGrouping, 0, S2_Precedence_None }; } break; + case TokenKind_Bang: { Result = { S2_ParseUnary, 0, S2_Precedence_None }; } break; + case TokenKind_Minus: { Result = { S2_ParseUnary, S2_ParseBinary, S2_Precedence_Term }; } break; + case TokenKind_Plus: { Result = { 0, S2_ParseBinary, S2_Precedence_Term }; } break; + case TokenKind_Star: { Result = { 0, S2_ParseBinary, S2_Precedence_Factor }; } break; + case TokenKind_Slash: { Result = { 0, S2_ParseBinary, S2_Precedence_Factor }; } break; + case TokenKind_EqualEqual: { Result = { 0, S2_ParseBinary, S2_Precedence_Equality }; } break; + case TokenKind_BangEqual: { Result = { 0, S2_ParseBinary, S2_Precedence_Equality }; } break; + case TokenKind_Greater: { Result = { 0, S2_ParseBinary, S2_Precedence_Comparison }; } break; + case TokenKind_GreaterEqual: { Result = { 0, S2_ParseBinary, S2_Precedence_Comparison }; } break; + case TokenKind_Less: { Result = { 0, S2_ParseBinary, S2_Precedence_Comparison }; } break; + case TokenKind_LessEqual: { Result = { 0, S2_ParseBinary, S2_Precedence_Comparison }; } break; + case TokenKind_False: { Result = { S2_ParseLiteral, 0, S2_Precedence_None }; } break; + case TokenKind_True: { Result = { S2_ParseLiteral, 0, S2_Precedence_None }; } break; + case TokenKind_Numeric: { Result = { S2_ParseNumber, 0, S2_Precedence_None }; } break; + case TokenKind_StringLiteral: { Result = { S2_ParseString, 0, S2_Precedence_None }; } break; + case TokenKind_Identifier: { Result = { S2_ParseVariable, 0, S2_Precedence_None }; } break; + case TokenKind_Call: { Result = { S2_ParseCall, 0, S2_Precedence_None }; } break; + default: {} break; + } + return(Result); +} +static scene2_instruction S2_Instruction(scene2_opcode Opcode) +{ + scene2_instruction Result = {}; + Result.Opcode = Opcode; + return(Result); +} +static scene2_instruction S2_Instruction(scene2_opcode Opcode, u64 Arg) +{ + scene2_instruction Result = {}; + Result.Opcode = Opcode; + Result.Arg = Arg; + return(Result); +} +static scene2_instruction S2_Instruction(scene2_opcode Opcode, r64 Number) +{ + scene2_instruction Result = {}; + Result.Opcode = Opcode; + Result.Number = Number; + return(Result); +} +static scene2_instruction S2_Instruction(scene2_opcode Opcode, u32 Arg1, u32 Arg2) +{ + scene2_instruction Result = {}; + Result.Opcode = Opcode; + Result.Arg1 = Arg1; + Result.Arg2 = Arg2; + return(Result); +} +static scene2_instruction S2_Instruction(scene2_opcode Opcode, range1_s64 Range) +{ + Assert(0 <= Range.Min && Range.Min <= U32_Max); + Assert(0 <= Range.Max && Range.Max <= U32_Max); + scene2_instruction Result = {}; + Result.Opcode = Opcode; + Result.Min = Range.Min; + Result.Max = Range.Max; + return(Result); +} +static scene2_instruction *S2_Emit(scene2_compiler *Compiler, scene2_instruction Instruction) +{ + scene2_instruction_chunk *Chunk = Compiler->LastChunk; + if(!Chunk || Chunk->InstructionsUsed >= ArrayCount(Chunk->Instructions)) + { + Chunk = PushStruct(Compiler->Arena, scene2_instruction_chunk); + QueuePush(Compiler->FirstChunk, Compiler->LastChunk, Chunk); + } + scene2_instruction *Result = Chunk->Instructions + Chunk->InstructionsUsed; + Chunk->InstructionsUsed += 1; + Compiler->InstructionPointer += 1; + *Result = Instruction; + return(Result); +} + + +//////////////////////////////// +//~ sixten: Scene Parsing Functions +static void S2_ParseTopLevel(scene2_compiler *Compiler) +{ + // sixten(NOTE): top-level -> { proc declaration } + for(;Compiler->At < Compiler->Tokens.Count;) + { + switch(S2_Token(Compiler).Kind) + { + case TokenKind_Proc: + { + S2_ParseProc(Compiler); + } break; + + default: + { + S2_ParseError(Compiler, S2_Token(Compiler), StrLit("Expected top level delaration (proc)")); + S2_Advance(Compiler); + } break; + } + } +} + +static void S2_ParseProc(scene2_compiler *Compiler) +{ + // sixten(NOTE): proc -> 'proc' name { statement } 'end' + + S2_Advance(Compiler); // sixten: skip 'proc' + token NameToken = S2_Consume(Compiler, TokenKind_Identifier, StrLit("Expected name after 'proc'.")); + + scene2_proc_node *Node = PushStruct(Compiler->Arena, scene2_proc_node); + QueuePush(Compiler->ProcList.First, Compiler->ProcList.Last, Node); + Compiler->ProcList.Count += 1; + Node->Info.InstructionBegin = Compiler->InstructionPointer; + Node->Info.Name = S2_StringFromToken(Compiler, NameToken); + + S2_ParseBlock(Compiler); + + Node->Info.InstructionEnd = Compiler->InstructionPointer; +} + +static void S2_ParseBlock(scene2_compiler *Compiler) +{ + // sixten: block -> { statement } 'end' + S2_Emit(Compiler, S2_Instruction(S2_Op_BeginBlock)); + + b32 FoundEnd = false; + for(;Compiler->At < Compiler->Tokens.Count;) + { + switch(S2_Token(Compiler).Kind) + { + case TokenKind_End: + { + S2_Advance(Compiler); // sixten: skip 'end' + FoundEnd = true; + goto Done; + } break; + + default: + { + S2_ParseStatement(Compiler); + } break; + } + } + Done:; + if(!FoundEnd) + { + S2_ParseError(Compiler, S2_Token(Compiler), StrLit("Expected 'end' after block.")); + } + + S2_Emit(Compiler, S2_Instruction(S2_Op_EndBlock)); +} + +static void S2_ParseStatement(scene2_compiler *Compiler) +{ + // sixten: statement -> if statement | while statement | let statetment | expression + switch(S2_Token(Compiler).Kind) + { + case TokenKind_Wait: { S2_ParseWaitStatement(Compiler); } break; + case TokenKind_If: { S2_ParseIfStatement(Compiler); } break; + case TokenKind_While: { S2_ParseWhileStatement(Compiler); } break; + case TokenKind_Let: { S2_ParseLetStatement(Compiler); } break; + case TokenKind_DollarSign: { S2_ParseShorthand(Compiler); } break; + default: { S2_ParseExpression(Compiler); } break; + } + + if(Compiler->InPanicMode) + { + for(;Compiler->At < Compiler->Tokens.Count;) + { + if(S2_Token(Compiler).Kind == TokenKind_End) + { + break; + } + else + { + S2_Advance(Compiler); + } + } + Compiler->InPanicMode = false; + } +} + +static void S2_ParseWaitStatement(scene2_compiler *Compiler) +{ + S2_Advance(Compiler); // sixten: skip 'wait' + S2_Emit(Compiler, S2_Instruction(S2_Op_Wait)); +} + +static void S2_ParseIfStatement(scene2_compiler *Compiler) +{ + S2_Advance(Compiler); // sixten: skip 'if' + S2_ParseExpression(Compiler); + S2_Emit(Compiler, S2_Instruction(S2_Op_Not)); // sixten: we only jump if the condition is _NOT_ satisfied. + scene2_instruction *JumpInstruction = S2_Emit(Compiler, S2_Instruction(S2_Op_CondJump)); + u64 OffsetBefore = Compiler->InstructionPointer; + S2_Consume(Compiler, TokenKind_Then, StrLit("Expected 'then' after if-statement")); + S2_ParseBlock(Compiler); + u64 JumpOffset = Compiler->InstructionPointer - OffsetBefore; + JumpInstruction->Arg = JumpOffset; +} + +static void S2_ParseWhileStatement(scene2_compiler *Compiler) +{ + S2_Advance(Compiler); // sixten: skip 'while' + u64 CondBeginOffset = Compiler->InstructionPointer; + S2_ParseExpression(Compiler); + S2_Emit(Compiler, S2_Instruction(S2_Op_Not)); // sixten: we only jump if the condition is _NOT_ satisfied. + scene2_instruction *CondNotSatisfiedJump = S2_Emit(Compiler, S2_Instruction(S2_Op_CondJump)); + u64 OffsetJump = Compiler->InstructionPointer; + S2_Consume(Compiler, TokenKind_Then, StrLit("Expected 'then' after while-statement")); + S2_ParseBlock(Compiler); + S2_Emit(Compiler, S2_Instruction(S2_Op_Jump, (u64)(CondBeginOffset - Compiler->InstructionPointer - 1))); + u64 EndOffset = Compiler->InstructionPointer; + CondNotSatisfiedJump->Arg = EndOffset - OffsetJump; +} + +static void S2_ParseLetStatement(scene2_compiler *Compiler) +{ + S2_Advance(Compiler); // sixten: skip 'let' + token LocalName = S2_Consume(Compiler, TokenKind_Identifier, StrLit("Expected variable name after 'let'")); + if(S2_Token(Compiler).Kind == TokenKind_Equal) + { + S2_Advance(Compiler); // sixten: skip equals + S2_ParseExpression(Compiler); + + S2_Emit(Compiler, S2_Instruction(S2_Op_SetLocal, LocalName.Range)); + S2_Emit(Compiler, S2_Instruction(S2_Op_SetVariable, LocalName.Range)); + } + else + { + S2_Emit(Compiler, S2_Instruction(S2_Op_SetLocal, LocalName.Range)); + } +} + +static void S2_ParseShorthand(scene2_compiler *Compiler) +{ + S2_Advance(Compiler); // sixten: skip '$' + + // sixten(NOTE): since we're using the parenthesis to check for a target specifier, we cannot + // use grouping as the text to append to the textbox. Should never really be an issue, but it + // does technically change how the languange should be documented. + + S2_Emit(Compiler, S2_Instruction(S2_Op_Call, S2_CallFunctionIndexFromString(StrLit("ctr_unset_all_talking")))); + S2_Emit(Compiler, S2_Instruction(S2_Op_Call, S2_CallFunctionIndexFromString(StrLit("text_clear")))); + + if(S2_Token(Compiler).Kind == TokenKind_ParenthesisOpen) + { + S2_Advance(Compiler); // sixten: skip the '(' + S2_ParseExpression(Compiler); // sixten: emit the target + S2_Emit(Compiler, S2_Instruction(S2_Op_DuplicateStack, 1llu)); + + // sixten: emit the action + if(S2_Token(Compiler).Kind == TokenKind_Comma) + { + S2_Advance(Compiler); // sixten: skip the ',' + + token AssetToken = S2_Consume(Compiler, TokenKind_Identifier, StrLit("Expected asset name after shorthand & target specifier")); + asset_id ID = A_AssetIDFromString(S2_StringFromToken(Compiler, AssetToken)); + if(ID == AssetID_None) + { + S2_ParseError(Compiler, AssetToken, StrLit("Unknown asset")); + } + S2_Emit(Compiler, S2_Instruction(S2_Op_PushNumber, (r64)ID)); + } + else + { + S2_Emit(Compiler, S2_Instruction(S2_Op_PushNil)); + } + S2_Consume(Compiler, TokenKind_ParenthesisClose, StrLit("Expetcted ')' after shorthand specifier")); + S2_Emit(Compiler, S2_Instruction(S2_Op_Call, S2_CallFunctionIndexFromString(StrLit("ctr_set")))); + S2_Emit(Compiler, S2_Instruction(S2_Op_Call, S2_CallFunctionIndexFromString(StrLit("ctr_set_talking")))); + } + + S2_ParseExpression(Compiler); + + S2_Emit(Compiler, S2_Instruction(S2_Op_Call, S2_CallFunctionIndexFromString(StrLit("text_append")))); + S2_Emit(Compiler, S2_Instruction(S2_Op_Wait)); +} + +static void S2_ParseExpression(scene2_compiler *Compiler) +{ + S2_ParsePrecedence(Compiler, S2_Precedence_Assignment); +} + +static void S2_ParsePrecedence(scene2_compiler *Compiler, scene2_precedence Precedence) +{ + b32 CanAssign = Precedence <= S2_Precedence_Assignment; + + //- sixten: do prefix rule + { + scene2_parse_rule Rule = S2_ParseRuleFromToken(Compiler, S2_Token(Compiler)); + if(Rule.PrefixRule) + { + Rule.PrefixRule(Compiler, CanAssign); + } + else + { + S2_ParseError(Compiler, S2_Token(Compiler), StrLit("Expected expression.")); + } + } + + //- sixten: do infix rule + for(;;) + { + scene2_parse_rule Rule = S2_ParseRuleFromToken(Compiler, S2_Token(Compiler)); + if(Precedence <= Rule.Precedence) + { + Rule.InfixRule(Compiler, CanAssign); + } + else + { + break; + } + } + + if(CanAssign && S2_Token(Compiler).Kind == TokenKind_Equal) + { + S2_ParseError(Compiler, S2_Token(Compiler), StrLit("Invalid assignment target.")); + } +} + +static void S2_ParseGrouping(scene2_compiler *Compiler, b32 CanAssign) +{ + UnusedVariable(CanAssign); + S2_Advance(Compiler); // sixten: skip '(' + S2_ParseExpression(Compiler); + S2_Consume(Compiler, TokenKind_ParenthesisClose, StrLit("Expected ')' after expression.")); +} + +static void S2_ParseUnary(scene2_compiler *Compiler, b32 CanAssign) +{ + UnusedVariable(CanAssign); + scene2_operator Operator = S2_OperatorFromString(S2_TokenString(Compiler)); + S2_Advance(Compiler); + S2_ParsePrecedence(Compiler, S2_Precedence_Unary); + switch(Operator) + { + case S2_Operator_Minus: { S2_Emit(Compiler, S2_Instruction(S2_Op_Negate)); } break; + case S2_Operator_Not: { S2_Emit(Compiler, S2_Instruction(S2_Op_Not)); } break; + InvalidDefaultCase; + } +} + +static void S2_ParseBinary(scene2_compiler *Compiler, b32 CanAssign) +{ + UnusedVariable(CanAssign); + token Token = S2_Token(Compiler); + scene2_operator Operator = S2_OperatorFromString(S2_TokenString(Compiler)); + scene2_parse_rule Rule = S2_ParseRuleFromToken(Compiler, Token); + S2_Advance(Compiler); // sixten: skip operator + S2_ParsePrecedence(Compiler, (scene2_precedence)(Rule.Precedence + 1)); + switch(Operator) + { + case S2_Operator_Add: { S2_Emit(Compiler, S2_Instruction(S2_Op_Add)); } break; + case S2_Operator_Minus: { S2_Emit(Compiler, S2_Instruction(S2_Op_Subtract)); } break; + case S2_Operator_Multiply: { S2_Emit(Compiler, S2_Instruction(S2_Op_Multiply)); } break; + case S2_Operator_Divide: { S2_Emit(Compiler, S2_Instruction(S2_Op_Divide)); } break; + case S2_Operator_Equals: { S2_Emit(Compiler, S2_Instruction(S2_Op_Equals)); } break; + case S2_Operator_NotEquals: { S2_Emit(Compiler, S2_Instruction(S2_Op_Equals)); S2_Emit(Compiler, S2_Instruction(S2_Op_Not)); } break; + case S2_Operator_Greater: { S2_Emit(Compiler, S2_Instruction(S2_Op_Greater)); } break; + case S2_Operator_GreaterThanOrEquals: { S2_Emit(Compiler, S2_Instruction(S2_Op_Less)); S2_Emit(Compiler, S2_Instruction(S2_Op_Not)); } break; + case S2_Operator_Less: { S2_Emit(Compiler, S2_Instruction(S2_Op_Less)); } break; + case S2_Operator_LessThanOrEquals: { S2_Emit(Compiler, S2_Instruction(S2_Op_Greater)); S2_Emit(Compiler, S2_Instruction(S2_Op_Not)); } break; + InvalidDefaultCase; + } +} + +static void S2_ParseVariable(scene2_compiler *Compiler, b32 CanAssign) +{ + token VariableToken = S2_Consume(Compiler, TokenKind_Identifier, StrLit("Expected identifier.")); + if(CanAssign && S2_Token(Compiler).Kind == TokenKind_Equal) + { + S2_Advance(Compiler); + S2_ParseExpression(Compiler); + S2_Emit(Compiler, S2_Instruction(S2_Op_SetVariable, VariableToken.Range)) ; + } + else + { + S2_Emit(Compiler, S2_Instruction(S2_Op_PushVariable, VariableToken.Range)) ; + } +} + +static void S2_ParseCall(scene2_compiler *Compiler, b32 CanAssign) +{ + UnusedVariable(CanAssign); + S2_Advance(Compiler); // sixten: skip 'call' + token NameToken = S2_Consume(Compiler, TokenKind_Identifier, StrLit("Expected function name.")); + S2_Consume(Compiler, TokenKind_ParenthesisOpen, StrLit("Expected '(' after function name")); + + //- sixten: parse arguments + token Token = S2_Token(Compiler); + if(Token.Kind != TokenKind_ParenthesisClose) + { + for(;Compiler->At < Compiler->Tokens.Count;) + { + S2_ParseExpression(Compiler); + Token = S2_Token(Compiler); + if(Token.Kind == TokenKind_ParenthesisClose) + { + break; + } + else + { + S2_Consume(Compiler, TokenKind_Comma, StrLit("Expected ',' or ')'.")); + } + } + } + S2_Advance(Compiler); // sixten: skip ')' + + S2_Emit(Compiler, S2_Instruction(S2_Op_Call, S2_CallFunctionIndexFromString(S2_StringFromToken(Compiler, NameToken)))); +} + +static void S2_ParseLiteral(scene2_compiler *Compiler, b32 CanAssign) +{ + UnusedVariable(CanAssign); + token LiteralToken = S2_Token(Compiler); + switch(LiteralToken.Kind) + { + case TokenKind_False: { S2_Emit(Compiler, S2_Instruction(S2_Op_PushBool, 0ull)); } break; + case TokenKind_True: { S2_Emit(Compiler, S2_Instruction(S2_Op_PushBool, 1ull)); } break; + InvalidDefaultCase; + } + S2_Advance(Compiler); // sixten: skip the literal +} + +static void S2_ParseNumber(scene2_compiler *Compiler, b32 CanAssign) +{ + UnusedVariable(CanAssign); + token NumberToken = S2_Token(Compiler); + S2_Advance(Compiler); // sixten: skip the numeric literal + S2_Emit(Compiler, S2_Instruction(S2_Op_PushNumber, DoubleFromString(S2_StringFromToken(Compiler, NumberToken)))); +} + +static void S2_ParseString(scene2_compiler *Compiler, b32 CanAssign) +{ + UnusedVariable(CanAssign); + token StringToken = S2_Token(Compiler); + S2_Advance(Compiler); // sixten: skip the string literal + S2_Emit(Compiler, S2_Instruction(S2_Op_PushString, Pad(StringToken.Range, -1))); // sixten(TODO): push the string to the stack +} + +static scene2_proc_list S2_CopyProcList(arena *Arena, scene2_proc_list Source) +{ + scene2_proc_list Result = {}; + for(scene2_proc_node *Node = Source.First; Node != 0; Node = Node->Next) + { + scene2_proc_node *New = PushStruct(Arena, scene2_proc_node); + New->Info.Name = PushString(Arena, Node->Info.Name); + New->Info.InstructionBegin = Node->Info.InstructionBegin; + New->Info.InstructionEnd = Node->Info.InstructionEnd; + QueuePush(Result.First, Result.Last, New); + Result.Count += 1; + } + Assert(Result.Count == Source.Count); + return(Result); +} + + +//////////////////////////////// +//~ sixten: Scene Runtime Helper Functions + +static string S2_StringFromObject(arena *Arena, scene2_object Object) +{ + string Result = StrLit("unknown"); + switch(Object.Kind) + { + case S2_ObjectKind_Nil: { Result = StrLit("nil"); } break; + case S2_ObjectKind_Bool: { Result = PushFormat(Arena, "%b", Object.As.Bool); } break; + case S2_ObjectKind_Number: + { + if(Object.As.Number == Round(Object.As.Number)) + { + Result = PushFormat(Arena, "%i", (s64)Object.As.Number); + } + else + { + Result = PushFormat(Arena, "%f", Object.As.Number); + } + } break; + case S2_ObjectKind_String: { Result = PushString(Arena, Object.As.String); } break; + } + return(Result); +} + +static void S2_StackPush(scene2_runtime *Runtime, scene2_object Object) +{ + if(Runtime->StackPointer < ArrayCount(Runtime->Stack)) + { + Runtime->Stack[Runtime->StackPointer++] = Object; + } +} + +static scene2_object S2_StackPop(scene2_runtime *Runtime) +{ + scene2_object Result = {}; + if(Runtime->StackPointer > 0) + { + Result = Runtime->Stack[--Runtime->StackPointer]; + } + return(Result); +} + +static scene2_object S2_MakeNil(void) +{ + scene2_object Result = {}; + Result.Kind = S2_ObjectKind_Nil; + return(Result); +} + +static scene2_object S2_MakeBool(b32 Bool) +{ + scene2_object Result = {}; + Result.Kind = S2_ObjectKind_Bool; + Result.As.Bool = Bool; + return(Result); +} + +static scene2_object S2_MakeNumber(r64 Number) +{ + scene2_object Result = {}; + Result.Kind = S2_ObjectKind_Number; + Result.As.Number = Number; + return(Result); +} + +static scene2_object S2_MakeString(string String) +{ + scene2_object Result = {}; + Result.Kind = S2_ObjectKind_String; + Result.As.String = String; + return(Result); +} + +static b32 S2_ObjectIsTrue(scene2_object Object) +{ + b32 Result = false; + if(Object.Kind == S2_ObjectKind_Bool) + { + Result = Object.As.Bool; + } + else if(Object.Kind == S2_ObjectKind_Number && Object.As.Number != 0) + { + Result = true; + } + else if(Object.Kind == S2_ObjectKind_String) + { + Result = true; + } + return(Result); +} + +static string S2_StringFromInstruction(compiled_scene2 *Compiled, scene2_instruction Instruction) +{ + string Result = Substring(Compiled->Source, Range1S64(Instruction.Min, Instruction.Max)); + return(Result); +} + +static scene2_variable *S2_NewVariable(scene2_runtime *Runtime) +{ + scene2_variable *Result = Runtime->FirstFreeVariable; + if(Result) + { + DLLRemove(Runtime->FirstFreeVariable, Runtime->LastFreeVariable, Result); + ZeroStruct(Result); + } + else + { + Result = PushStruct(Runtime->VariableArena, scene2_variable); + } + return(Result); +} + +static scene2_variable *S2_VariableFromString(scene2_runtime *Runtime, string Name) +{ + scene2_variable *Result = 0; + + //- sixten: check if the variable exists + for(scene2_variable *Variable = Runtime->FirstGlobalVariable; Variable != 0; Variable = Variable->Next) + { + if(AreEqual(Name, Variable->Name)) + { + Result = Variable; + break; + } + } + if(!Result) + { + Result = S2_NewVariable(Runtime); + Result->Name = PushString(Runtime->VariableArena, Name); + DLLInsertLast(Runtime->FirstGlobalVariable, Runtime->LastGlobalVariable, Result); + } + + return(Result); +} + + +//////////////////////////////// +//~ sixten: Scene Interface Functions + +static compiled_scene2 S2_CompiledFromString(arena *Arena, string String) +{ + temp Scratch = GetScratch(&Arena, 1); + + //- sixten: string -> tokens + tokenize_result TokenizeResult = T_TokenizeFromText(Scratch.Arena, String, T_IsIrregular); + + scene2_compiler Compiler = {}; + Compiler.Arena = Scratch.Arena; + Compiler.Tokens = TokenizeResult.Tokens; + Compiler.Source = String; + + //- sixten: tokens -> bytecode + S2_ParseTopLevel(&Compiler); + + compiled_scene2 Result = {}; + { + //- sixten: copy source + Result.Source = PushString(Arena, String); + + //- sixten: copy messages + Result.Messages = S2_CopyMessageList(Arena, &Compiler.Messages); + + //- sixten: copy instructions + Result.InstructionCount = Compiler.InstructionPointer; + Result.Instructions = PushArray(Arena, scene2_instruction, Result.InstructionCount); + u64 InstructionIndex = 0; + for(scene2_instruction_chunk *Chunk = Compiler.FirstChunk; Chunk != 0; Chunk = Chunk->Next) + { + Copy(Result.Instructions+InstructionIndex, Chunk->Instructions, Chunk->InstructionsUsed*sizeof(scene2_instruction)); + InstructionIndex += Chunk->InstructionsUsed; + } + + //- sixten: copy procs + Result.ProcList = S2_CopyProcList(Arena, Compiler.ProcList); + } + + ReleaseScratch(Scratch); + return(Result); +} + +static compiled_scene2 S2_CopyCompiledScene(arena *Arena, compiled_scene2 *Source) +{ + compiled_scene2 Result = {}; + Result.Source = PushString(Arena, Source->Source); + Result.Messages = S2_CopyMessageList(Arena, &Source->Messages); + Result.InstructionCount = Source->InstructionCount; + Result.Instructions = PushArray(Arena, scene2_instruction, Result.InstructionCount); + Copy(Result.Instructions, Source->Instructions, Result.InstructionCount*sizeof(scene2_instruction)); + Result.ProcList = S2_CopyProcList(Arena, Source->ProcList); + return(Result); +} + +static void S2_SetCurrentProc(scene2_runtime *Runtime, scene2_proc_info Info) +{ + Runtime->CurrentProc = Info; + Runtime->InstructionPointer = Info.InstructionBegin; +} +static scene2_proc_info S2_ProcFromName(compiled_scene2 *Compiled, string Name) +{ + scene2_proc_info Result = {}; + for(scene2_proc_node *Node = Compiled->ProcList.First; Node != 0; Node = Node->Next) + { + if(AreEqual(Node->Info.Name, Name)) + { + Result = Node->Info; + break; + } + } + return(Result); +} + +static void S2_Init(scene2_runtime *Runtime) +{ + Runtime->VariableArena = ArenaAlloc(4096, true, "Scene Runtime Variable Arena"); +} + +static scene2_run_result S2_Run(arena *Arena, scene2_runtime *Runtime, compiled_scene2 *Compiled, b32 PlayerAction) +{ + scene2_run_result Result = {}; + scene2_proc_info *ProcInfo = &Runtime->CurrentProc; + for(;ProcInfo->InstructionBegin <= Runtime->InstructionPointer && Runtime->InstructionPointer < ProcInfo->InstructionEnd && Result.Messages.Count < 100;) + { + scene2_instruction Instruction = Compiled->Instructions[Runtime->InstructionPointer]; + switch(Instruction.Opcode) + { + case S2_Op_None: + default: + { + if(S2_Op_None <= Instruction.Opcode && Instruction.Opcode < S2_Op_COUNT) + { + S2_PushMessageF(Arena, &Result.Messages, T_EmptyToken, "Unimplemented opcode: %S (%S)", S2_InstructionNameLookup[Instruction.Opcode], S2_InstructionInfoLookup[Instruction.Opcode]); + } + else + { + S2_PushMessageF(Arena, &Result.Messages, T_EmptyToken, "Unknown opcode: %i", Instruction.Opcode); + } + } break; + case S2_Op_Call: + { + // sixten: find the binding + scene2_call_function *Function = S2_CallBindingLookup[Instruction.Arg]; + if(Function == S2_Call_Stub) + { + // sixten(TODO): do we error here?? + } + Function(Runtime, Compiled); + } break; + case S2_Op_Wait: + { + if(PlayerAction) + { + // sixten: "consume" the action + PlayerAction = false; + } + else + { + goto Done; + } + } break; + case S2_Op_Pop: + { + S2_StackPop(Runtime); + } break; + case S2_Op_PushBool: + { + S2_StackPush(Runtime, S2_MakeBool(Instruction.Arg)); + } break; + case S2_Op_PushNumber: + { + S2_StackPush(Runtime, S2_MakeNumber(Instruction.Number)); + } break; + case S2_Op_PushString: + { + S2_StackPush(Runtime, S2_MakeString(S2_StringFromInstruction(Compiled, Instruction))); + } break; + case S2_Op_PushNil: + { + S2_StackPush(Runtime, S2_MakeNil()); + } break; + case S2_Op_PushVariable: + { + scene2_variable *Variable = S2_VariableFromString(Runtime, S2_StringFromInstruction(Compiled, Instruction)); + S2_StackPush(Runtime, Variable->Value); + } break; + case S2_Op_DuplicateStack: + { + temp Scratch = GetScratch(); + scene2_object *Stack = PushArrayNoClear(Scratch.Arena, scene2_object, Instruction.Arg); + for(u64 Index = 0; Index < Instruction.Arg; Index += 1) + { + Stack[Index] = S2_StackPop(Runtime); + } + for(u64 Index = 0; Index < 2*Instruction.Arg; Index += 1) + { + S2_StackPush(Runtime, Stack[Index%Instruction.Arg]); + } + ReleaseScratch(Scratch); + } break; + case S2_Op_SetVariable: + { + scene2_object NewValue = S2_StackPop(Runtime); + scene2_variable *Variable = S2_VariableFromString(Runtime, S2_StringFromInstruction(Compiled, Instruction)); + Variable->Value = NewValue; + } break; + case S2_Op_SetLocal: + { + InvalidCodepath; + } break; + case S2_Op_BeginBlock: + { + } break; + case S2_Op_EndBlock: + { + } break; + case S2_Op_Jump: + { + Runtime->InstructionPointer += Instruction.Arg; + } break; + case S2_Op_CondJump: + { + if(S2_ObjectIsTrue(S2_StackPop(Runtime))) + { + Runtime->InstructionPointer += Instruction.Arg; + } + } break; + case S2_Op_Add: + { + scene2_object Object1 = S2_StackPop(Runtime); + scene2_object Object2 = S2_StackPop(Runtime); + if(Object1.Kind == S2_ObjectKind_Number && Object2.Kind == S2_ObjectKind_Number) + { + S2_StackPush(Runtime, S2_MakeNumber(Object1.As.Number+Object2.As.Number)); + } + else + { + S2_PushMessageF(Arena, &Result.Messages, T_EmptyToken, "Trying to add two incompatible types: %S & %S. Will return nil.", S2_ObjectKindNameLookup[Object1.Kind], S2_ObjectKindNameLookup[Object2.Kind]); + S2_StackPush(Runtime, S2_MakeNil()); + } + } break; + case S2_Op_Subtract: + { + scene2_object Object1 = S2_StackPop(Runtime); + scene2_object Object2 = S2_StackPop(Runtime); + if(Object1.Kind == S2_ObjectKind_Number && Object2.Kind == S2_ObjectKind_Number) + { + S2_StackPush(Runtime, S2_MakeNumber(Object2.As.Number-Object1.As.Number)); + } + else + { + S2_PushMessageF(Arena, &Result.Messages, T_EmptyToken, "Trying to subtract two incompatible types: %S & %S. Will return nil.", S2_ObjectKindNameLookup[Object1.Kind], S2_ObjectKindNameLookup[Object2.Kind]); + S2_StackPush(Runtime, S2_MakeNil()); + } + } break; + case S2_Op_Multiply: + { + scene2_object Object1 = S2_StackPop(Runtime); + scene2_object Object2 = S2_StackPop(Runtime); + if(Object1.Kind == S2_ObjectKind_Number && Object2.Kind == S2_ObjectKind_Number) + { + S2_StackPush(Runtime, S2_MakeNumber(Object2.As.Number*Object1.As.Number)); + } + else + { + S2_PushMessageF(Arena, &Result.Messages, T_EmptyToken, "Trying to multiply two incompatible types: %S & %S. Will return nil.", S2_ObjectKindNameLookup[Object1.Kind], S2_ObjectKindNameLookup[Object2.Kind]); + S2_StackPush(Runtime, S2_MakeNil()); + } + } break; + case S2_Op_Divide: + { + scene2_object Object1 = S2_StackPop(Runtime); + scene2_object Object2 = S2_StackPop(Runtime); + if(Object1.Kind == S2_ObjectKind_Number && Object2.Kind == S2_ObjectKind_Number) + { + S2_StackPush(Runtime, S2_MakeNumber(Object2.As.Number/Object1.As.Number)); + } + else + { + S2_PushMessageF(Arena, &Result.Messages, T_EmptyToken, "Trying to divide two incompatible types: %S & %S. Will return nil.", S2_ObjectKindNameLookup[Object1.Kind], S2_ObjectKindNameLookup[Object2.Kind]); + S2_StackPush(Runtime, S2_MakeNil()); + } + } break; + case S2_Op_Equals: + { + scene2_object Object1 = S2_StackPop(Runtime); + scene2_object Object2 = S2_StackPop(Runtime); + if(Object1.Kind == S2_ObjectKind_Bool && Object2.Kind == S2_ObjectKind_Bool) + { + S2_StackPush(Runtime, S2_MakeBool(Object1.As.Bool == Object2.As.Bool)); + } + else if(Object1.Kind == S2_ObjectKind_Number && Object2.Kind == S2_ObjectKind_Number) + { + S2_StackPush(Runtime, S2_MakeBool(Object1.As.Number == Object2.As.Number)); + } + else if(Object1.Kind == S2_ObjectKind_String && Object2.Kind == S2_ObjectKind_Number) + { + S2_StackPush(Runtime, S2_MakeBool(DoubleFromString(Object1.As.String) == Object1.As.Number)); + } + else if(Object1.Kind == S2_ObjectKind_Number && Object2.Kind == S2_ObjectKind_String) + { + S2_StackPush(Runtime, S2_MakeBool(Object1.As.Number == DoubleFromString(Object2.As.String))); + } + else + { + S2_StackPush(Runtime, S2_MakeBool(false)); + } + } break; + case S2_Op_Greater: + { + scene2_object Object1 = S2_StackPop(Runtime); + scene2_object Object2 = S2_StackPop(Runtime); + if(Object1.Kind == S2_ObjectKind_Number && Object2.Kind == S2_ObjectKind_Number) + { + S2_StackPush(Runtime, S2_MakeBool(Object2.As.Number > Object1.As.Number)); + } + else + { + S2_PushMessageF(Arena, &Result.Messages, T_EmptyToken, "Trying to compare two incompatible types: %S & %S. Will return nil.", S2_ObjectKindNameLookup[Object1.Kind], S2_ObjectKindNameLookup[Object2.Kind]); + S2_StackPush(Runtime, S2_MakeBool(false)); + } + } break; + case S2_Op_Less: + { + scene2_object Object1 = S2_StackPop(Runtime); + scene2_object Object2 = S2_StackPop(Runtime); + if(Object1.Kind == S2_ObjectKind_Number && Object2.Kind == S2_ObjectKind_Number) + { + S2_StackPush(Runtime, S2_MakeBool(Object2.As.Number < Object1.As.Number)); + } + else + { + S2_PushMessageF(Arena, &Result.Messages, T_EmptyToken, "Trying to compare two incompatible types: %S & %S. Will return nil.", S2_ObjectKindNameLookup[Object1.Kind], S2_ObjectKindNameLookup[Object2.Kind]); + S2_StackPush(Runtime, S2_MakeBool(false)); + } + } break; + case S2_Op_Not: + { + scene2_object Object = S2_StackPop(Runtime); + S2_StackPush(Runtime, S2_MakeBool(!S2_ObjectIsTrue(Object))); + } break; + case S2_Op_Negate: + { + scene2_object Object = S2_StackPop(Runtime); + if(Object.Kind == S2_ObjectKind_Number) + { + S2_StackPush(Runtime, S2_MakeBool(-Object.As.Number)); + } + else + { + S2_PushMessageF(Arena, &Result.Messages, T_EmptyToken, "Trying to negate invalid type: %S. Will return nil.", S2_ObjectKindNameLookup[Object.Kind]); + S2_StackPush(Runtime, S2_MakeNil()); + } + } break; + } + Runtime->InstructionPointer += 1; + } + + Done:; + return(Result); +} \ No newline at end of file diff --git a/code/vn_scene2.h b/code/vn_scene2.h new file mode 100644 index 0000000..6b9f57e --- /dev/null +++ b/code/vn_scene2.h @@ -0,0 +1,292 @@ +/* date = December 30th 2023 8:26 pm */ + +#ifndef VN_SCENE2_H +#define VN_SCENE2_H + +struct scene2_runtime; +struct compiled_scene2; +#define S2_CALL_FUNCTION(name) void name(scene2_runtime *Runtime, compiled_scene2 *Compiled) +typedef S2_CALL_FUNCTION(scene2_call_function); +static S2_CALL_FUNCTION(S2_Call_Stub) {} + +static u64 S2_CallFunctionIndexFromString(string String); +static scene2_call_function *S2_CallFunctionFromString(string String); + +#include "generated/vn_scene2.meta.h" + +//////////////////////////////// +//~ sixten: Scene Message Types +struct scene2_message +{ + scene2_message *Next; + string Message; + token Token; +}; + +struct scene2_message_list +{ + scene2_message *First; + scene2_message *Last; + u64 Count; +}; + + +//////////////////////////////// +//~ sixten: Scene Parsing Types +enum scene2_precedence +{ + S2_Precedence_None, + S2_Precedence_Assignment, + S2_Precedence_Or, + S2_Precedence_And, + S2_Precedence_Equality, + S2_Precedence_Comparison, + S2_Precedence_Term, + S2_Precedence_Factor, + S2_Precedence_Unary, + S2_Precedence_Call, + S2_Precedence_Primary, +}; + +typedef void scene2_parse_function(struct scene2_compiler *Compiler, b32 CanAssign); + +struct scene2_parse_rule +{ + scene2_parse_function *PrefixRule; + scene2_parse_function *InfixRule; + scene2_precedence Precedence; +}; + +struct scene2_instruction +{ + scene2_opcode Opcode; + union + { + struct + { + u32 Arg1; + u32 Arg2; + }; + struct + { + u32 Min; + u32 Max; + }; + u64 Arg; + r64 Number; + }; +}; + +struct scene2_instruction_chunk +{ + scene2_instruction_chunk *Next; + u64 InstructionsUsed; + scene2_instruction Instructions[1]; +}; + +struct scene2_proc_info +{ + string Name; + u64 InstructionBegin; + u64 InstructionEnd; +}; + +struct scene2_proc_node +{ + scene2_proc_node *Next; + scene2_proc_info Info; +}; + +struct scene2_proc_list +{ + scene2_proc_node *First; + scene2_proc_node *Last; + u64 Count; +}; + +struct scene2_compiler +{ + arena *Arena; + + scene2_message_list Messages; + + b32 InPanicMode; + + scene2_instruction_chunk *FirstChunk; + scene2_instruction_chunk *LastChunk; + u64 InstructionPointer; + + scene2_proc_list ProcList; + + string Source; + token_array Tokens; + s64 At; +}; + +struct compiled_scene2 +{ + string Source; + + scene2_message_list Messages; + + u64 InstructionCount; + scene2_instruction *Instructions; + + scene2_proc_list ProcList; +}; + + +//////////////////////////////// +//~ sixten: Scene Message Functions +static void S2_PushMessage(arena *Arena, scene2_message_list *List, token Token, string Message); +static void S2_PushMessageFV(arena *Arena, scene2_message_list *List, token Token, char *Format, va_list Arguments); +static void S2_PushMessageF(arena *Arena, scene2_message_list *List, token Token, char *Format, ...); +static scene2_message_list S2_CopyMessageList(arena *Arena, scene2_message_list *Source); +static void S2_ConcatMessageList(arena *Arena, scene2_message_list *Dest, scene2_message_list *Source); + + +//////////////////////////////// +//~ sixten: Scene Action Types +enum scene2_action_kind +{ + S2_ActionKind_None = 0, +}; + +struct scene2_action +{ + scene2_action *Next; + scene2_action_kind Kind; +}; + +struct scene2_action_list +{ + scene2_action *First; + scene2_action *Last; + u64 Count; +}; + + +//////////////////////////////// +//~ sixten: Scene Action Functions +static void S2_SceneActionPush(scene2_action_list *List, scene2_action Action); + +//////////////////////////////// +//~ sixten: Scene Runtime Types +enum scene2_object_kind +{ + S2_ObjectKind_Nil, + S2_ObjectKind_Bool, + S2_ObjectKind_Number, + S2_ObjectKind_String, +}; + +global read_only string S2_ObjectKindNameLookup[] = +{ + StrComp("nil"), + StrComp("bool"), + StrComp("number"), + StrComp("string"), +}; + +struct scene2_object +{ + scene2_object_kind Kind; + union + { + b32 Bool; + r64 Number; + string String; + } As; +}; + +struct scene2_variable +{ + scene2_variable *Next; + scene2_variable *Prev; + string Name; + scene2_object Value; +}; + +struct scene2_runtime +{ + scene2_proc_info CurrentProc; + u64 InstructionPointer; + + //- siten: variables + arena *VariableArena; + scene2_variable *FirstGlobalVariable; + scene2_variable *LastGlobalVariable; + scene2_variable *FirstFreeVariable; + scene2_variable *LastFreeVariable; + + //- sixten: runtime stack + u64 StackPointer; + scene2_object Stack[128]; + + //- sixten: custom callback data + void *Data; +}; + +struct scene2_run_result +{ + scene2_message_list Messages; + scene2_action_list Actions; +}; + +//////////////////////////////// +//~ sixten: Scene Parsing Helpers +static token S2_Token(scene2_compiler *Compiler); +static token S2_Consume(scene2_compiler *Compiler, token_kind Expected, string Message); +static void S2_Advance(scene2_compiler *Compiler); +static scene2_parse_rule S2_ParseRuleFromToken(scene2_compiler *Compiler, token Token); +static scene2_instruction S2_Instruction(scene2_opcode Opcode); +static scene2_instruction S2_Instruction(scene2_opcode Opcode, u64 Arg); +static scene2_instruction S2_Instruction(scene2_opcode Opcode, r64 Number); +static scene2_instruction S2_Instruction(scene2_opcode Opcode, u32 Arg1, u32 Arg2); +static scene2_instruction S2_Instruction(scene2_opcode Opcode, range1_s64 Range); +static scene2_instruction *S2_Emit(scene2_compiler *Compiler, scene2_instruction Instruction); + +//////////////////////////////// +//~ sixten: Scene Parsing Functions +static void S2_ParseTopLevel(scene2_compiler *Compiler); +static void S2_ParseProc(scene2_compiler *Compiler); +static void S2_ParseBlock(scene2_compiler *Compiler); +static void S2_ParseStatement(scene2_compiler *Compiler); +static void S2_ParseWaitStatement(scene2_compiler *Compiler); +static void S2_ParseIfStatement(scene2_compiler *Compiler); +static void S2_ParseWhileStatement(scene2_compiler *Compiler); +static void S2_ParseLetStatement(scene2_compiler *Compiler); +static void S2_ParseShorthand(scene2_compiler *Compiler); +static void S2_ParseExpression(scene2_compiler *Compiler); +static void S2_ParsePrecedence(scene2_compiler *Compiler, scene2_precedence Precedence); +static void S2_ParseStatement(scene2_compiler *Compiler); +static void S2_ParseGrouping(scene2_compiler *Compiler, b32 CanAssign); +static void S2_ParseUnary(scene2_compiler *Compiler, b32 CanAssign); +static void S2_ParseBinary(scene2_compiler *Compiler, b32 CanAssign); +static void S2_ParseLiteral(scene2_compiler *Compiler, b32 CanAssign); +static void S2_ParseNumber(scene2_compiler *Compiler, b32 CanAssign); +static void S2_ParseString(scene2_compiler *Compiler, b32 CanAssign); +static void S2_ParseVariable(scene2_compiler *Compiler, b32 CanAssign); +static void S2_ParseCall(scene2_compiler *Compiler, b32 CanAssign); + + +//////////////////////////////// +//~ sixten: Scene Runtime Helper Functions +static string S2_StringFromObject(arena *Arena, scene2_object Object); +static void S2_StackPush(scene2_runtime *Runtime, scene2_object Object); +static scene2_object S2_StackPop(scene2_runtime *Runtime); +static scene2_object S2_MakeNil(void); +static scene2_object S2_MakeNumber(r64 Number); +static scene2_object S2_MakeString(string String); +static b32 S2_ObjectIsTrue(scene2_object Object); + + +//////////////////////////////// +//~ sixten: Scene Interface Functions +static compiled_scene2 S2_CompiledFromString(arena *Arena, string String); +static compiled_scene2 S2_CopyCompiledScene(arena *Arena, compiled_scene2 *Source); + +static void S2_SetCurrentProc(scene2_runtime *Runtime, scene2_proc_info *Info); +static scene2_proc_info S2_ProcFromName(compiled_scene2 *Compiled, string Name); + +#endif //VN_SCENE2_H diff --git a/code/vn_scene2.md b/code/vn_scene2.md new file mode 100644 index 0000000..b93e8e1 --- /dev/null +++ b/code/vn_scene2.md @@ -0,0 +1,145 @@ +@table(Op, Desc) scene2_opcode_table: +{ + { None, "does nothing (effectivly a nop)" }, + + // sixten: interfacing with user + { Call, "stages runtime hook" }, + { Wait, "executes staged actions and waits for user input" }, + + // sixten: stack manipulation + { Pop, "pops object from stack" }, + { PushBool, "pushes a boolean onto the stack" }, + { PushNumber, "pushes a number onto the stack" }, + { PushString, "pushes a string onto the stack" }, + { PushNil, "pushes `nil` onto the stack" }, + { PushVariable, "pushes a variable onto the stack" }, + { DuplicateStack, "duplicates the top N-most elements of the stack (specified in Arg as u64)" }, + + // sixten: variables + { SetVariable, "pops the stack and stores the value in a variable" }, + { SetLocal, "defines a locally scoped variable" }, + + // sixten: blocks + { BeginBlock, "increases the variable stack depth" }, + { EndBlock, "decreases the variable stack depth" }, + + // sixten: jumps + { Jump, "performs a relative jump (specified in Arg as s64)" }, + { CondJump, "performs a relative jump (specified in Arg as s64) if the topmost element on the stack is non-zero" }, + + // sixten: operations + { Add, "adds the two topmost elements of the stack" }, + { Subtract, "subtracts the topmost element of the stack by the second topmost element" }, + { Multiply, "multiplies the two topmost elements of the stack" }, + { Divide, "divides the topmost element of the stack by the second topmost element" }, + { Equals, "" }, + { Greater, "" }, + { Less, "" }, + { Not, "performs a not operation on the topmost element of the stack" }, + { Negate, "negates the topmost element of the stack" }, +} + +@table(Name, Operator) scene2_operator_table: +{ + { Invalid, "###" } + { Not, "!" } + { Equal, "=" } + { Equals, "==" } + { NotEquals, "!=" } + { GreaterThanOrEquals, ">=" } + { LessThanOrEquals, "<=" } + { Greater, ">" } + { Less, "<" } + { Add, "+" } + { Minus, "-" } + { Multiply "*" } + { Divide, "/" } +} + +@table(Name, Binding, Desc) scene2_call_table: +{ + { none, S2_Call_Stub, "does nothing" }, + + // sixten: debugging + { stack_sanity, S2_Call_StackSanity, "does checks that the stack is at a certain depth" }, + + // sixten: textbox management calls + { text_append, S2_Call_TextAppend, "pops a value and appends it to the textbox" }, + { text_newline, S2_Call_NewLine, "appends a newline to the textbox" }, + { text_clear, S2_Call_TextClear, "clears the textbox" }, + + // sixten: proc management calls + { proc_set, S2_Call_ProcSet, "sets the current proc" }, + + // sixten: character management calls + { ctr_set, S2_Call_CharacterSet, "sets the state of a character" }, + { ctr_remove, S2_Call_CharacterRemove, "removes a character" }, + { ctr_set_talking, S2_Call_CharacterSetTalking, "makes a character talking" }, + { ctr_unset_all_talking, S2_Call_CharacterUnsetAllTalking, "makes no characters talking" }, + +} + +@table_gen +{ + `enum scene2_opcode`; + `{`; + @expand(scene2_opcode_table s) `S2_Op_$(s.Op), $(=>50) // $(s.Desc)`; + `S2_Op_COUNT,` + `};`; +} + +@table_gen +{ + `global read_only string S2_InstructionInfoLookup[] =`; + `{`; + @expand(scene2_opcode_table s) `StrComp("$(s.Op)"),`; + `};`; +} + +@table_gen +{ + `global read_only string S2_InstructionNameLookup[] =`; + `{`; + @expand(scene2_opcode_table s) `StrComp("$(s.Desc)"),`; + `};`; +} + +@table_gen +{ + `enum scene2_operator`; + `{`; + @expand(scene2_operator_table s) `S2_Operator_$(s.Name),`; + `};`; +} + +@table_gen +{ + `inline scene2_operator S2_OperatorFromString(string String)`; + `{`; + `scene2_operator Result = S2_Operator_Invalid;`; + `if(0) {}`; + @expand(scene2_operator_table s) `else if(AreEqual(String, StrLit("$(s.Operator)")))$(=>40) { Result = S2_Operator_$(s.Name); }`; + `return(Result);`; + `}`; +} + +@table_gen +{ + @expand(scene2_call_table s) `static S2_CALL_FUNCTION($(s.Binding)); $(=>50) // $(s.Desc)`; +} + +@table_gen +{ + `global read_only scene2_call_function *S2_CallBindingLookup[] =`; + `{`; + @expand(scene2_call_table s) `$(s.Binding), `; + `};`; +} + +@table_gen +{ + `global read_only string S2_CallNameLookup[] =`; + `{`; + @expand(scene2_call_table s) `StrComp("$(s.Name)"), `; + `};`; +} \ No newline at end of file diff --git a/code/vn_scene_commands.cpp b/code/vn_scene_commands.cpp new file mode 100644 index 0000000..ec2973a --- /dev/null +++ b/code/vn_scene_commands.cpp @@ -0,0 +1,202 @@ +static u64 S2_CallFunctionIndexFromString(string String) +{ + u64 Result = 0; + for(u64 Index = 0; Index < ArrayCount(S2_CallNameLookup); Index += 1) + { + if(AreEqual(String, S2_CallNameLookup[Index])) + { + Result = Index; + break; + } + } + return(Result); +} + +static scene2_call_function *S2_CallFunctionFromString(string String) +{ + scene2_call_function *Result = S2_Call_Stub; + for(u64 Index = 0; Index < ArrayCount(S2_CallNameLookup); Index += 1) + { + if(AreEqual(String, S2_CallNameLookup[Index])) + { + Result = S2_CallBindingLookup[Index]; + break; + } + } + return(Result); +} + +static S2_CALL_FUNCTION(S2_Call_StackSanity) +{ + scene2_object Value = S2_StackPop(Runtime); + Assert(Value.Kind == S2_ObjectKind_Number && Runtime->StackPointer == (u64)Value.As.Number); +} + +static S2_CALL_FUNCTION(S2_Call_TextClear) +{ + scene_view *SceneView = (scene_view *)Runtime->Data; + SceneView->TextboxUsed = 0; + SceneView->TextboxRevealed = 0; +} + +static S2_CALL_FUNCTION(S2_Call_NewLine) +{ + scene_view *SceneView = (scene_view *)Runtime->Data; + if(SceneView->TextboxUsed < ArrayCount(SceneView->TextboxData)) + { + SceneView->TextboxData[SceneView->TextboxUsed++] = '\n'; + } +} + +static S2_CALL_FUNCTION(S2_Call_TextAppend) +{ + scene_view *SceneView = (scene_view *)Runtime->Data; + + temp Scratch = GetScratch(); + string Addend = S2_StringFromObject(Scratch.Arena, S2_StackPop(Runtime)); + + Addend.Count = Min(Addend.Count, ArrayCount(SceneView->TextboxData)-SceneView->TextboxUsed); + + Copy(SceneView->TextboxData+SceneView->TextboxUsed, Addend.Data, Addend.Count); + SceneView->TextboxUsed += Addend.Count; + + ReleaseScratch(Scratch); +} + +static S2_CALL_FUNCTION(S2_Call_ProcSet) +{ + temp Scratch = GetScratch(); + S2_SetCurrentProc(Runtime, S2_ProcFromName(Compiled, S2_StringFromObject(Scratch.Arena, S2_StackPop(Runtime)))); + ReleaseScratch(Scratch); +} + +static S2_CALL_FUNCTION(S2_Call_CharacterSet) +{ + scene_view *SceneView = (scene_view *)Runtime->Data; + + scene2_object IDObject = S2_StackPop(Runtime); + scene2_object TargetObject = S2_StackPop(Runtime); + + // sixten(TODO): this should fail gracefully + Assert(IDObject.Kind == S2_ObjectKind_Number || IDObject.Kind == S2_ObjectKind_Nil); + Assert(TargetObject.Kind == S2_ObjectKind_String); + + string Target = TargetObject.As.String; + asset_id ID = IDObject.Kind == S2_ObjectKind_Number ? (asset_id)IDObject.As.Number : AssetID_None; + + scene_view_character_data *CharacterBegin = SceneView->Characters; + scene_view_character_data *CharacterUsedEnd = SceneView->Characters+SceneView->CharactersUsed; + scene_view_character_data *CharacterEnd = SceneView->Characters+ArrayCount(SceneView->Characters); + scene_view_character_data *Character = CharacterBegin; + + for(;Character < CharacterEnd; Character += 1) + { + // sixten: check if the character doesn't exist + if(Character == CharacterUsedEnd) + { + // sixten: "create" new character + ZeroStruct(Character); + Character->Name = PushString(SceneView->SceneArena, Target); + SceneView->CharactersUsed += 1; + Character->PctP = ((r32)SceneView->CharactersUsed / (r32)(SceneView->CharactersUsed+1)); + break; + } + + // sixten: check if character exists + if(AreEqual(Character->Name, Target)) + { + break; + } + } + + if(Character != CharacterEnd) + { + Character->Active = true; + if(ID != AssetID_None) + { + Character->Info.Texture = A_TextureFromAssetID(ID); + Character->Info.Scale = A_ScaleFromAssetID(ID); + } + } + else + { + // sixten: we've run out of characters + } +} + +static S2_CALL_FUNCTION(S2_Call_CharacterRemove) +{ + scene_view *SceneView = (scene_view *)Runtime->Data; + + scene2_object TargetObject = S2_StackPop(Runtime); + + // sixten(TODO): this should fail gracefully + Assert(TargetObject.Kind == S2_ObjectKind_String); + + string Target = TargetObject.As.String; + + scene_view_character_data *CharacterBegin = SceneView->Characters; + scene_view_character_data *CharacterEnd = SceneView->Characters+SceneView->CharactersUsed; + scene_view_character_data *Character = CharacterBegin; + + // sixten: check if the character exists + for(;Character < CharacterEnd; Character += 1) + { + if(AreEqual(Character->Name, Target)) + { + break; + } + } + + // sixten: if the character exists, request its deletion + if(Character != CharacterEnd) + { + Character->Active = false; + Character->Talking = false; + } +} + +static S2_CALL_FUNCTION(S2_Call_CharacterSetTalking) +{ + scene_view *SceneView = (scene_view *)Runtime->Data; + + scene2_object TargetObject = S2_StackPop(Runtime); + + // sixten(TODO): this should fail gracefully + Assert(TargetObject.Kind == S2_ObjectKind_String); + + string Target = TargetObject.As.String; + + scene_view_character_data *CharacterBegin = SceneView->Characters; + scene_view_character_data *CharacterEnd = SceneView->Characters+SceneView->CharactersUsed; + scene_view_character_data *Character = CharacterBegin; + + // sixten: check if the character exists + for(;Character < CharacterEnd; Character += 1) + { + if(AreEqual(Character->Name, Target)) + { + break; + } + } + + // sixten: if the character exists, request its deletion + if(Character != CharacterEnd) + { + Character->Talking = true; + } +} + +static S2_CALL_FUNCTION(S2_Call_CharacterUnsetAllTalking) +{ + scene_view *SceneView = (scene_view *)Runtime->Data; + + scene_view_character_data *CharacterBegin = SceneView->Characters; + scene_view_character_data *CharacterEnd = SceneView->Characters+SceneView->CharactersUsed; + scene_view_character_data *Character = CharacterBegin; + + for(;Character < CharacterEnd; Character += 1) + { + Character->Talking = false; + } +} diff --git a/code/vn_scene_view.cpp b/code/vn_scene_view.cpp index 87a28dc..bda246b 100644 --- a/code/vn_scene_view.cpp +++ b/code/vn_scene_view.cpp @@ -1,3 +1,5 @@ +#include "vn_scene_commands.cpp" + per_thread scene_view *ThreadLocal_SceneView = 0; static void SV_SetState(scene_view *View) @@ -21,18 +23,13 @@ static void SV_Reset(void) { scene_view *SceneView = SV_GetState(); - ArenaClear(SceneView->Runtime.ErrorArena); - S_ResetRuntime(&SceneView->Runtime); - - // sixten: reset textbox - SceneView->Textbox.String.Count = 0; - // sixten: reset onscreen characters - SceneView->CharacterCount = 0; + SceneView->CharactersUsed = 0; } static void SV_LoadNavItems(void) { +#if 0 scene_view *SceneView = SV_GetState(); temp Scratch = GetScratch(); string NavData = Platform_ReadEntireFile(Scratch.Arena, SceneView->Runtime.Compiled.NavFileName); @@ -117,60 +114,45 @@ static void SV_LoadNavItems(void) } } ReleaseScratch(Scratch); +#endif } -static void SV_SetCurrentSource(compiled_scene *Compiled) +static void SV_SetCurrentSource(compiled_scene2 *Compiled) { scene_view *SceneView = SV_GetState(); - scene_runtime *Runtime = &SceneView->Runtime; + scene2_runtime *Runtime = &SceneView->Runtime; // sixten(TODO): extract runtime information required to seamlessly transition between compilations SV_Reset(); - ArenaClear(SceneView->SceneArena); - Runtime->Compiled = S_CopyCompiledScene(SceneView->SceneArena, Compiled); + ArenaClear(SceneView->SceneArena); + + SceneView->Compiled = S2_CopyCompiledScene(SceneView->SceneArena, Compiled); SV_LoadNavItems(); - - //- sixten: run top level - Runtime->CurrentProc = Runtime->Compiled.GlobalScope; - if(Runtime->CurrentProc) - { - temp Scratch = GetScratch(0, 0); - for(;;) - { - scene_runtime_result RunResult = S_Run(Runtime, Scratch.Arena, false); - if(RunResult.ReachedAwait || RunResult.HadError) - { - break; - } - } - ReleaseScratch(Scratch); - } - //- sixten: find main proc - Runtime->CurrentProc = S_FindProcByName(&Runtime->Compiled, StrLit("main")); - Runtime->IP = 0; + S2_SetCurrentProc(Runtime, S2_ProcFromName(Compiled, StrLit("main"))); } -static void SV_Init(scene_view *SceneView, arena *TextboxArena) +static void SV_Init(scene_view *SceneView) { SV_SetState(SceneView); - SceneView->SceneArena = ArenaAlloc(Kilobytes(16), true); - SceneView->Runtime.ErrorArena = ArenaAlloc(Kilobytes(4), true); - - SceneView->Textbox.Capacity = 4096; - SceneView->Textbox.String.Data = PushArray(TextboxArena, u8, SceneView->Textbox.Capacity); - - SV_Reset(); + SceneView->SceneArena = ArenaAlloc(Kilobytes(16), true, "Scene View Scene Arena"); + SceneView->MessageArena = ArenaAlloc(Kilobytes(16), true, "Scene View Message Arena"); + + S2_Init(&SceneView->Runtime); + + SceneView->Runtime.Data = SceneView; + + SV_Reset(); } static b32 SV_CurrentlyInProc(void) { scene_view *SceneView = SV_GetState(); - b32 Result = (SceneView->Runtime.CurrentProc != 0); + b32 Result = (SceneView->Runtime.CurrentProc.Name.Count != 0); return(Result); } @@ -178,7 +160,7 @@ static scene_view_character_data *SV_FindTalkingCharacter(void) { scene_view *SceneView = SV_GetState(); scene_view_character_data *Result = 0; - for(s32 CharacterIndex = 0; CharacterIndex < SceneView->CharacterCount; CharacterIndex += 1) + for(s32 CharacterIndex = 0; CharacterIndex < SceneView->CharactersUsed; CharacterIndex += 1) { scene_view_character_data *Character = SceneView->Characters+CharacterIndex; if(Character->Talking) @@ -190,23 +172,6 @@ static scene_view_character_data *SV_FindTalkingCharacter(void) return(Result); } -static string SV_DisplayNameFromCharacter(scene_view_character_data *Character) -{ - scene_view *SceneView = SV_GetState(); - string Result = StrLit("invalid character"); - if(Character) - { - Result = StrLit("undefined name"); - - scene_named_value *CharacterNameValue = S_FindGlobalVariableByName(&SceneView->Runtime, Character->Name, false); - if(CharacterNameValue && CharacterNameValue->Value.Kind == S_ValueKind_String) - { - Result = CharacterNameValue->Value.String; - } - } - return(Result); -} - struct text_properties { font_id Font; @@ -287,15 +252,17 @@ static r32 CalculateGlobalScaleFromDim(v2_r32 Dim) } static r32 CalculateGlobalScaleFromRootBox(ui_box *Box) { - v2 RenderDim = UI_CalculateBoxDim(Box); + v2_r32 RenderDim = UI_CalculateBoxDim(Box); r32 GlobalScale = SquareRoot(RenderDim.x*RenderDim.y)/45; return(GlobalScale); } struct scene_textbox_data { - textbox *Textbox; - ui_box *SceneViewBox; + char *TextboxData; + u64 TextboxUsed; + r32 TextboxRevealed; + ui_box *SceneViewBox; string Name; r32 NameT; }; @@ -303,37 +270,36 @@ struct scene_textbox_data UI_CUSTOM_DRAW_CALLBACK(BuildSceneTextboxDrawCallback) { scene_textbox_data *TextboxData = (scene_textbox_data *)Data; - textbox *Textbox = TextboxData->Textbox; r32 GlobalScale = CalculateGlobalScaleFromRootBox(TextboxData->SceneViewBox); //- sixten: render textbox { - v4 TopColor = V4(0, 0, 0, 0.8f); - v4 BottomColor = V4(0, 0, 0, 0.5f); - range2_r32 Dest = Pad(Range2R32(Box->Rect.Min, Box->Rect.Max), V2(GlobalScale, GlobalScale)*2.0f); + v4_r32 TopColor = V4R32(0, 0, 0, 0.8f); + v4_r32 BottomColor = V4R32(0, 0, 0, 0.5f); + range2_r32 Dest = Pad(Range2R32(Box->Rect.Min, Box->Rect.Max), V2R32(GlobalScale, GlobalScale)*2.0f); PushQuad(Group, Dest, TopColor, TopColor, BottomColor, BottomColor, 0, GlobalScale, 0); } //- sixten: render text { - string Text = Textbox->String; - r32 CharsRevealedT = Textbox->CharsRevealedT; + string Text = MakeString((u8 *)TextboxData->TextboxData, TextboxData->TextboxUsed); + r32 RevealedT = TextboxData->TextboxRevealed; text_properties Properties = {}; Properties.Font = Font_Fancy; Properties.FontSize = GlobalScale; Properties.LineHeight = GlobalScale*1.5f; r32 Padding = 1.5f*GlobalScale; - v2 Offset = V2R32(Padding, Padding); - RenderAnimatedText(Group, Atlas, Properties, Text, CharsRevealedT, Box->Rect.Min+Offset, DimOfRange(Box->Rect).x-2*Padding); + v2_r32 Offset = V2R32(Padding, Padding); + RenderAnimatedText(Group, Atlas, Properties, Text, RevealedT, Box->Rect.Min+Offset, DimOfRange(Box->Rect).x-2*Padding); } //- sixten: render character name { string Name = TextboxData->Name; r32 T = TextboxData->NameT; - v2 TextP = Box->Rect.Min + V2(1.5f*GlobalScale, -GlobalScale*T); - PushText(Group, Atlas, Font_Fancy, TextP+V2(GlobalScale*0.1, GlobalScale*0.1), GlobalScale, SetAlpha(Color_Black, T), Name); + v2_r32 TextP = Box->Rect.Min + V2R32(1.5f*GlobalScale, -GlobalScale*T); + PushText(Group, Atlas, Font_Fancy, TextP+V2R32(GlobalScale*0.1, GlobalScale*0.1), GlobalScale, SetAlpha(Color_Black, T), Name); PushText(Group, Atlas, Font_Fancy, TextP, GlobalScale, SetAlpha(Color_White, T), Name); } @@ -341,25 +307,24 @@ UI_CUSTOM_DRAW_CALLBACK(BuildSceneTextboxDrawCallback) static void SV_DrawBackground(scene_view *SceneView, ui_box *Box, render_group *Group) { - v2 RenderDim = DimOfRange(Box->Rect); + v2_r32 RenderDim = DimOfRange(Box->Rect); - render_handle Texture = TextureFromAssetID(SceneView->Runtime.Compiled.BackgroundTexture); + render_handle Texture = A_TextureFromAssetID(AssetID_DemoBackground);;//A_TextureFromAssetID(SceneView->Runtime.Compiled.BackgroundTexture); //- sixten: render background #if 0 persist r32 Time = 0; Time += 1 / 1200.0f; r32 r = 30; - v2_r32 Offset = V2(Sin(Time)+0.5*Sin(43+2.43*Time)+Sin(424+Time*16)*0.1, Sin(8+Time)+0.5*Sin(43+2.43*Time)+Sin(4242+Time*16)*0.1)*(1.0f/1.6f)*r; - range2_r32 BackgroundDest = Range2R32(Box->Rect.Min-V2(r, r)+Offset, RenderDim+Box->Rect.Min+V2(r, r)+Offset); - range2_r32 BackgroundSource = Range2R32(V2R32(0, 0), ConvertV2ToR32(DimFromTexture(SceneView->BackgroundTexture))); + v2_r32 Offset = V2R32(Sin(Time)+0.5*Sin(43+2.43*Time)+Sin(424+Time*16)*0.1, Sin(8+Time)+0.5*Sin(43+2.43*Time)+Sin(4242+Time*16)*0.1)*(1.0f/1.6f)*r; + range2_r32 BackgroundDest = Range2R32(Box->Rect.Min-V2R32(r, r)+Offset, RenderDim+Box->Rect.Min+V2R32(r, r)+Offset); + range2_r32 BackgroundSource = Range2R32(V2R32(0, 0), ConvertV2ToR32(DimFromTexture(Texture))); PushTexturedQuad(Group, BackgroundDest, BackgroundSource, Color_White, Color_White, Color_White, Color_White, 0, 0, 0, Texture); #else range2_r32 BackgroundDest = Range2R32(Box->Rect.Min, RenderDim+Box->Rect.Min); - range2_r32 BackgroundSource = Range2R32(V2R32(0, 0), ConvertV2ToR32(DimFromTexture(SceneView->BackgroundTexture))); - PushTexturedQuad(Group, BackgroundDest, BackgroundSource, Color_White, Color_White, Color_White, Color_White, 0, 0, 0, Texture); + range2_r32 BackgroundSource = Range2R32(V2R32(0, 0), ConvertV2ToR32(DimFromTexture(Texture))); + PushTexturedQuad(Group, BackgroundDest, BackgroundSource, Color_White, Color_White, Color_White, Color_White, 0, 0, 0, 0, 0, 0, Texture); #endif - } UI_CUSTOM_DRAW_CALLBACK(BuildSceneDrawCallback) @@ -367,11 +332,11 @@ UI_CUSTOM_DRAW_CALLBACK(BuildSceneDrawCallback) scene_view *SceneView = (scene_view *)Data; SV_DrawBackground(SceneView, Box, Group); - v2 RenderDim = DimOfRange(Box->Rect); + v2_r32 RenderDim = DimOfRange(Box->Rect); r32 GlobalScale = CalculateGlobalScaleFromDim(RenderDim); //- sixten: render characters - for(s32 CharacterIndex = 0; CharacterIndex < SceneView->CharacterCount; CharacterIndex += 1) + for(s32 CharacterIndex = 0; CharacterIndex < SceneView->CharactersUsed; CharacterIndex += 1) { scene_view_character_data *Character = SceneView->Characters + CharacterIndex; @@ -384,7 +349,7 @@ UI_CUSTOM_DRAW_CALLBACK(BuildSceneDrawCallback) v2_r32 CharacterMidP = Box->Rect.Min+V2R32(CharacterOriginP.x, CharacterOriginP.y - CharacterDim.y*Scale/2); range2_r32 CharacterDest = Range2R32(CharacterMidP-CharacterDim*0.5f*Scale, CharacterMidP+CharacterDim*0.5f*Scale); range2_r32 CharacterSource = Range2R32(V2R32(0, 0), CharacterDim); - PushTexturedQuad(Group, CharacterDest, CharacterSource, BlendColor, BlendColor, BlendColor, BlendColor, 0, 0, 0, CharacterHandle); + PushTexturedQuad(Group, CharacterDest, CharacterSource, BlendColor, BlendColor, BlendColor, BlendColor, 0, 0, 0, 0, 0, 0, CharacterHandle); } } @@ -405,12 +370,13 @@ static void BuildProcView(scene_view *View, ui_box *Box, v2_r32 BoxDim) r32 GlobalScale = CalculateGlobalScaleFromDim(BoxDim); r32 ActiveScale = GlobalScale * 0.75f; - scene_runtime *Runtime = &View->Runtime; - textbox *Textbox = &View->Textbox; + //scene2_runtime *Runtime = &View->Runtime; + //textbox *Textbox = &View->Textbox; //- sixten: build branches UI_FillPadding UI_WidthFill UI_Height(UI_Pixels(2*ActiveScale, 1)) UI_Row() UI_FillPadding UI_Column() UI_FillPadding { +#if 0 b32 FoundOffset = false; s64 Offset = 0; for(s32 BranchIndex = 0; BranchIndex < Runtime->BranchCount; BranchIndex += 1) @@ -432,6 +398,7 @@ static void BuildProcView(scene_view *View, ui_box *Box, v2_r32 BoxDim) Runtime->IP += 1+Offset; Runtime->BranchCount = 0; } +#endif } //- sixten: build textbox @@ -440,11 +407,13 @@ static void BuildProcView(scene_view *View, ui_box *Box, v2_r32 BoxDim) ui_box *TextBox = UI_MakeBox(0, StrLit("Scene Textbox")); scene_textbox_data *TextboxData = PushStruct(UI_FrameArena(), scene_textbox_data); - TextboxData->Textbox = Textbox; + TextboxData->TextboxData = View->TextboxData; + TextboxData->TextboxUsed = View->TextboxUsed; + TextboxData->TextboxRevealed = View->TextboxRevealed; TextboxData->SceneViewBox = Box; scene_view_character_data *TalkingCharacter = SV_FindTalkingCharacter(); - TextboxData->Name = SV_DisplayNameFromCharacter(TalkingCharacter); + TextboxData->Name = TalkingCharacter ? TalkingCharacter->Name : StrLit(""); TextboxData->NameT = AC_AnimateValueF(TalkingCharacter != 0, 0, 0.3f, "Scene View Talking Character %p", View); UI_EquipBoxCustomDrawCallback(TextBox, BuildSceneTextboxDrawCallback, TextboxData); @@ -462,7 +431,7 @@ struct scene_nav_item_info UI_CUSTOM_DRAW_CALLBACK(BuildNavItemDrawCallback) { scene_nav_item_info *Info = (scene_nav_item_info *)Data; - render_handle Texture = TextureFromAssetID(Info->Item->TextureID); + render_handle Texture = A_TextureFromAssetID(Info->Item->TextureID); v2_r32 TextureDim = ConvertV2ToR32(DimFromTexture(Texture)); range2_r32 DestRect = Range2R32(Box->Rect.Min, Box->Rect.Max); @@ -470,7 +439,7 @@ UI_CUSTOM_DRAW_CALLBACK(BuildNavItemDrawCallback) v4_r32 Color = LinearBlend(Color_Grey, Color_White, Info->Signal.Hovering); - PushTexturedQuad(Group, DestRect, SourceRect, Color, Color, Color, Color, 0, 0, 0, Texture); + PushTexturedQuad(Group, DestRect, SourceRect, Color, Color, Color, Color, 0, 0, 0, 0, 0, 0, Texture); } inline u32 U32FromRawR32(r32 Value) @@ -486,7 +455,7 @@ static ui_signal SV_BuildNavItem(scene_nav_item *Item, r32 GlobalScale, v2_r32 G scene_nav_item_info *Data = PushStruct(UI_FrameArena(), scene_nav_item_info); Data->Item = Item; - render_handle Texture = TextureFromAssetID(Item->TextureID); + render_handle Texture = A_TextureFromAssetID(Item->TextureID); v2_r32 TextureDim = ConvertV2ToR32(DimFromTexture(Texture)); v2_r32 TextureOrigin = Hadamard(TextureDim, Item->Origin); @@ -528,7 +497,7 @@ static ui_signal BuildNavItemAndLabel(scene_nav_item *Item, r32 GlobalScale, v2_ static void BuildNavView(scene_view *View, ui_box *Box, v2_r32 BoxDim) { r32 GlobalScale = CalculateGlobalScaleFromDim(BoxDim); - + for(int ItemIndex = 0; ItemIndex < View->NavItemCount; ++ItemIndex) { scene_nav_item *Item = View->NavItems+ItemIndex; @@ -537,7 +506,7 @@ static void BuildNavView(scene_view *View, ui_box *Box, v2_r32 BoxDim) // sixten: apply the action if(Item->Action.Kind == S_NavAction_Proc) { - S_SetCurrentProc(&View->Runtime, S_FindProcByName(&View->Runtime.Compiled, Item->Action.Content)); + S2_SetCurrentProc(&View->Runtime, S2_ProcFromName(&View->Compiled, Item->Action.Content)); } else if(Item->Action.Kind == S_NavAction_Scene) { @@ -545,7 +514,7 @@ static void BuildNavView(scene_view *View, ui_box *Box, v2_r32 BoxDim) string Filepath = PushFormat(Scratch.Arena, "data/%S.vns", Item->Action.Content);; string SceneInput = Platform_ReadEntireFile(Scratch.Arena, Filepath); - compiled_scene Scene = S_ScriptFromText(Scratch.Arena, SceneInput); + compiled_scene2 Scene = S2_CompiledFromString(Scratch.Arena, SceneInput); SV_SetCurrentSource(&Scene); ReleaseScratch(Scratch); @@ -592,7 +561,7 @@ static void BuildScene(scene_view *View) } } -static void BuildErrorScreen(scene_runtime *Runtime, vn_input *Input) +static void BuildErrorScreen(scene_view *SceneView, vn_input *Input) { UI_SetNextLayoutAxis(Axis2_X); UI_Parent(UI_MakeBox(UI_BoxFlag_DrawBackground, StrLit("Container"))) @@ -601,14 +570,14 @@ static void BuildErrorScreen(scene_runtime *Runtime, vn_input *Input) { UI_Font(Font_Bold) UI_Size(UI_TextContent(0, 1), UI_TextContent(0, 1)) UI_FontSize(32) UI_LabelF("A runtime error has occurred"); s64 ErrorIndex = 0; - for(scene_runtime_error *Error = Runtime->Errors.First; Error != 0; Error = Error->Next, ErrorIndex += 1) + for(scene2_message *Message = SceneView->Messages.First; Message != 0; Message = Message->Next, ErrorIndex += 1) { UI_Spacer(UI_Em(3, 1)); UI_SetNextCornerRadius(3); UI_Size(UI_Percent(1, 1), UI_Percent(1, 0)) UI_Parent(UI_MakeBoxF(UI_BoxFlag_DrawDropShadow|UI_BoxFlag_DrawBorder, "%i", ErrorIndex)) UI_Size(UI_TextContent(30, 1), UI_TextContent(30, 1)) { - UI_LabelF("Message: %S", Error->Message); + UI_Label(Message->Message); } } UI_Spacer(UI_Em(3, 1)); @@ -622,8 +591,8 @@ static void BuildErrorScreen(scene_runtime *Runtime, vn_input *Input) } if(IgnoreSignal.Clicked) { - ZeroStruct(&Runtime->Errors); - ArenaClear(Runtime->ErrorArena); + ZeroStruct(&SceneView->Messages); + ArenaClear(SceneView->MessageArena); } UI_Spacer(UI_Em(1, 1)); @@ -654,7 +623,7 @@ static scene_view_character_data *SV_CharacterDataFromName(string Name) scene_view *View = SV_GetState(); - for(s32 CharacterIndex = 0; CharacterIndex < View->CharacterCount; CharacterIndex += 1) + for(s32 CharacterIndex = 0; CharacterIndex < View->CharactersUsed; CharacterIndex += 1) { scene_view_character_data *Character = View->Characters + CharacterIndex; if(AreEqual(Character->Name, Name)) @@ -665,32 +634,38 @@ static scene_view_character_data *SV_CharacterDataFromName(string Name) } //- sixten: create character if not initialized - if(!Result && View->CharacterCount < ArrayCount(View->Characters)) + if(!Result && View->CharactersUsed < ArrayCount(View->Characters)) { - s32 CharacterIndex = View->CharacterCount; - View->CharacterCount += 1; + s32 CharacterIndex = View->CharactersUsed; + View->CharactersUsed += 1; Result = View->Characters + CharacterIndex; *Result = {}; Result->Name = Name; Result->Active = true; - Result->PctP = (r32)(CharacterIndex + 1) / (View->CharacterCount + 1); + Result->PctP = (r32)(CharacterIndex + 1) / (View->CharactersUsed + 1); } return(Result); } +#if 0 static scene_view_character_texture_info SV_CharacterTextureFromAction(scene_character_action *Action) { scene_view_character_texture_info Result = {}; Result.Texture = EmptyRenderHandle(); Result.Scale = 1.0f; - scene_view *View = SV_GetState(); - - if(AreEqual(StrLit("arthur"), Action->Target)) + asset_id AssetID = Action->State; + Result.Texture = A_TextureFromAssetID(AssetID); + Result.Scale = A_ScaleFromAssetID(AssetID); + +#if 0 + if(AreEqual(StrLit("arthur"), Action->Target)) { - switch(Action->State) + + + switch(Action->State) { case CR_State_Normal: { Result.Texture = View->TestNormal; } break; case CR_State_Happy: { Result.Texture = View->TestHappy; } break; @@ -708,15 +683,17 @@ static scene_view_character_texture_info SV_CharacterTextureFromAction(scene_cha } Result.Scale = 0.033f; } +#endif return(Result); } +#endif static r32 SV_CalculateTargetPctP(s32 TrueCharacterIndex) { scene_view *View = SV_GetState(); s32 CharacterCount = 0; s32 AssumedCharacterIndex = 0; - for(s32 CharacterIndex = 0; CharacterIndex < View->CharacterCount; CharacterIndex += 1) + for(s32 CharacterIndex = 0; CharacterIndex < View->CharactersUsed; CharacterIndex += 1) { scene_view_character_data *Data = View->Characters + CharacterIndex; if(Data->Active) @@ -734,122 +711,161 @@ static r32 SV_CalculateTargetPctP(s32 TrueCharacterIndex) static void SV_UpdateInDialog(arena *FrameArena) { - scene_view *SceneView = SV_GetState(); - textbox *Textbox = &SceneView->Textbox; - scene_runtime *Runtime = &SceneView->Runtime; - platform_event_list *EventList = SceneView->EventList; - r32 dtForFrame = SceneView->dtForFrame; - compiled_scene *Compiled = &Runtime->Compiled; - - if(Compiled && Compiled->IsValid) - { - //- sixten: gather user input - b32 MousePressed = false; - for(platform_event *Event = EventList->First; Event != 0; Event = Event->Next) - { - if(Event->Type == PlatformEvent_Press && Event->Key == Key_MouseLeft) - { - MousePressed = true; - } - } - - b32 PlayerAction = (Platform_KeyPress(EventList, Key_Space)||MousePressed); - - //- sixten: run the scene - if(!Runtime->LastResult.HadError) - { - b32 AdvanceOnAwait = (Textbox->CharsRevealed >= Textbox->String.Count) && PlayerAction; - - for(;;) - { - scene_runtime_result RunResult = S_Run(Runtime, FrameArena, AdvanceOnAwait); - if(RunResult.ReachedAwait || RunResult.HadError) - { - break; - } - } - } - - //- sixten: advance textbox - { - r32 CharsPerSecond = 25.0f; - Textbox->CharsRevealed += dtForFrame*CharsPerSecond; - Textbox->CharsRevealed = Min(Textbox->CharsRevealed, (r32)Textbox->String.Count); - - if(Textbox->CharsRevealed < Textbox->String.Count && PlayerAction) - { - Textbox->CharsRevealed = Textbox->String.Count; - } - - AC_AnimateValueDirect(Textbox->CharsRevealed, 0.05f, &Textbox->CharsRevealedT); - } - - //- sixten: apply the textbox actions - for(scene_textbox_action *Action = Runtime->FirstTextboxAction; Action != 0; Action = Action->Next) - { - if(Action->Kind == S_TextboxActionKind_Set) - { - string ReplaceString = Action->String; - Textbox->String.Count = Min(ReplaceString.Count, Textbox->Capacity); - Copy(Textbox->String.Data, ReplaceString.Data, Textbox->String.Count); - Textbox->CharsRevealedT = 0; - Textbox->CharsRevealed = 0; - } - else if(Action->Kind == S_TextboxActionKind_Append) - { - string Addend = Action->String; - Textbox->CharsRevealedT = Textbox->String.Count; - s64 NewCount = Min(Textbox->String.Count+Addend.Count, Textbox->Capacity-1); - Copy(Textbox->String.Data+Textbox->String.Count, Action->String.Data, NewCount-Textbox->String.Count); - Textbox->String.Count = NewCount; - } - else - { - InvalidCodepath; - } - } - Runtime->FirstTextboxAction = Runtime->LastTextboxAction = 0; - - // sixten: update character state only if there has been a change - if(Runtime->FirstCharacterAction != 0) - { - //- sixten: make all characters non-talking - for(s32 CharacterIndex = 0; CharacterIndex < SceneView->CharacterCount; CharacterIndex += 1) - { - scene_view_character_data *Data = SceneView->Characters + CharacterIndex; - Data->Talking = false; - } - - //- sixten: apply character actions - for(scene_character_action *Action = Runtime->FirstCharacterAction; Action != 0; Action = Action->Next) - { - // sixten: find character - scene_view_character_data *Data = SV_CharacterDataFromName(Action->Target); - - if(Action->State == CR_State_None) - { - Data->Active = false; - } - else - { - if(Action->State != CR_State_Invalid) - { - Data->Info = SV_CharacterTextureFromAction(Action); - } - Data->Talking = true; - - string CharacterName = Action->Target; - scene_named_value *CharacterNameValue = S_FindGlobalVariableByName(Runtime, CharacterName, false); - if(CharacterNameValue && CharacterNameValue->Value.Kind == S_ValueKind_String) - { - CharacterName = CharacterNameValue->Value.String; - } - } - } - } - - Runtime->FirstCharacterAction = Runtime->LastCharacterAction = 0; - } + scene_view *SceneView = SV_GetState(); + + //- sixten: gather user input + b32 MousePressed = false; + for(platform_event *Event = SceneView->EventList->First; Event != 0; Event = Event->Next) + { + if(Event->Type == PlatformEvent_Press && Event->Key == Key_MouseLeft) + { + MousePressed = true; + } + } + b32 PlayerAction = (Platform_KeyPress(SceneView->EventList, Key_Space)||MousePressed); + + //- sixten: check if we can skip the current textbox + if(PlayerAction && SceneView->TextboxRevealed < SceneView->TextboxUsed) + { + PlayerAction = false; + SceneView->TextboxRevealed = SceneView->TextboxUsed; + } + + //- sixten: update the textbox + r32 CharsPerSecond = 25.0f; + SceneView->TextboxRevealed = Min((r32)SceneView->TextboxUsed, SceneView->TextboxRevealed+CharsPerSecond*SceneView->dtForFrame); + + + //- sixten: run the runtime + scene2_run_result RunResult = S2_Run(FrameArena, &SceneView->Runtime, &SceneView->Compiled, PlayerAction); + + //- sixten: append messages + S2_ConcatMessageList(SceneView->MessageArena, &SceneView->Messages, &RunResult.Messages); + + for(scene2_action *Action = RunResult.Actions.First; Action != 0; Action = Action->Next) + { + switch(Action->Kind) + { + case S2_ActionKind_None: { InvalidCodepath; } break; + InvalidDefaultCase; + } + } + +#if 0 + scene_view *SceneView = SV_GetState(); + textbox *Textbox = &SceneView->Textbox; + scene2_runtime *Runtime = &SceneView->Runtime; + platform_event_list *EventList = SceneView->EventList; + r32 dtForFrame = SceneView->dtForFrame; + compiled_scene2 *Compiled = &Runtime->Compiled; + + if(Compiled && Compiled->IsValid) + { + //- sixten: gather user input + b32 MousePressed = false; + for(platform_event *Event = EventList->First; Event != 0; Event = Event->Next) + { + if(Event->Type == PlatformEvent_Press && Event->Key == Key_MouseLeft) + { + MousePressed = true; + } + } + + b32 PlayerAction = (Platform_KeyPress(EventList, Key_Space)||MousePressed); + + //- sixten: run the scene + if(!Runtime->LastResult.HadError) + { + b32 AdvanceOnAwait = (Textbox->CharsRevealed >= Textbox->String.Count) && PlayerAction; + + for(;;) + { + scene_runtime_result RunResult = S_Run(Runtime, FrameArena, AdvanceOnAwait); + if(RunResult.ReachedAwait || RunResult.HadError) + { + break; + } + } + } + + //- sixten: advance textbox + { + r32 CharsPerSecond = 25.0f; + Textbox->CharsRevealed += dtForFrame*CharsPerSecond; + Textbox->CharsRevealed = Min(Textbox->CharsRevealed, (r32)Textbox->String.Count); + + if(Textbox->CharsRevealed < Textbox->String.Count && PlayerAction) + { + Textbox->CharsRevealed = Textbox->String.Count; + } + + AC_AnimateValueDirect(Textbox->CharsRevealed, 0.05f, &Textbox->CharsRevealedT); + } + + //- sixten: apply the textbox actions + for(scene_textbox_action *Action = Runtime->FirstTextboxAction; Action != 0; Action = Action->Next) + { + if(Action->Kind == S_TextboxActionKind_Set) + { + string ReplaceString = Action->String; + Textbox->String.Count = Min(ReplaceString.Count, Textbox->Capacity); + Copy(Textbox->String.Data, ReplaceString.Data, Textbox->String.Count); + Textbox->CharsRevealedT = 0; + Textbox->CharsRevealed = 0; + } + else if(Action->Kind == S_TextboxActionKind_Append) + { + string Addend = Action->String; + Textbox->CharsRevealedT = Textbox->String.Count; + s64 NewCount = Min(Textbox->String.Count+Addend.Count, Textbox->Capacity-1); + Copy(Textbox->String.Data+Textbox->String.Count, Action->String.Data, NewCount-Textbox->String.Count); + Textbox->String.Count = NewCount; + } + else + { + InvalidCodepath; + } + } + Runtime->FirstTextboxAction = Runtime->LastTextboxAction = 0; + + // sixten: update character state only if there has been a change + if(Runtime->FirstCharacterAction != 0) + { + //- sixten: make all characters non-talking + for(s32 CharacterIndex = 0; CharacterIndex < SceneView->CharactersUsed; CharacterIndex += 1) + { + scene_view_character_data *Data = SceneView->Characters + CharacterIndex; + Data->Talking = false; + } + + //- sixten: apply character actions + for(scene_character_action *Action = Runtime->FirstCharacterAction; Action != 0; Action = Action->Next) + { + // sixten: find character + scene_view_character_data *Data = SV_CharacterDataFromName(Action->Target); + + if(Action->StateModified) + { + if(Action->State == AssetID_None) + { + Data->Active = false; + } + else + { + Data->Info = SV_CharacterTextureFromAction(Action); + Data->Talking = true; + } + } + else + { + Data->Talking = true; + } + } + } + + Runtime->FirstCharacterAction = Runtime->LastCharacterAction = 0; + } +#endif } static void SV_Update(arena *FrameArena) @@ -858,7 +874,7 @@ static void SV_Update(arena *FrameArena) //- sixten: update the characters { - for(s32 CharacterIndex = 0; CharacterIndex < SceneView->CharacterCount; CharacterIndex += 1) + for(s32 CharacterIndex = 0; CharacterIndex < SceneView->CharactersUsed; CharacterIndex += 1) { scene_view_character_data *Data = SceneView->Characters + CharacterIndex; @@ -878,22 +894,22 @@ static void SV_Update(arena *FrameArena) } else { - TargetPctP = (r32)(CharacterIndex+1)/(SceneView->CharacterCount+1); + TargetPctP = (r32)(CharacterIndex+1)/(SceneView->CharactersUsed+1); } AC_AnimateValueDirect(TargetPctP, 0.4f, &Data->PctP); } - } - - //- sixten: prune any unactive characters - for(s32 CharacterIndex = 0; CharacterIndex < SceneView->CharacterCount; CharacterIndex += 1) - { - scene_view_character_data *Data = SceneView->Characters + CharacterIndex; - if(!Data->Active && Data->ActiveT < 0.01) - { - Move(Data, Data+1, (SceneView->CharacterCount-CharacterIndex-1)*sizeof(scene_view_character_data)); - SceneView->CharacterCount -= 1; - CharacterIndex -= 1; - } + + // sixten: prune any unactive characters + for(s32 CharacterIndex = 0; CharacterIndex < SceneView->CharactersUsed; CharacterIndex += 1) + { + scene_view_character_data *Data = SceneView->Characters + CharacterIndex; + if(!Data->Active && Data->ActiveT < 0.01) + { + Move(Data, Data+1, (SceneView->CharactersUsed-CharacterIndex-1)*sizeof(scene_view_character_data)); + SceneView->CharactersUsed -= 1; + CharacterIndex -= 1; + } + } } //- sixten: update scene @@ -901,26 +917,31 @@ static void SV_Update(arena *FrameArena) { SV_UpdateInDialog(FrameArena); } - else - { - - } } static void SV_BuildSceneView(vn_input *Input) { - scene_view *SceneView = SV_GetState(); - scene_runtime_result LastRun = SceneView->Runtime.LastResult; - if(LastRun.HadError) - { - BuildErrorScreen(&SceneView->Runtime, Input); - } - else if(SceneView->Runtime.Compiled.IsValid) - { - BuildScene(SceneView); - } - else - { - UI_LabelF("Invalid source"); - } -} \ No newline at end of file + scene_view *SceneView = SV_GetState(); + if(SceneView->Messages.Count != 0) + { + BuildErrorScreen(SceneView, Input); + } + else + { + BuildScene(SceneView); + } +} + +#if 0 + +scene_user_input Input = SV_GatherInputs(); // note that we here could consume a player interaction for skipping the text +scene_runtime_result Result = S_Run(&Runtime, &Inputs); +for(scene_action *Action = Result.FirstAction; Action != 0; Action = Action->Next) +{ + switch(Action->Kind) + { + ... + } +} + +#endif \ No newline at end of file diff --git a/code/vn_scene_view.h b/code/vn_scene_view.h index c5cdcf7..d6643e0 100644 --- a/code/vn_scene_view.h +++ b/code/vn_scene_view.h @@ -3,14 +3,6 @@ #ifndef VN_SCENE_VIEW_H #define VN_SCENE_VIEW_H -struct textbox -{ - string String; - s64 Capacity; - r32 CharsRevealedT; - r32 CharsRevealed; -}; - struct scene_view_character_texture_info { render_handle Texture; @@ -77,14 +69,23 @@ struct scene_nav struct scene_view { arena *SceneArena; - + //- sixten: state - scene_runtime Runtime; - textbox Textbox; - - //- sixten: characters - s32 CharacterCount; + scene2_runtime Runtime; + compiled_scene2 Compiled; + + //- sixten: messages + arena *MessageArena; + scene2_message_list Messages; + + //- sixten: textbox + char TextboxData[1024]; + u64 TextboxUsed; + r32 TextboxRevealed; + + //- sixten: characters scene_view_character_data Characters[16]; + u64 CharactersUsed; //- sixten: nav items scene_nav_item *NavItems; @@ -93,13 +94,6 @@ struct scene_view //- sixten: input per frame platform_event_list *EventList; r32 dtForFrame; - - //- sixten: temporary texture hub - render_handle BackgroundTexture; - render_handle TestHappy; - render_handle TestNormal; - render_handle MonikaLeaning; - }; static void SV_SetState(scene_view *View); @@ -107,8 +101,8 @@ static scene_view *SV_GetState(); static void SV_NewFrame(scene_view *View, platform_event_list *EventList, r32 dtForFrame); static void SV_Reset(void); -static void SV_SetCurrentSource(compiled_scene *Compiled); -static void SV_Init(scene_view *View, arena *TextboxArena); +static void SV_SetCurrentSource(compiled_scene2 *Compiled); +static void SV_Init(scene_view *View); static b32 SV_CurrentlyInProc(void); diff --git a/code/vn_theme_dark.h b/code/vn_theme_dark.h index f8a5418..2bb98b3 100644 --- a/code/vn_theme_dark.h +++ b/code/vn_theme_dark.h @@ -3,9 +3,9 @@ #ifndef VN_THEME_DARK_H #define VN_THEME_DARK_H -read_only v4 Theme_TextColor = V4(0.8, 0.8, 0.8, 1.0); -read_only v4 Theme_BackgroundColor = V4(0.1, 0.1, 0.1, 1.0); -read_only v4 Theme_BorderColor = V4(0.3, 0.3, 0.3, 1.0); -read_only v4 Theme_HighlightBorderColor = V4(0.6, 0.3, 0.1, 1.0); +read_only v4_r32 Theme_TextColor = V4R32(0.8, 0.8, 0.8, 1.0); +read_only v4_r32 Theme_BackgroundColor = V4R32(0.1, 0.1, 0.1, 1.0); +read_only v4_r32 Theme_BorderColor = V4R32(0.3, 0.3, 0.3, 1.0); +read_only v4_r32 Theme_HighlightBorderColor = V4R32(0.6, 0.3, 0.1, 1.0); #endif //VN_THEME_DARK_H diff --git a/code/vn_thread_context.h b/code/vn_thread_context.h deleted file mode 100644 index e91055f..0000000 --- a/code/vn_thread_context.h +++ /dev/null @@ -1,61 +0,0 @@ -/* date = April 30th 2023 11:35 am */ - -#ifndef VN_THREAD_CONTEXT_H -#define VN_THREAD_CONTEXT_H - -#define per_thread __declspec(thread) - -struct thread_context -{ - memory_arena Arenas[2]; -}; - -per_thread thread_context *ThreadLocal_ThreadContext = 0; - -inline void SetThreadContext(thread_context *Context) -{ - ThreadLocal_ThreadContext = Context; -} - -inline thread_context *GetThreadContext(void) -{ - return(ThreadLocal_ThreadContext); -} - -static temporary_memory GetScratch(memory_arena **Conflicts = 0, u64 ConflictCount = 0) -{ - temporary_memory Scratch = {}; - thread_context *Context = GetThreadContext(); - - for(u64 ArenaIndex = 0; - ArenaIndex < ArrayCount(Context->Arenas); - ++ArenaIndex) - { - b32 FoundConflict = false; - for(u64 ConflictIndex = 0; - ConflictIndex < ConflictCount; - ++ConflictIndex) - { - memory_arena *Conflict = Conflicts[ConflictIndex]; - if(Conflict == Context->Arenas + ArenaIndex) - { - FoundConflict = true; - break; - } - } - - if(!FoundConflict) - { - Scratch = BeginTemporaryMemory(Context->Arenas + ArenaIndex); - break; - } - } - - Assert(Scratch.Arena); - - return(Scratch); -} - -#define ReleaseScratch(Scratch) EndTemp(Scratch) - -#endif //VN_THREAD_CONTEXT_H diff --git a/code/vn_tokenizer.cpp b/code/vn_tokenizer.cpp index b654755..964abdf 100644 --- a/code/vn_tokenizer.cpp +++ b/code/vn_tokenizer.cpp @@ -140,9 +140,9 @@ static tokenize_result T_TokenizeFromText(arena *Arena, string Text, tokenizer_f //- sixten: identifiers if(TokenKind == TokenKind_None && (('A' <= *Byte && *Byte <= 'Z') || - ('a' <= *Byte && *Byte <= 'z') || - (UTF8Lengths[*Byte>>3] > 1) || - *Byte == '_')) + ('a' <= *Byte && *Byte <= 'z') || + (UTF8Lengths[*Byte>>3] > 1) || + *Byte == '_')) { TokenKind = TokenKind_Identifier; TokenStart = Byte; @@ -151,10 +151,10 @@ static tokenize_result T_TokenizeFromText(arena *Arena, string Text, tokenizer_f for(;Byte <= TextEnd; Byte += UTF8Lengths[*Byte>>3]) { if(Byte == TextEnd || !(('A' <= *Byte && *Byte <= 'Z') || - ('a' <= *Byte && *Byte <= 'z') || - ('0' <= *Byte && *Byte <= '9') || - (UTF8Lengths[*Byte>>3] > 1) || - *Byte == '_')) + ('a' <= *Byte && *Byte <= 'z') || + ('0' <= *Byte && *Byte <= '9') || + (UTF8Lengths[*Byte>>3] > 1) || + *Byte == '_')) { TokenEnd = Byte; break; @@ -163,25 +163,24 @@ static tokenize_result T_TokenizeFromText(arena *Arena, string Text, tokenizer_f string String = MakeString(TokenStart, TokenEnd-TokenStart); if(0) {} - else if(AreEqual(String, StrLit("and"))) { TokenKind = TokenKind_And; } else if(AreEqual(String, StrLit("branch"))) { TokenKind = TokenKind_Branch; } else if(AreEqual(String, StrLit("else"))) { TokenKind = TokenKind_Else; } else if(AreEqual(String, StrLit("false"))) { TokenKind = TokenKind_False; } - else if(AreEqual(String, StrLit("for"))) { TokenKind = TokenKind_For; } else if(AreEqual(String, StrLit("if"))) { TokenKind = TokenKind_If; } + else if(AreEqual(String, StrLit("then"))) { TokenKind = TokenKind_Then; } else if(AreEqual(String, StrLit("jump"))) { TokenKind = TokenKind_Jump; } - else if(AreEqual(String, StrLit("or"))) { TokenKind = TokenKind_Or; } else if(AreEqual(String, StrLit("proc"))) { TokenKind = TokenKind_Proc; } else if(AreEqual(String, StrLit("true"))) { TokenKind = TokenKind_True; } - else if(AreEqual(String, StrLit("var"))) { TokenKind = TokenKind_Var; } + else if(AreEqual(String, StrLit("let"))) { TokenKind = TokenKind_Let; } else if(AreEqual(String, StrLit("while"))) { TokenKind = TokenKind_While; } - else if(AreEqual(String, StrLit("nav"))) { TokenKind = TokenKind_Nav; } - else if(AreEqual(String, StrLit("background"))) { TokenKind = TokenKind_Background; } + else if(AreEqual(String, StrLit("call"))) { TokenKind = TokenKind_Call; } + else if(AreEqual(String, StrLit("wait"))) { TokenKind = TokenKind_Wait; } + else if(AreEqual(String, StrLit("end"))) { TokenKind = TokenKind_End; } } //- sixten: numerics if(TokenKind == TokenKind_None && (('0' <= *Byte && *Byte <= '9') || - (*Byte == '-' && Byte + 1 < TextEnd && '0' <= Byte[1] && Byte[1] <= '9'))) + (*Byte == '-' && Byte + 1 < TextEnd && '0' <= Byte[1] && Byte[1] <= '9'))) { TokenKind = TokenKind_Numeric; TokenStart = Byte; @@ -191,8 +190,8 @@ static tokenize_result T_TokenizeFromText(arena *Arena, string Text, tokenizer_f { TokenEnd += 1; if(Byte == TextEnd || - !(('0' <= *Byte && *Byte <= '9') || - *Byte == '_' || *Byte == '.')) + !(('0' <= *Byte && *Byte <= '9') || + *Byte == '_' || *Byte == '.')) { break; } @@ -225,9 +224,8 @@ static tokenize_result T_TokenizeFromText(arena *Arena, string Text, tokenizer_f //- sixten: symbols if(TokenKind == TokenKind_None && (*Byte == '{' || *Byte == '}' || *Byte == '(' || *Byte == ')' || - *Byte == ',' || *Byte == '.' || *Byte == '@' || *Byte == '#' || - *Byte == ';' || *Byte == '+' || *Byte == '-' || *Byte == '*' || - *Byte == '/')) + *Byte == ',' || *Byte == '.' || *Byte == '$' || *Byte == ';' || + *Byte == '+' || *Byte == '-' || *Byte == '*' || *Byte == '/')) { TokenStart = Byte; TokenEnd = Byte+1; @@ -240,8 +238,7 @@ static tokenize_result T_TokenizeFromText(arena *Arena, string Text, tokenizer_f case ')': { TokenKind = TokenKind_ParenthesisClose; } break; case ',': { TokenKind = TokenKind_Comma; } break; case '.': { TokenKind = TokenKind_Dot; } break; - case '@': { TokenKind = TokenKind_At; } break; - case '#': { TokenKind = TokenKind_PoundSign; } break; + case '$': { TokenKind = TokenKind_DollarSign; } break; case ';': { TokenKind = TokenKind_Semicolon; } break; case '+': { TokenKind = TokenKind_Plus; } break; case '-': { TokenKind = TokenKind_Minus; } break; diff --git a/code/vn_tokenizer.h b/code/vn_tokenizer.h index f20dab3..d551069 100644 --- a/code/vn_tokenizer.h +++ b/code/vn_tokenizer.h @@ -23,8 +23,7 @@ enum token_kind TokenKind_ParenthesisClose, TokenKind_Comma, TokenKind_Dot, - TokenKind_At, - TokenKind_PoundSign, + TokenKind_DollarSign, TokenKind_Semicolon, TokenKind_Plus, TokenKind_Minus, @@ -43,22 +42,21 @@ enum token_kind // sixten: keywords TokenKind_KeywordsBegin, - TokenKind_And, TokenKind_Branch, TokenKind_Else, TokenKind_False, - TokenKind_For, TokenKind_If, + TokenKind_Then, + TokenKind_While, TokenKind_Jump, - TokenKind_Or, TokenKind_Proc, TokenKind_True, - TokenKind_Var, - TokenKind_While, - TokenKind_Nav, - TokenKind_Background, + TokenKind_Let, + TokenKind_Call, + TokenKind_Wait, + TokenKind_End, TokenKind_KeywordsEnd, - + // sixten: whitespace TokenKind_Whitespace, TokenKind_Newline, @@ -79,6 +77,8 @@ struct token s64 Line; }; +global read_only token T_EmptyToken = {}; + struct token_chunk_node { token *Tokens; diff --git a/code/vn_ui.cpp b/code/vn_ui.cpp index 2177f7d..7763512 100644 --- a/code/vn_ui.cpp +++ b/code/vn_ui.cpp @@ -51,7 +51,7 @@ inline glyph_atlas *UI_GlyphAtlas(void) return(UI_GetState()->GlyphAtlas); } -inline void UI_SetDragStartP(v2 P) +inline void UI_SetDragStartP(v2_r32 P) { ui *UI = UI_GetState(); UI->DragStartP = P; @@ -63,22 +63,22 @@ inline void UI_UpdateDragStartP(void) UI->DragStartP = UI->MouseP; } -inline v2 UI_GetDragStartP(void) +inline v2_r32 UI_GetDragStartP(void) { ui *UI = UI_GetState(); return(UI->DragStartP); } -inline void UI_StoreDragV2(v2 DragData) +inline void UI_StoreDragV2(v2_r32 DragData) { ui *UI = UI_GetState(); - *(v2 *)&UI->DragData = DragData; + *(v2_r32 *)&UI->DragData = DragData; } -inline v2 UI_GetDragV2(void) +inline v2_r32 UI_GetDragV2(void) { ui *UI = UI_GetState(); - v2 Result = *(v2 *)UI->DragData; + v2_r32 Result = *(v2_r32 *)UI->DragData; return(Result); } @@ -127,7 +127,7 @@ static r64 UI_Time(void) static r64 UI_Blink(void) { - return(Cos(UI_GetState()->BlinkTime*10.0f)*0.5f+0.5f); + return(Cos(UI_GetState()->BlinkTime*6.0f)*0.5f+0.5f); } static void UI_ResetBlink(void) @@ -170,13 +170,13 @@ static string UI_BoxStringFromKey(ui_key Key) if(!AreEqual(Key, UI_EmptyKey())) { for(s32 BucketIndex = 0; - BucketIndex < ArrayCount(UI->BoxBuckets); - ++BucketIndex) + BucketIndex < ArrayCount(UI->BoxBuckets); + ++BucketIndex) { ui_box_bucket *Bucket = UI->BoxBuckets + BucketIndex; for(ui_box *Box = Bucket->First; - Box != 0; - Box = Box->HashNext) + Box != 0; + Box = Box->HashNext) { if(AreEqual(Key, Box->Key)) { @@ -202,8 +202,8 @@ inline ui_box *UI_BoxFromKey(ui *UI, ui_key Key) if(!AreEqual(Key, UI_EmptyKey())) { for(ui_box *Box = Bucket->First; - Box != 0; - Box = Box->HashNext) + Box != 0; + Box = Box->HashNext) { if(AreEqual(Box->Key, Key)) { @@ -259,8 +259,8 @@ inline ui_box *UI_MakeBox(ui_box_flags Flags, string String) if(Parent && !AreEqual(Key, UI_EmptyKey())) { for(ui_box *Child = Parent->First; - Child != 0; - Child = Child->Next) + Child != 0; + Child = Child->Next) { Assert(!AreEqual(Child->Key, Key)); } @@ -272,8 +272,8 @@ inline ui_box *UI_MakeBox(ui_box_flags Flags, string String) Box->First = Box->Last = Box->Next = Box->Prev = Box->Parent = 0; - Box->ComputedRelativeP = V2(0, 0); - Box->ComputedDim = V2(0, 0); + Box->ComputedRelativeP = V2R32(0, 0); + Box->ComputedDim = V2R32(0, 0); Box->LastFrameTouched = UI->CurrentFrame; @@ -341,13 +341,13 @@ static void UI_EquipBoxCustomDrawCallback(ui_box *Box, ui_custom_draw_callback * } // sixten(NOTE): ClippingRect = Intersection(TrueClippingRect, Parent->Rect); -static b32 UI_ChildrenContainsP(ui_box *Parent, v2 P, range2_r32 Clip) +static b32 UI_ChildrenContainsP(ui_box *Parent, v2_r32 P, range2_r32 Clip) { b32 Result = false; for(ui_box *Child = Parent->First; - Child != 0; - Child = Child->Next) + Child != 0; + Child = Child->Next) { range2_r32 IntersectionRect = Intersection(Clip, Child->Rect); @@ -391,8 +391,8 @@ static ui_signal UI_SignalFromBox(ui_box *Box) // sixten: Gather the clipping rects of all the parents. range2_r32 ClippedRect = Box->Rect; for(ui_box *Parent = Box->Parent; - Parent != 0; - Parent = Parent->Parent) + Parent != 0; + Parent = Parent->Parent) { if(Parent->Flags & UI_BoxFlag_Clip) { @@ -421,8 +421,8 @@ static ui_signal UI_SignalFromBox(ui_box *Box) // sixten: Are we the tooltip? b32 FoundTooltip = false; for(ui_box *Parent = Box->Parent; - Parent != 0; - Parent = Parent->Parent) + Parent != 0; + Parent = Parent->Parent) { if(Parent == UI->TooltipNode) { @@ -434,7 +434,7 @@ static ui_signal UI_SignalFromBox(ui_box *Box) if(!FoundTooltip) { Signal.Hovering &= ~UI_ChildrenContainsP(UI->TooltipNode, UI->MouseP, - Range2R32(V2(0, 0), V2(InfinityR32, InfinityR32))); + Range2R32(V2R32(0, 0), V2R32(InfinityR32, InfinityR32))); } } @@ -512,8 +512,8 @@ static void UI_SolveSizeViolations(ui_box *Box, axis2 Axis) if(!(Box->Flags & (UI_BoxFlag_OverflowX<First; - Child != 0; - Child = Child->Next) + Child != 0; + Child = Child->Next) { if(!(Child->Flags & (UI_BoxFlag_FloatingX< 0 && FixupBudget > 0) { for(ui_box *Child = Box->First; - Child != 0; - Child = Child->Next) + Child != 0; + Child = Child->Next) { if(!(Child->Flags & (UI_BoxFlag_FloatingX<First; - Child; - Child = Child->Next) + Child; + Child = Child->Next) { if((Child->Flags & (UI_BoxFlag_FloatingX<First; - Child; - Child = Child->Next) + Child; + Child = Child->Next) { if((Child->Flags & (UI_BoxFlag_FloatingX<Flags & UI_BoxFlag_DrawBackground) { - PushQuad(Group, Box->Rect, Box->BackgroundColor, Box->CornerRadius, 0, 0); + PushQuad(Group, Box->Rect, Box->BackgroundColor, + Box->CornerRadii.x, Box->CornerRadii.y, Box->CornerRadii.z, Box->CornerRadii.w, + 0, 0); } if(Box->Flags & UI_BoxFlag_HotAnimation) { - v4 Top = V4(1, 1, 1, 0.08F*Box->HotTransition); - v4 Bottom = V4(1, 1, 1, 0.0); + v4_r32 Top = V4R32(1, 1, 1, 0.08F*Box->HotTransition); + v4_r32 Bottom = V4R32(1, 1, 1, 0.0); - PushQuad(Group, Box->Rect, Top, Top, Bottom, Bottom, Box->CornerRadius, 0, 0); + + PushQuad(Group, Box->Rect, Top, Top, Bottom, Bottom, + Box->CornerRadii.x, Box->CornerRadii.y, Box->CornerRadii.z, Box->CornerRadii.w, 0, 0); } if(Box->Flags & UI_BoxFlag_ActiveAnimation) { - v4 Top = V4(0, 0, 0, 0.7F*Box->ActiveTransition); - v4 Bottom = V4(0, 0, 0, 0.1F*Box->ActiveTransition); + v4_r32 Top = V4R32(0, 0, 0, 0.7F*Box->ActiveTransition); + v4_r32 Bottom = V4R32(0, 0, 0, 0.1F*Box->ActiveTransition); - PushQuad(Group, Box->Rect, Top, Top, Bottom, Bottom, Box->CornerRadius, 0, 0); + PushQuad(Group, Box->Rect, Top, Top, Bottom, Bottom, + Box->CornerRadii.x, Box->CornerRadii.y, Box->CornerRadii.z, Box->CornerRadii.w, 0, 0); } if(Box->Flags & UI_BoxFlag_DrawText) { - v2 TextDim = V2(CalculateRasterizedTextWidth(GlyphAtlas, Box->Font, Box->FontSize, Box->String), - CalculateRasterizedTextHeight(GlyphAtlas, Box->Font, Box->FontSize, Box->String)); + v2_r32 TextDim = V2R32(CalculateRasterizedTextWidth(GlyphAtlas, Box->Font, Box->FontSize, Box->String), + CalculateRasterizedTextHeight(GlyphAtlas, Box->Font, Box->FontSize, Box->String)); - v2 P = Box->Rect.Min + (Box->ComputedDim - TextDim)*0.5; + v2_r32 P = Box->Rect.Min + (Box->ComputedDim - TextDim)*0.5; PushText(Group, GlyphAtlas, Box->Font, P, Box->FontSize, Box->TextColor, Box->String); } @@ -660,23 +665,23 @@ static void UI_DrawBox(ui_box *Box, render_group *Group, glyph_atlas *GlyphAtlas r32 R = (((Box->Key.Value >> 0) & ((1 << 22) - 1)) / (r32)((1 << 22) - 1)); r32 G = (((Box->Key.Value >> 21) & ((1 << 22) - 1)) / (r32)((1 << 22) - 1)); r32 B = (((Box->Key.Value >> 42) & ((1 << 22) - 1)) / (r32)((1 << 22) - 1)); - v4 Red = V4R32(R, G, B, 1); + v4_r32 Red = V4R32(R, G, B, 1); PushQuad(Group, Box->Rect, Red, Red, Red, Red, 0, 1.8, 1.8); } #endif for(ui_box *Child = Box->First; - Child != 0; - Child = Child->Next) + Child != 0; + Child = Child->Next) { if(Child->Flags & UI_BoxFlag_DrawDropShadow) { r32 ShadowRadius = 10; range2_r32 Rect = Range2R32(Child->Rect.Min - V2R32(ShadowRadius, ShadowRadius), - Child->Rect.Max + V2R32(ShadowRadius, ShadowRadius)); + Child->Rect.Max + V2R32(ShadowRadius, ShadowRadius)); - v4 ShadowColor = V4(0, 0, 0, 0.3); + v4_r32 ShadowColor = V4R32(0, 0, 0, 0.3); PushQuad(Group, Rect, ShadowColor, 0, ShadowRadius, 0); } @@ -689,8 +694,8 @@ static void UI_DrawBox(ui_box *Box, render_group *Group, glyph_atlas *GlyphAtlas } for(ui_box *Child = Box->First; - Child != 0; - Child = Child->Next) + Child != 0; + Child = Child->Next) { UI_DrawBox(Child, Group, GlyphAtlas); } @@ -702,7 +707,8 @@ static void UI_DrawBox(ui_box *Box, render_group *Group, glyph_atlas *GlyphAtlas if(Box->Flags & UI_BoxFlag_DrawBorder) { - PushQuad(Group, Box->Rect, Box->BorderColor, Box->CornerRadius, 0.8, Box->BorderThickness); + v4_r32 BorderColor = Brighten(Box->BorderColor, Box->HotTransition*0.5f+1.0f); + PushQuad(Group, Box->Rect, BorderColor, Box->CornerRadii.x, Box->CornerRadii.y, Box->CornerRadii.z, Box->CornerRadii.w, 0.8, Box->BorderThickness); } } @@ -728,8 +734,8 @@ static r32 UI_CalculateBoxSize(ui_box *Box, axis2 Axis, b32 ForceCalculate = fal glyph_atlas *Atlas = UI->GlyphAtlas; Result = ((Axis == Axis2_X) ? - CalculateRasterizedTextWidth(Atlas, Box->Font, Box->FontSize, Box->String) : - CalculateRasterizedTextHeight(Atlas, Box->Font, Box->FontSize, Box->String)) + + CalculateRasterizedTextWidth(Atlas, Box->Font, Box->FontSize, Box->String) : + CalculateRasterizedTextHeight(Atlas, Box->Font, Box->FontSize, Box->String)) + Box->SemanticSize[Axis].Value; } break; @@ -784,8 +790,8 @@ static r32 UI_CalculateChildrenSum(ui_box *Box, axis2 Axis, b32 ForceCalculate = if(Box->LayoutAxis == Axis) { for(ui_box *Child = Box->First; - Child != 0; - Child = Child->Next) + Child != 0; + Child = Child->Next) { Result += UI_CalculateBoxSize(Child, Axis, ForceCalculate); } @@ -793,8 +799,8 @@ static r32 UI_CalculateChildrenSum(ui_box *Box, axis2 Axis, b32 ForceCalculate = else { for(ui_box *Child = Box->First; - Child != 0; - Child = Child->Next) + Child != 0; + Child = Child->Next) { Result = Max(Result, UI_CalculateBoxSize(Child, Axis, ForceCalculate)); } @@ -805,8 +811,8 @@ static r32 UI_CalculateChildrenSum(ui_box *Box, axis2 Axis, b32 ForceCalculate = static void UI_LayoutBox(ui_box *Box) { for(ui_box *Child = Box->First; - Child != 0; - Child = Child->Next) + Child != 0; + Child = Child->Next) { Child->ComputedDim.E[Axis2_X] = UI_CalculateBoxSize(Child, Axis2_X); Child->ComputedDim.E[Axis2_Y] = UI_CalculateBoxSize(Child, Axis2_Y); @@ -816,8 +822,8 @@ static void UI_LayoutBox(ui_box *Box) UI_SolveSizeViolations(Box, Axis2_Y); for(ui_box *Child = Box->First; - Child != 0; - Child = Child->Next) + Child != 0; + Child = Child->Next) { Child->Rect.Min = Box->Rect.Min + Child->ComputedRelativeP + Box->Offset; Child->Rect.Max = Child->Rect.Min + Child->ComputedDim; @@ -827,11 +833,11 @@ static void UI_LayoutBox(ui_box *Box) static void UI_Init(ui *UI) { - UI->Arena = ArenaAlloc(Kilobytes(4), true); - UI->FrameArena = ArenaAlloc(Kilobytes(16), true); + UI->Arena = ArenaAlloc(Kilobytes(4), true, "UI State Arena"); + UI->FrameArena = ArenaAlloc(Kilobytes(16), true, "UI Frame Arena"); } -static void UI_BeginBuild(v2 ScreenDim) +static void UI_BeginBuild(v2_r32 ScreenDim) { ui *UI = UI_GetState(); @@ -923,7 +929,7 @@ inline void UI_ScanForHotAndActive(ui_box *Box, b32 *FoundHot, b32 *FoundActive) } } -static void UI_NewFrame(ui *UI, platform_event_list *EventList, v2 MouseP, r32 dtForFrame, glyph_atlas *GlyphAtlas) +static void UI_NewFrame(ui *UI, platform_event_list *EventList, v2_r32 MouseP, r32 dtForFrame, glyph_atlas *GlyphAtlas) { UI_SetState(UI); @@ -977,8 +983,8 @@ static void UI_NewFrame(ui *UI, platform_event_list *EventList, v2 MouseP, r32 d // sixten: Prune any unused boxes. for(s32 BucketIndex = 0; - BucketIndex < ArrayCount(UI->BoxBuckets); - ++BucketIndex) + BucketIndex < ArrayCount(UI->BoxBuckets); + ++BucketIndex) { ui_box_bucket *Bucket = UI->BoxBuckets + BucketIndex; for(ui_box *Box = Bucket->First; Box != 0;) diff --git a/code/vn_ui.h b/code/vn_ui.h index 25543e6..d7d058b 100644 --- a/code/vn_ui.h +++ b/code/vn_ui.h @@ -81,28 +81,28 @@ struct ui_box ui_box_flags Flags; string String; ui_size SemanticSize[Axis2_Count]; - v2 FixedP; - v4 TextColor; - v4 BackgroundColor; - v4 BorderColor; + v2_r32 FixedP; + v4_r32 TextColor; + v4_r32 BackgroundColor; + v4_r32 BorderColor; r32 BorderThickness; axis2 LayoutAxis; - r32 CornerRadius; + v4_r32 CornerRadii; font_id Font; r32 FontSize; - v2 Offset; + v2_r32 Offset; platform_cursor HoverCursor; ui_custom_draw_callback *DrawCallback; void *DrawCallbackData; - v2 ComputedRelativeP; - v2 ComputedDim; + v2_r32 ComputedRelativeP; + v2_r32 ComputedDim; // sixten: retained data range2_r32 Rect; r32 HotTransition; r32 ActiveTransition; - v2 ApproachingRelativeP; + v2_r32 ApproachingRelativeP; }; struct ui_box_bucket @@ -114,10 +114,10 @@ struct ui_box_bucket struct ui_signal { ui_box *Box; - v2 MouseP; - v2 dMouseP; - v2 DragDelta; - v2 Scroll; + v2_r32 MouseP; + v2_r32 dMouseP; + v2_r32 DragDelta; + v2_r32 Scroll; b8 Clicked; b8 Pressed; b8 PressedRight; @@ -153,13 +153,13 @@ struct ui b32 NextHotSet; u64 DragData[8]; - v2 DragStartP; + v2_r32 DragStartP; ui_style_stacks Stacks; platform_event_list *EventList; - v2 dMouseP; - v2 MouseP; + v2_r32 dMouseP; + v2_r32 MouseP; glyph_atlas *GlyphAtlas; }; @@ -171,15 +171,15 @@ inline ui_key UI_HotKey(void); inline ui_key UI_ActiveKey(void); inline platform_event_list *UI_EventList(void); inline arena *UI_FrameArena(void); -inline v2 UI_MouseP(void); +inline v2_r32 UI_MouseP(void); inline glyph_atlas *UI_GlyphAtlas(void); //- sixten: Drag helpers -inline void UI_SetDragStartP(v2 P); +inline void UI_SetDragStartP(v2_r32 P); inline void UI_UpdateDragStartP(void); -inline v2 UI_GetDragStartP(void); -inline void UI_StoreDragV2(v2 DragData); -inline v2 UI_GetDragV2(void); +inline v2_r32 UI_GetDragStartP(void); +inline void UI_StoreDragV2(v2_r32 DragData); +inline v2_r32 UI_GetDragV2(void); inline void UI_StoreDragR32(r32 DragData); inline r32 UI_GetDragR32(void); inline void UI_StoreDragPayload(void *Data); // sixten(NOTE): Payload MUST be 64-bytes. @@ -210,9 +210,9 @@ static ui_signal UI_SignalFromBox(ui_box *Box); //- sixten: Building and rendering static void UI_Init(ui *UI); -static void UI_BeginBuild(ui *UI, v2 ScreenDim); +static void UI_BeginBuild(ui *UI, v2_r32 ScreenDim); static void UI_EndBuild(void); static void UI_RenderFrame(render_group *RenderGroup); -static void UI_NewFrame(ui *UI, platform_event_list *EventList, v2 MouseP, r32 dtForFrame, glyph_atlas *GlyphAtlas); +static void UI_NewFrame(ui *UI, platform_event_list *EventList, v2_r32 MouseP, r32 dtForFrame, glyph_atlas *GlyphAtlas); #endif //VN_UI_H diff --git a/code/vn_ui.md b/code/vn_ui.md index 181badc..8cfc11a 100644 --- a/code/vn_ui.md +++ b/code/vn_ui.md @@ -6,12 +6,12 @@ UIStyleStacks: { Height `ui_size` `SemanticSize[Axis2_Y]` } { FixedX `r32` `FixedP.E[Axis2_X]` } { FixedY `r32` `FixedP.E[Axis2_Y]` } - { TextColor `v4` `TextColor` } - { BackgroundColor `v4` `BackgroundColor` } - { BorderColor `v4` `BorderColor` } + { TextColor `v4_r32` `TextColor` } + { BackgroundColor `v4_r32` `BackgroundColor` } + { BorderColor `v4_r32` `BorderColor` } { BorderThickness `r32` `BorderThickness` } { LayoutAxis `axis2` `LayoutAxis` } - { CornerRadius `r32` `CornerRadius` } + { CornerRadii `v4_r32` `CornerRadii` } { Font `font_id` `Font` } { FontSize `r32` `FontSize` } { OffsetX `r32` `Offset.x` } diff --git a/code/vn_ui_utils.cpp b/code/vn_ui_utils.cpp index 00b5ec1..1105e8c 100644 --- a/code/vn_ui_utils.cpp +++ b/code/vn_ui_utils.cpp @@ -166,7 +166,7 @@ static ui_signal UI_Checkbox(b32 *Checked, string String) { r32 OpacityTransition = AC_AnimateValueF(*Checked, *Checked, 0.15, "UI Checkbox Transition %p", Checked); - v4 TextColor = UI_TopTextColor(); + v4_r32 TextColor = UI_TopTextColor(); TextColor.a = OpacityTransition; UI_CornerRadius(2) UI_Size(UI_Em(1, 1), UI_Em(1, 1)) UI_Font(Font_Icons) UI_TextColor(TextColor) @@ -420,7 +420,7 @@ static r32 UI_Slider(r32 Value, range1_r32 Range) return(Result); } -static void UI_TooltipLabel(string Label, v2 P) +static void UI_TooltipLabel(string Label, v2_r32 P) { UI_Tooltip { @@ -457,12 +457,12 @@ UI_CUSTOM_DRAW_CALLBACK(UI_LineEditCallback) r32 CursorX = AC_AnimateValueF(TargetCursorX, 0, 0.175, "UI Input Cursor %p", Box); r32 MarkerX = AC_AnimateValueF(TargetMarkerX, 0, 0.175, "UI Input Mark %p", Box); - v2 BoxDim = DimOfRange(Box->Rect); + v2_r32 BoxDim = DimOfRange(Box->Rect); // sixten: Draw selection { - v2 Offset = V2(7.5, (BoxDim.y - Box->FontSize) / 2); - v2 Dim = V2(0, Box->FontSize); + v2_r32 Offset = V2R32(7.5, (BoxDim.y - Box->FontSize) / 2); + v2_r32 Dim = V2R32(0, Box->FontSize); if(CursorX > MarkerX) { Offset.x += MarkerX; @@ -474,8 +474,8 @@ UI_CUSTOM_DRAW_CALLBACK(UI_LineEditCallback) Dim.x = MarkerX - CursorX; } - v2 P = Box->Rect.Min + Offset; - v4 Color = V4(0.4, 0.7, 0.8, 0.3); + v2_r32 P = Box->Rect.Min + Offset; + v4_r32 Color = V4R32(0.4, 0.7, 0.8, 0.3); PushQuad(Group, Range2R32(P, P+Dim), Color, 0, 0, 0); } @@ -483,12 +483,12 @@ UI_CUSTOM_DRAW_CALLBACK(UI_LineEditCallback) { range1_r32 CursorSpan = Range1R32(CursorX, TargetCursorX); r32 Height = Box->FontSize + 4; - v2 Offset = V2(7.5F + CursorSpan.Min, (BoxDim.y - Height) / 2); - v2 Dim = V2(1.25F + CursorSpan.Max - CursorSpan.Min, Height); + v2_r32 Offset = V2R32(7.5F + CursorSpan.Min, (BoxDim.y - Height) / 2); + v2_r32 Dim = V2R32(1.25F + CursorSpan.Max - CursorSpan.Min, Height); r32 FocusT = AC_AnimateValueF(EditData->Focus, 0, 0.175, "UI Input Focus %p", Box); - v2 P = Box->Rect.Min + Offset; - v4 Color = SetAlpha(V4(0.3, 1, 0.3, 0.7), UI_Blink()*FocusT); + v2_r32 P = Box->Rect.Min + Offset; + v4_r32 Color = SetAlpha(V4R32(0.3, 1, 0.3, 0.7), UI_Blink()*FocusT); PushQuad(Group, Range2R32(P, P+Dim), Color, 0, 0, 0); } } @@ -513,7 +513,7 @@ static s64 UI_TextIndexFromP(ui_box *Box, v2_r32 P) Byte += Decode.Size; u32 Codepoint = Decode.Codepoint; - glyph *Glyph = GetGlyph(Atlas, Box->Font, Codepoint, Box->FontSize*Font_Oversample, GetSubpixelSegmentAtP(Advance*Font_Oversample)); + glyph *Glyph = F_GlyphFromAtlas(Atlas, Box->Font, Codepoint, Box->FontSize*Font_Oversample, F_SubpixelSegmentFromP(Advance*Font_Oversample)); Assert(Glyph); Advance += Glyph->Advance/Font_Oversample; diff --git a/code/vn_ui_utils.h b/code/vn_ui_utils.h index 65196bb..35eb3a3 100644 --- a/code/vn_ui_utils.h +++ b/code/vn_ui_utils.h @@ -32,6 +32,11 @@ inline void UI_SetNextAxisSize(axis2 Axis, ui_size Size); #define UI_PopOffset() UI_PopOffsetX(); UI_PopOffsetY() #define UI_SetNextOffset(x, y) UI_SetNextOffsetX(x); UI_SetNextOffsetY(y) +#define UI_PushCornerRadius(x) UI_PushCornerRadii(V4R32(x, x, x, x)) +#define UI_PopCornerRadius() UI_PopCornerRadii() +#define UI_SetNextCornerRadius(x) UI_SetNextCornerRadii(V4R32(x, x, x, x)) +#define UI_CornerRadius(x) UI_CornerRadii(V4R32(x, x, x, x)) + #define UI_FixedP(Value) UI_FixedX(Value.x) UI_FixedY(Value.y) #define UI_SetNextFixedP(Value) UI_SetNextFixedX((Value).x); UI_SetNextFixedY((Value).y) @@ -56,7 +61,7 @@ static ui_signal UI_Button(string String); static ui_signal UI_ButtonF(char *Format, ...); static ui_signal UI_Checkbox(b32 *Checked, string String); static r32 UI_Slider(r32 Value, range1_r32 Range); -static void UI_TooltipLabel(string Label, v2 P); +static void UI_TooltipLabel(string Label, v2_r32 P); static b32 UI_LineEdit(text_edit_state *State, u64 BufferSize, u8 *Buffer, u64 *BufferUsed, string String, b32 Focused); #endif //VN_UI_UTILS_H diff --git a/code/vn_workspace.cpp b/code/vn_workspace.cpp index d865fee..d81c7c3 100644 --- a/code/vn_workspace.cpp +++ b/code/vn_workspace.cpp @@ -38,20 +38,9 @@ static workspace *W_GetState(void) //- sixten: Commands static void W_IssueCommand(workspace_command_sig *Sig, u64 Argument) { - workspace_command *Result = 0; - workspace *Workspace = W_GetState(); - if(Workspace->FirstFreeCommand) - { - Result = Workspace->FirstFreeCommand; - DLLRemove(Workspace->FirstFreeCommand, Workspace->LastFreeCommand, Result); - } - - if(!Result) - { - Result = PushStruct(Workspace->CommandArena, workspace_command); - } + workspace_command *Result = PushStruct(Workspace->CommandArena, workspace_command); Result->Command = Sig; Result->Argument = Argument; @@ -62,20 +51,14 @@ static void W_ProcessCommands(void) { workspace *Workspace = W_GetState(); - workspace_command *Command = Workspace->FirstCommand; - while(Command != 0) - { - Command->Command(Command->Argument); - - workspace_command *ToRemove = Command; - Command = Command->Next; - - DLLRemove(Workspace->FirstCommand, Workspace->LastCommand, ToRemove); - Fill(ToRemove, 0, sizeof(workspace_command)); - DLLInsertLast(Workspace->FirstFreeCommand, Workspace->LastFreeCommand, ToRemove); - } - - ArenaClear(Workspace->CommandDataArena); + for(workspace_command *Command = Workspace->FirstCommand; Command != 0; Command = Command->Next) + { + workspace_command_sig *CommandSig = Command->Command; + CommandSig(Command->Argument); + } + + ArenaClear(Workspace->CommandArena); + Workspace->FirstCommand = Workspace->LastCommand = 0; } static void W_ProcessKeyBinds() @@ -143,7 +126,7 @@ static ui_signal W_BuildToolbarButton(char *Text, workspace_toolbar_menu Menu) } Workspace->Menu = Menu; - Workspace->MenuP = V2(Box->Rect.Min.x, Box->Rect.Max.y); + Workspace->MenuP = V2R32(Box->Rect.Min.x, Box->Rect.Max.y); } } @@ -170,7 +153,7 @@ static ui_signal W_BuildMenuItem(u32 Icon, char *Text, char *Shortcut) UI_Width(UI_TextContent(5, 1)) UI_MakeBoxF(UI_BoxFlag_DrawText, Text); UI_Spacer(UI_Percent(1, 0)); - UI_TextColor(V4(0.5, 0.5, 0.5, 1.0)) UI_Width(UI_TextContent(15, 1)) + UI_TextColor(V4R32(0.5, 0.5, 0.5, 1.0)) UI_Width(UI_TextContent(15, 1)) UI_MakeBoxF(UI_BoxFlag_DrawText, Shortcut); } @@ -216,8 +199,8 @@ static void W_BuildToolbar(void) "Workspace Dropdown"); UI_Parent(Dropdown) - UI_BackgroundColor(V4(0.25, 0.25, 0.25, 1)) - UI_BorderColor(V4(0.45, 0.45, 0.45, 1)) + UI_BackgroundColor(V4R32(0.25, 0.25, 0.25, 1)) + UI_BorderColor(V4R32(0.45, 0.45, 0.45, 1)) UI_CornerRadius(2) UI_Size(UI_Percent(1, 1), UI_Pixels(25, 1)) { @@ -240,6 +223,7 @@ static void W_BuildToolbar(void) if(W_BuildMenuItem(FontIcon_None, "Welcome", "").Clicked) {ViewKind = W_ViewKind_Startup;} if(W_BuildMenuItem(FontIcon_FolderOpen, "File Lister", "Ctrl + O").Clicked) {ViewKind = W_ViewKind_FileLister;} if(W_BuildMenuItem(FontIcon_Terminal, "Scene View", "").Clicked) {ViewKind = W_ViewKind_SceneView;} + if(W_BuildMenuItem(FontIcon_Wrench, "Bytecode Viewer", "").Clicked) {ViewKind = W_ViewKind_BytecodeViewer;} if(W_BuildMenuItem(FontIcon_Wrench, "Settings", "Ctrl + Shift + P").Clicked) {ViewKind = W_ViewKind_Settings;} if(ViewKind != W_ViewKind_None) @@ -267,125 +251,6 @@ static void W_BuildToolbar(void) } } - -//- sixten: Panels -static workspace_panel *W_CreateNewPanel(workspace_panel *Parent) -{ - workspace_panel *Result = 0; - - workspace *Workspace = W_GetState(); - - if(DLLIsEmpty(Workspace->FirstFreePanel)) - { - Result = PushStruct(Workspace->PanelArena, workspace_panel); - } - else - { - Result = Workspace->FirstFreePanel; - DLLRemove(Workspace->FirstFreePanel, Workspace->LastFreePanel, Result); - - *Result = {}; - } - - Result->Parent = Parent; - - return(Result); -} - -static void W_DeletePanel(workspace_panel *Panel) -{ - workspace *Workspace = W_GetState(); - - if(Workspace->CurrentPanel == Panel) - { - Workspace->CurrentPanel = 0; - } - - *Panel = {}; - DLLInsertLast(Workspace->FirstFreePanel, Workspace->LastFreePanel, Panel); -} - -static void W_SplitPanel(workspace_panel *Panel, axis2 Axis) -{ - workspace *Workspace = W_GetState(); - - if(Panel) - { - workspace_panel *Parent = Panel->Parent; - - if(Parent && (Parent->SplitAxis == Axis)) - { - workspace_panel *NewPanel = W_CreateNewPanel(Parent); - NewPanel->PercentOfParent = Panel->PercentOfParent = Panel->PercentOfParent * 0.5; - - DLLInsert_NP(Parent->First, Parent->Last, Panel, NewPanel, Next, Prev); - } - else - { - workspace_panel *NewPanel = W_CreateNewPanel(Panel); - NewPanel->FirstView = Panel->FirstView; - NewPanel->LastView = Panel->LastView; - - // sixten: Update the parents of the children. - for(workspace_view *Child = NewPanel->FirstView; - Child != 0; - Child = Child->Next) - { - Child->Parent = NewPanel; - } - - NewPanel->CurrentView = Panel->CurrentView; - NewPanel->PercentOfParent = 0.5; - DLLInsertLast(Panel->First, Panel->Last, NewPanel); - - NewPanel = W_CreateNewPanel(Panel); - NewPanel->PercentOfParent = 0.5; - DLLInsertLast(Panel->First, Panel->Last, NewPanel); - - Panel->FirstView = 0; - Panel->LastView = 0; - Panel->CurrentView = 0; - Panel->SplitAxis = Axis; - - if(Workspace->CurrentPanel == Panel) - { - Workspace->CurrentPanel = Panel->First; - } - } - } -} - -static b32 W_ViewIsDragged(workspace_view *View) -{ - workspace *Workspace = W_GetState(); - b32 Result = (Workspace->DragPayloadState != W_DragPayload_Inactive && Workspace->DragPayload.View == View) && - UI_GetState()->DragStartP != UI_MouseP(); - return(Result); -} - -inline void W_BeginDrag(workspace_drag_payload *Payload) -{ - workspace *Workspace = W_GetState(); - - // sixten(no longer a todo): Right now, if you spam-click a draggable item, you can trigger this - // assertion. I don't know what I want to do about this at the moment, but I'm sure - // future me will have a soulution at hand. ^.^ - // Assert(Workspace->DragPayloadState == W_DragPayload_Inactive); - // sixten(from the future): I have concluded that this should never be an issue. - - Workspace->DragPayload = *Payload; - Workspace->DragPayloadState = W_DragPayload_Active; -} - -inline b32 W_GetDragPayload(workspace_drag_payload *Dest) -{ - workspace *Workspace = W_GetState(); - - b32 Result = (Workspace->DragPayloadState != W_DragPayload_Inactive); - *Dest = Workspace->DragPayload; - return(Result); -} - static void W_BuildTabItem(workspace_panel *Panel, workspace_view *View) { workspace *Workspace = W_GetState(); @@ -403,65 +268,66 @@ static void W_BuildTabItem(workspace_panel *Panel, workspace_view *View) { UI_Spacer(UI_Percent(1-OpenT, 1)); - v4 BackgroundColor = ViewIsCurrent ? (PanelIsCurrent ? Theme_HighlightBorderColor : Theme_BorderColor) : ColorFromHex(0x353738FF); + v4_r32 BackgroundColor = ViewIsCurrent ? (PanelIsCurrent ? Theme_HighlightBorderColor : Theme_BorderColor) : ColorFromHex(0x353738FF); UI_SetNextWidth(UI_ChildrenSum(1, 1)); UI_SetNextHeight(UI_Percent(1, 1)); - UI_SetNextBackgroundColor(BackgroundColor); + UI_SetNextBackgroundColor(Brighten(BackgroundColor, 1.2f)); UI_SetNextBorderColor(LinearBlend(UI_TopBackgroundColor(), Color_Grey, 0.5)); - UI_SetNextLayoutAxis(Axis2_X); - UI_SetNextCornerRadius(0.0); - - ui_box *TabBox = UI_MakeBoxF(UI_BoxFlag_DrawBackground | + UI_SetNextLayoutAxis(Axis2_X); + UI_SetNextCornerRadii(V4R32(3.0, 3.0, 0, 0)); + + ui_box *TabBox = UI_MakeBoxF(UI_BoxFlag_DrawBackground | + //UI_BoxFlag_DrawBorder | UI_BoxFlag_DrawDropShadow | UI_BoxFlag_HotAnimation | UI_BoxFlag_ActiveAnimation | UI_BoxFlag_Clip | UI_BoxFlag_Clickable, "Workspace Panel Tab Item %S#%p", Name, View); - - UI_Parent(TabBox) UI_Padding(UI_Pixels(5, 1)) - { - UI_Size(UI_TextContent(1, 1), UI_Percent(1, 1)) UI_Label(Name); - UI_Spacer(UI_Pixels(5, 1)); - - // sixten: Build close button - { - UI_SetNextFont(Font_Icons); - UI_SetNextSize(UI_TextContent(1, 1), UI_Percent(1, 1)); - UI_SetNextHoverCursor(PlatformCursor_Hand); - - ui_box *CloseBox = UI_MakeBoxF(UI_BoxFlag_DrawText|UI_BoxFlag_Clickable, "%U", FontIcon_Cancel); - - CloseBox->TextColor = LinearBlend(TabBox->BackgroundColor, Color_Black, 0.3 - CloseBox->HotTransition*0.8); - - ui_signal Signal = UI_SignalFromBox(CloseBox); - if(Signal.Clicked) - { - W_IssueCommand(W_Command_CloseView, PointerToU64(View)); - } - } - } - - ui_signal Signal = UI_SignalFromBox(TabBox); - if(Signal.Clicked) - { - Workspace->CurrentPanel = Panel; - Panel->CurrentView = View; - } - - // sixten: Handle dragging the view. - if(Signal.Dragging) - { - if(Signal.Pressed) - { - workspace_drag_payload Payload = {}; - Payload.View = View; - Payload.Key = TabBox->Key; - - W_BeginDrag(&Payload); - } - } + + UI_Parent(TabBox) UI_Padding(UI_Pixels(5, 1)) + { + UI_Size(UI_TextContent(1, 1), UI_Percent(1, 1)) UI_Label(Name); + UI_Spacer(UI_Pixels(5, 1)); + + // sixten: Build close button + { + UI_SetNextFont(Font_Icons); + UI_SetNextSize(UI_TextContent(1, 1), UI_Percent(1, 1)); + UI_SetNextHoverCursor(PlatformCursor_Hand); + + ui_box *CloseBox = UI_MakeBoxF(UI_BoxFlag_DrawText|UI_BoxFlag_Clickable, "%U", FontIcon_Cancel); + + CloseBox->TextColor = LinearBlend(TabBox->BackgroundColor, Color_Black, 0.3 - CloseBox->HotTransition*0.8); + + ui_signal Signal = UI_SignalFromBox(CloseBox); + if(Signal.Clicked) + { + W_IssueCommand(W_Command_CloseView, PointerToU64(View)); + } + } + } + + ui_signal Signal = UI_SignalFromBox(TabBox); + if(Signal.Clicked) + { + Workspace->CurrentPanel = Panel; + Panel->CurrentView = View; + } + + // sixten: Handle dragging the view. + if(Signal.Dragging) + { + if(Signal.Pressed) + { + workspace_drag_payload Payload = {}; + Payload.View = View; + Payload.Key = TabBox->Key; + + W_BeginDrag(&Payload); + } + } } } @@ -590,7 +456,7 @@ static void W_BuildPanel(workspace_panel *Panel) // sixten: Draw dragged view overlay. { workspace_drag_payload Payload; - b32 DragActive = W_GetDragPayload(&Payload); + b32 DragActive = W_DragPayload(&Payload); b32 OverlayActive = (DragActive && (Payload.View->Parent != Panel) && InRange(BodyBox->Rect, UI_GetState()->MouseP)); @@ -637,7 +503,7 @@ static void W_BuildPanel(workspace_panel *Panel) r32 OverlayTransition = AC_AnimateValueF(OverlayActive, 0, 0.25, "Panel Drag Overlay %p", Panel); - v4 OverlayColor = LinearBlend(Color_Grey, Theme_HighlightBorderColor, 0.75); + v4_r32 OverlayColor = LinearBlend(Color_Grey, Theme_HighlightBorderColor, 0.75); OverlayColor.a = 0.5*OverlayTransition; UI_SetNextBackgroundColor(OverlayColor); @@ -674,7 +540,7 @@ static void W_BuildPanel(workspace_panel *Panel) ++ChildCount; } - v2 PanelDim = DimOfRange(PanelBox->Rect); + v2_r32 PanelDim = DimOfRange(PanelBox->Rect); r32 PaddingSize = 5; r32 PaddedSpace = (ChildCount - 1)*PaddingSize; @@ -725,12 +591,12 @@ static void W_BuildPanel(workspace_panel *Panel) } } -static void W_BuildDragPayload() +static void W_BuildDragPayload(void) { workspace *Workspace = W_GetState(); workspace_drag_payload Payload; - if(W_GetDragPayload(&Payload) && W_ViewIsDragged(Payload.View)) + if(W_DragPayload(&Payload) && W_ViewIsDragged(Payload.View)) { if(Workspace->DragPayloadState == W_DragPayload_Released) { @@ -753,14 +619,133 @@ static void W_BuildDragPayload() } } + +//- sixten: Panels +static workspace_panel *W_CreateNewPanel(workspace_panel *Parent) +{ + workspace_panel *Result = 0; + + workspace *Workspace = W_GetState(); + + if(DLLIsEmpty(Workspace->FirstFreePanel)) + { + Result = PushStruct(Workspace->PanelArena, workspace_panel); + } + else + { + Result = Workspace->FirstFreePanel; + DLLRemove(Workspace->FirstFreePanel, Workspace->LastFreePanel, Result); + + *Result = {}; + } + + Result->Parent = Parent; + + return(Result); +} + +static void W_DeletePanel(workspace_panel *Panel) +{ + workspace *Workspace = W_GetState(); + + if(Workspace->CurrentPanel == Panel) + { + Workspace->CurrentPanel = 0; + } + + DLLInsertLast(Workspace->FirstFreePanel, Workspace->LastFreePanel, Panel); +} + +static void W_SplitPanel(workspace_panel *Panel, axis2 Axis) +{ + workspace *Workspace = W_GetState(); + + if(Panel) + { + workspace_panel *Parent = Panel->Parent; + + if(Parent && (Parent->SplitAxis == Axis)) + { + workspace_panel *NewPanel = W_CreateNewPanel(Parent); + NewPanel->PercentOfParent = Panel->PercentOfParent = Panel->PercentOfParent * 0.5; + + DLLInsert_NP(Parent->First, Parent->Last, Panel, NewPanel, Next, Prev); + } + else + { + workspace_panel *NewPanel = W_CreateNewPanel(Panel); + NewPanel->FirstView = Panel->FirstView; + NewPanel->LastView = Panel->LastView; + + // sixten: Update the parents of the children. + for(workspace_view *Child = NewPanel->FirstView; + Child != 0; + Child = Child->Next) + { + Child->Parent = NewPanel; + } + + NewPanel->CurrentView = Panel->CurrentView; + NewPanel->PercentOfParent = 0.5; + DLLInsertLast(Panel->First, Panel->Last, NewPanel); + + NewPanel = W_CreateNewPanel(Panel); + NewPanel->PercentOfParent = 0.5; + DLLInsertLast(Panel->First, Panel->Last, NewPanel); + + Panel->FirstView = 0; + Panel->LastView = 0; + Panel->CurrentView = 0; + Panel->SplitAxis = Axis; + + if(Workspace->CurrentPanel == Panel) + { + Workspace->CurrentPanel = Panel->First; + } + } + } +} + +static b32 W_ViewIsDragged(workspace_view *View) +{ + workspace *Workspace = W_GetState(); + b32 Result = (Workspace->DragPayloadState != W_DragPayload_Inactive && Workspace->DragPayload.View == View) && + UI_GetState()->DragStartP != UI_MouseP(); + return(Result); +} + +//- sixten: Dragging + +inline void W_BeginDrag(workspace_drag_payload *Payload) +{ + workspace *Workspace = W_GetState(); + + // sixten(no longer a todo): Right now, if you spam-click a draggable item, you can trigger this + // assertion. I don't know what I want to do about this at the moment, but I'm sure + // future me will have a soulution at hand. ^.^ + // Assert(Workspace->DragPayloadState == W_DragPayload_Inactive); + // sixten(from the future): I have concluded that this should never be an issue. + + Workspace->DragPayload = *Payload; + Workspace->DragPayloadState = W_DragPayload_Active; +} + +inline b32 W_DragPayload(workspace_drag_payload *Dest) +{ + workspace *Workspace = W_GetState(); + + b32 Result = (Workspace->DragPayloadState != W_DragPayload_Inactive); + *Dest = Workspace->DragPayload; + return(Result); +} + //- sixten: Workspace static void W_Init(workspace *Workspace) { W_SetState(Workspace); - Workspace->CommandArena = ArenaAlloc(Kilobytes(4), true); - Workspace->CommandDataArena = ArenaAlloc(Kilobytes(4), true); - Workspace->PanelArena = ArenaAlloc(Kilobytes(4), true); + Workspace->CommandArena = ArenaAlloc(Kilobytes(4), true, "Workspace Command Arena"); + Workspace->PanelArena = ArenaAlloc(Kilobytes(4), true, "Workspace Panel Arena"); Workspace->RootPanel = Workspace->CurrentPanel = W_CreateNewPanel(0); diff --git a/code/vn_workspace.h b/code/vn_workspace.h index dff9152..c4eee48 100644 --- a/code/vn_workspace.h +++ b/code/vn_workspace.h @@ -87,9 +87,6 @@ struct workspace // sixten: Command Allocation arena *CommandArena; - arena *CommandDataArena; - workspace_command *FirstFreeCommand; - workspace_command *LastFreeCommand; // sixten: Command List workspace_command *FirstCommand; @@ -99,16 +96,17 @@ struct workspace arena *PanelArena; workspace_panel *FirstFreePanel; workspace_panel *LastFreePanel; + workspace_panel *RootPanel; + workspace_panel *CurrentPanel; + // sixten: Drag Data workspace_drag_payload_state DragPayloadState; workspace_drag_payload DragPayload; + // sixten: Dropdown Menu workspace_toolbar_menu Menu; - v2 MenuP; + v2_r32 MenuP; r32 MenuT; - - workspace_panel *RootPanel; - workspace_panel *CurrentPanel; }; #include "vn_workspace_file_lister.h" @@ -126,6 +124,16 @@ static workspace *W_GetState(void); //- sixten: Commands static void W_IssueCommand(workspace_command_sig *Sig, u64 Argument = 0); static void W_ProcessCommands(void); +static void W_ProcessKeyBinds(); + +//- sixten: Builder code +static ui_signal W_BuildToolbarButton(char *Text, workspace_toolbar_menu Menu); +static ui_signal W_BuildMenuItem(u32 Icon, char *Text, char *Shortcut); +static void W_BuildToolbar(void); + +static void W_BuildTabItem(workspace_panel *Panel, workspace_view *View); +static void W_BuildPanel(workspace_panel *Panel); +static void W_BuildDragPayload(void); //- sixten: Panels static workspace_panel *W_CreateNewPanel(workspace_panel *Parent); @@ -135,10 +143,9 @@ static void W_SplitPanel(workspace_panel *Panel, axis2 Axis); //- sixten: Views static b32 W_ViewIsDragged(workspace_view *View); -//- sixten: Builder code -static ui_signal W_BuildToolbarButton(char *Text, workspace_toolbar_menu Menu); -static ui_signal W_BuildMenuItem(u32 Icon, char *Text, char *Shortcut); -static void W_BuildToolbar(void); +//- sixten: Dragging +inline void W_BeginDrag(workspace_drag_payload *Payload); +inline b32 W_DragPayload(workspace_drag_payload *Dest); //- sixten: Workspace static void W_Init(workspace *Workspace); diff --git a/code/vn_workspace_commands.cpp b/code/vn_workspace_commands.cpp index 1341f51..ee0b7b4 100644 --- a/code/vn_workspace_commands.cpp +++ b/code/vn_workspace_commands.cpp @@ -131,7 +131,7 @@ WORKSPACE_COMMAND(W_Command_OpenFile) string Filepath = PushFormat(Scratch.Arena, "%S/%S", Action->Path, Action->Name); - platform_file_handle File = Platform.OpenFile(Filepath, PlatformAccess_Read); + platform_file_handle File = Platform.OpenFile(Filepath, PlatformAccess_Read|PlatformAccess_OpenAlways); if(File.IsValid) { // sixten: retrieve file extension diff --git a/code/vn_workspace_file_lister.cpp b/code/vn_workspace_file_lister.cpp index 67daea4..ade4908 100644 --- a/code/vn_workspace_file_lister.cpp +++ b/code/vn_workspace_file_lister.cpp @@ -21,12 +21,12 @@ UI_CUSTOM_DRAW_CALLBACK(W_FileListerInputCallback) r32 CursorX = AC_AnimateValueF(TargetCursorX, 0, 0.175, "Workspace View Input Cursor %p", Box); r32 MarkerX = AC_AnimateValueF(TargetMarkerX, 0, 0.175, "Workspace View Input Mark %p", Box); - v2 BoxDim = DimOfRange(Box->Rect); + v2_r32 BoxDim = DimOfRange(Box->Rect); // sixten: Draw selection { - v2 Offset = V2(7.5, (BoxDim.y - Box->FontSize) / 2); - v2 Dim = V2(0, Box->FontSize); + v2_r32 Offset = V2R32(7.5, (BoxDim.y - Box->FontSize) / 2); + v2_r32 Dim = V2R32(0, Box->FontSize); if(CursorX > MarkerX) { Offset.x += MarkerX; @@ -38,8 +38,8 @@ UI_CUSTOM_DRAW_CALLBACK(W_FileListerInputCallback) Dim.x = MarkerX - CursorX; } - v2 P = Box->Rect.Min + Offset; - v4 Color = V4(0.4, 0.7, 0.8, 0.3); + v2_r32 P = Box->Rect.Min + Offset; + v4_r32 Color = V4R32(0.4, 0.7, 0.8, 0.3); PushQuad(Group, Range2R32(P, P+Dim), Color, 0, 0, 0); } @@ -47,11 +47,11 @@ UI_CUSTOM_DRAW_CALLBACK(W_FileListerInputCallback) { range1_r32 CursorSpan = Range1R32(CursorX, TargetCursorX); r32 Height = Box->FontSize + 4; - v2 Offset = V2(7.5F + CursorSpan.Min, (BoxDim.y - Height) / 2); - v2 Dim = V2(1.25F + CursorSpan.Max - CursorSpan.Min, Height); + v2_r32 Offset = V2R32(7.5F + CursorSpan.Min, (BoxDim.y - Height) / 2); + v2_r32 Dim = V2R32(1.25F + CursorSpan.Max - CursorSpan.Min, Height); - v2 P = Box->Rect.Min + Offset; - v4 Color = V4(0.3, 1, 0.3, 0.7); + v2_r32 P = Box->Rect.Min + Offset; + v4_r32 Color = V4R32(0.3, 1, 0.3, 0.7); PushQuad(Group, Range2R32(P, P+Dim), Color, 0, 0, 0); } } @@ -65,12 +65,12 @@ static b32 W_BuildFileListerItem(string Text, u32 Icon, b32 Selected, b32 EnterP UI_SetNextBackgroundColor(LinearBlend(Theme_BackgroundColor, Theme_HighlightBorderColor, SelectedT*0.5)); UI_SetNextBorderColor(LinearBlend(Theme_BorderColor, Theme_HighlightBorderColor, SelectedT)); ui_box *Container = UI_MakeBoxF(UI_BoxFlag_DrawBorder | - UI_BoxFlag_DrawBackground | - UI_BoxFlag_Clickable | - UI_BoxFlag_HotAnimation | - UI_BoxFlag_ActiveAnimation| - UI_BoxFlag_DrawDropShadow, - "File Lister %S", Text); + UI_BoxFlag_DrawBackground | + UI_BoxFlag_Clickable | + UI_BoxFlag_HotAnimation | + UI_BoxFlag_ActiveAnimation| + UI_BoxFlag_DrawDropShadow, + "File Lister %S", Text); UI_Parent(Container) { UI_Width(UI_Em(2, 1)) UI_Font(Font_Icons) UI_LabelF("%U", Icon); diff --git a/code/vn_workspace_nav_editor.cpp b/code/vn_workspace_nav_editor.cpp index b44e772..1c97601 100644 --- a/code/vn_workspace_nav_editor.cpp +++ b/code/vn_workspace_nav_editor.cpp @@ -215,8 +215,8 @@ static void W_BuildNavEditor(workspace_view *View) workspace_view_nav_editor *Editor = (workspace_view_nav_editor *)View->Data; scene_view *SceneView = SV_GetState(); - UI_BackgroundColor(V4(0.25, 0.25, 0.25, 1)) - UI_BorderColor(V4(0.45, 0.45, 0.45, 1)) + UI_BackgroundColor(V4R32(0.25, 0.25, 0.25, 1)) + UI_BorderColor(V4R32(0.45, 0.45, 0.45, 1)) UI_WidthFill UI_Height(UI_Em(2.0f, 1.0f)) UI_LayoutAxis(Axis2_X) UI_Parent(UI_MakeBoxF(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBorder, "Workspace Nav Editor Toolbar")) @@ -383,7 +383,7 @@ static void W_BuildNavEditor(workspace_view *View) //- sixten: calculate item position r32 AppliedScale = GlobalScale*Item->Scale; - render_handle Texture = TextureFromAssetID(Item->TextureID); + render_handle Texture = A_TextureFromAssetID(Item->TextureID); v2_r32 TextureDim = ConvertV2ToR32(DimFromTexture(Texture)); v2_r32 TextureOrigin = Hadamard(TextureDim, Item->Origin); v2_r32 Dim = TextureDim*AppliedScale; @@ -396,7 +396,7 @@ static void W_BuildNavEditor(workspace_view *View) UI_SetNextHoverCursor(PlatformCursor_Hand); UI_SetNextSize(UI_Pixels(Dim.x, 1), UI_Pixels(Dim.y, 1)); ui_box *ItemBox = UI_MakeBoxF(UI_BoxFlag_Clickable|UI_BoxFlag_FloatingX|UI_BoxFlag_FloatingY|((Node==Editor->SelectedItem)?UI_BoxFlag_DrawBorder:0), - "View Item Box %i", ItemIndex); + "View Item Box %i", ItemIndex); UI_EquipBoxCustomDrawCallback(ItemBox, BuildNavItemDrawCallback, Data); if(Node == Editor->SelectedItem) diff --git a/code/vn_workspace_text_editor.cpp b/code/vn_workspace_text_editor.cpp index 16f4001..a38d30f 100644 --- a/code/vn_workspace_text_editor.cpp +++ b/code/vn_workspace_text_editor.cpp @@ -4,7 +4,7 @@ static mutable_string MutableStringAllocate(u64 Size) { mutable_string Result = {}; - Result.Arena = ArenaAlloc(Size); + Result.Arena = ArenaAlloc(Size, false, "Mutable String"); ArenaSetAlign(Result.Arena, 1); Result.String = MakeString(PushArray(Result.Arena, u8, 1), 0LL); return(Result); @@ -114,8 +114,8 @@ static void W_TextEditorApplyChanges(workspace_view_text_editor *Editor) Editor->Tokens = TextData.Tokens; Editor->Lines = TextData.Lines; Editor->MaxLineCount = TextData.MaxLineCount; - Editor->Compiled = S_ScriptFromText(Editor->ProcessingArena, Editor->Text.String); - if(Editor->Compiled.IsValid) + Editor->Compiled = S2_CompiledFromString(Editor->ProcessingArena, Editor->Text.String); + if(Editor->Compiled.Messages.Count == 0) { SV_SetCurrentSource(&Editor->Compiled); } @@ -187,85 +187,27 @@ static b32 W_ProcessTextEditorEvent(workspace_view_text_editor *Editor, platform return(CursorHasBeenModified); } -static void W_BuildTextEditorInfoBar(workspace_view_text_editor *Editor) +static b32 W_ProcessDigitalKeyEvent(workspace_view_text_editor *Editor, platform_event_type Type, u32 Data) { - UI_SetNextLayoutAxis(Axis2_X); - UI_WidthFill UI_Height(UI_Em(1.75f, 1)) UI_Parent(UI_MakeBoxF(UI_BoxFlag_DrawDropShadow, "")) UI_Padding(UI_Em(1, 1)) - { - UI_Width(UI_TextContent(0, 1)) - { - UI_Font(Font_Icons) UI_LabelF("%U", FontIcon_Attention); - UI_Spacer(UI_Em(0.5f, 1)); - UI_LabelF("%i", Editor->Compiled.Errors.Count); - } - } -} - -static void W_BuildTextEditorErrorList(workspace_view_text_editor *Editor) -{ - r32 TargetFooterHeightEm = 2.25f*Min(Editor->Compiled.Errors.Count, 10LL); - UI_Size(UI_Percent(1, 0), UI_Em(AC_AnimateValueF(TargetFooterHeightEm, TargetFooterHeightEm, 0.3, "Error Lister %p", Editor), 1)) UI_Column() UI_Height(UI_TextContent(0, 1)) + platform_event Event = {}; + Event.Type = Type; + if(Type == PlatformEvent_Press) { - s64 Index = 0; - for(scene_compile_error *Error = Editor->Compiled.Errors.First; Error != 0; Error = Error->Next, Index += 1) - { - UI_SetNextHeight(UI_ChildrenSum(1, 1)); - UI_SetNextLayoutAxis(Axis2_X); - UI_Parent(UI_MakeBoxF(0, "Editor Error Lister Container %p", Error)) UI_Padding(UI_Em(1, 1)) UI_Height(UI_Em(1.75f, 1)) - { - UI_SetNextBackgroundColor(SetAlpha(Theme_BorderColor, 0.8f)); - UI_SetNextCornerRadius(4); - UI_SetNextLayoutAxis(Axis2_X); - UI_SetNextHoverCursor(PlatformCursor_Hand); - ui_box *ContainerBox = UI_MakeBoxF(UI_BoxFlag_Clickable|UI_BoxFlag_DrawDropShadow|UI_BoxFlag_DrawBorder, "Container Box"); - - UI_Parent(ContainerBox) UI_Padding(UI_Em(1, 1)) UI_Width(UI_TextContent(0, 1)) - { - UI_Font(Font_Icons) UI_LabelF("%U", FontIcon_Attention); - UI_Spacer(UI_Em(0.5f, 1)); - // sixten(TODO): this is dumb, slow and downright stupid. - text_point Point = TextPointFromOffset(Editor->Text.String, Error->Token.Range.Min); - UI_LabelF("%i:%i", Point.Line, Point.Column); - UI_Spacer(UI_Em(0.5f, 1)); - UI_Label(Error->Message); - UI_Spacer(UI_Percent(1, 0)); - } - - ui_signal Signal = UI_SignalFromBox(ContainerBox); - if(Signal.Hovering) - { - UI_TooltipLabel(StrLit("Goto in source"), UI_MouseP()); - // sixten(TODO): ACTUALLY GO TO THE SOURCE LOCATION - } - } - UI_Spacer(UI_Em(0.5, 1)); - } + Event.Key = (platform_key)Data; } -} - -UI_CUSTOM_DRAW_CALLBACK(W_TextEditorLinesBarDrawCallback) -{ - workspace_view_text_editor *Editor = (workspace_view_text_editor *)Data; - - //- sixten: calculate dimensions - ui_box *Parent = Box->Parent; - v2_r32 ParentDim = DimOfRange(Parent->Rect); - - r32 FontSize = Editor->FontSize; - r32 LineHeight = FontSize + 4.0f; - - s64 LineStart = Floor(-Parent->Offset.y/LineHeight); - s64 LineEnd = Min(Editor->Lines.Count, (s64)Floor((ParentDim.y-Parent->Offset.y)/LineHeight)+1); - - s64 LineNumberCount = (s64)(Log(Editor->Lines.Count)/Log(10))+1; - - for(s64 Line = LineStart; Line < LineEnd; Line += 1) + else if(Type == PlatformEvent_Text) { - PushTextF(Group, Atlas, Font_Monospace, Box->Rect.Min+V2R32(0, Line*LineHeight), Editor->FontSize, Color_Grey, " %*i", LineNumberCount, Line+1); + Event.Codepoint = Data; } + + return(W_ProcessTextEditorEvent(Editor, &Event)); } -UI_CUSTOM_DRAW_CALLBACK(W_TextEditorDrawCallback) + +//////////////////////////////// +//~ sixten: Workspace Text Editor Draw Callbacks + +static UI_CUSTOM_DRAW_CALLBACK(W_TextEditorDrawCallback) { workspace_view_text_editor *Editor = (workspace_view_text_editor *)Data; temp Scratch = GetScratch(); @@ -276,11 +218,11 @@ UI_CUSTOM_DRAW_CALLBACK(W_TextEditorDrawCallback) //- sixten: rendering properties r32 FontSize = Editor->FontSize; - r32 LineHeight = FontSize + 4.0f; - + r32 LineHeight = FontSize*1.25f; // + 4.0f + //- sixten: calculate the dimensions of the glyphs - glyph *Glyph = GetGlyph(Atlas, Font_Monospace, 'A', FontSize, 0); - r32 GlyphAdvance = Glyph->Advance; + glyph *Glyph = F_GlyphFromAtlas(Atlas, Font_Monospace, 'A', FontSize, 0); + v2_r32 GlyphDim = V2R32(Glyph->Advance, LineHeight); //- sixten: find the text point text_point CursorTextP = TextPointFromOffset(Editor->Text.String, Editor->EditState.Cursor); @@ -296,191 +238,279 @@ UI_CUSTOM_DRAW_CALLBACK(W_TextEditorDrawCallback) token *TokensEnd = TokensBegin + Tokens.Count; v2_r32 StartTokenP = Box->Rect.Min; - //- sixten: find the first visible token - token *VisibleTokensBegin = TokensBegin; - for(s64 LinesFound = 0; LinesFound < LineStart && VisibleTokensBegin < TokensEnd; VisibleTokensBegin += 1) - { - if(VisibleTokensBegin->Kind == TokenKind_Newline) - { - LinesFound += 1; + //- sixten: find the first visible token + token *VisibleTokensBegin = TokensBegin; + for(s64 LinesFound = 0; LinesFound < LineStart && VisibleTokensBegin < TokensEnd; VisibleTokensBegin += 1) + { + if(VisibleTokensBegin->Kind == TokenKind_Newline) + { + LinesFound += 1; StartTokenP.y += LineHeight; - } - } - - //- sixten: find the last visible token - token *VisibleTokensEnd = VisibleTokensBegin; - for(s64 LinesFound = 0; LinesFound < LineEnd-LineStart && VisibleTokensEnd < TokensEnd; VisibleTokensEnd += 1) - { - if(VisibleTokensEnd->Kind == TokenKind_Newline) - { - LinesFound += 1; - } - } + } + } -#if 0 + //- sixten: find the last visible token + token *VisibleTokensEnd = VisibleTokensBegin; + for(s64 LinesFound = 0; LinesFound < LineEnd-LineStart && VisibleTokensEnd < TokensEnd; VisibleTokensEnd += 1) + { + if(VisibleTokensEnd->Kind == TokenKind_Newline) + { + LinesFound += 1; + } + } + +#if 1 //- sixten: render gradient on current line { - v4_r32 ColorBegin = SetAlpha(Theme_HighlightBorderColor, 0.5); + v4_r32 ColorBegin = SetAlpha(Theme_HighlightBorderColor, 0.3*AC_AnimateValueF(Editor->EditState.Mark == Editor->EditState.Cursor, + Editor->EditState.Mark == Editor->EditState.Cursor, + 0.1f, "Text Editor Gradient Fade %p", Box)); v4_r32 ColorEnd = SetAlpha(Theme_HighlightBorderColor, 0.0); - range2_r32 LineDest = Range2R32(Box->Rect.Min+V2R32(0, (CursorTextP.Line-1)*LineHeight), Box->Rect.Min+V2R32(400, CursorTextP.Line*LineHeight)); - PushQuad(Group, LineDest, ColorBegin, ColorEnd, ColorBegin, ColorEnd, 0, 0, 0); - PushQuad(Group, LineDest, Theme_BackgroundColor, Theme_BackgroundColor, Theme_BackgroundColor, Theme_BackgroundColor, 4.0f, 14, 0); + range2_r32 LineDest = Range2R32(Box->Rect.Min+V2R32(0, AC_AnimateValueF((CursorTextP.Line-1)*LineHeight, (CursorTextP.Line-1)*LineHeight, 0.1f, "Text Editor Gradient %p", Box)), + Box->Rect.Min+V2R32(ParentDim.x, CursorTextP.Line*LineHeight)); + PushQuad(Group, LineDest, ColorBegin, LinearBlend(ColorBegin, ColorEnd, 0.5f), LinearBlend(ColorBegin, ColorEnd, 0.3f), ColorEnd, 0, 1.5f, 0); + //PushQuad(Group, LineDest, Theme_BackgroundColor, Theme_BackgroundColor, Theme_BackgroundColor, Theme_BackgroundColor, 4.0f, 14, 0); } #endif - //- sixten: render tokens + //- sixten: render tokens v2_r32 TokenP = StartTokenP; for(token *Token = VisibleTokensBegin; Token < VisibleTokensEnd; Token += 1) - { - string TokenString = T_StringFromToken(Editor->Text.String, *Token); - - //- sixten: get color & font from token - font_id Font = Font_Monospace; - v4 Color = Color_Cyan; - if(Token->Kind == TokenKind_Comment) { Color = Color_Grey; Font = Font_MonospaceOblique; } - else if(Token->Kind > TokenKind_SymbolsBegin && Token->Kind < TokenKind_SymbolsEnd) { Color = Color_Grey; } - else if(Token->Kind == TokenKind_StringLiteral) { Color = ColorFromHex(0xffa900ff); } - else if(Token->Kind == TokenKind_Numeric) { Color = ColorFromHex(0xffa900ff); } - else if(Token->Kind > TokenKind_KeywordsBegin && Token->Kind < TokenKind_KeywordsEnd) - { - if(Token->Kind == TokenKind_True || Token->Kind == TokenKind_False) - { - Color = ColorFromHex(0xffa900ff); - } - else - { - Color = ColorFromHex(0xf0c674ff); - } - } - else if(Token->Kind == TokenKind_Identifier) - { - Color = Theme_TextColor; - } - - //- sixten: check for errors - b32 ConsideredError = false; - for(scene_compile_error *Error = Editor->Compiled.Errors.First; Error != 0; Error = Error->Next) - { - if(Error->Token.Range.Min == Token->Range.Min && - Error->Token.Range.Max == Token->Range.Max) - { - ConsideredError = true; - break; - } - } - - //- sixten: render & advance by token - if(!(T_IsWhitespace(Token->Kind))) - { - if(Token->Kind == TokenKind_Comment) - { - //- sixten: advance to newline and push text - // sixten(TODO): proper multiline comment rendering. - u8 *TextBegin = TokenString.Data; - u8 *TextEnd = TextBegin+TokenString.Count; - u8 *Marker = TextBegin; - for(u8 *Byte = TextBegin; Byte <= TextEnd; Byte += 1) - { - if(*Byte == '\n' || Byte == TextEnd) - { - PushText(Group, Atlas, Font, TokenP, FontSize, Color, MakeString(Marker, Byte-Marker)); - Marker = Byte+1; - - if(*Byte == '\n' && Byte != TextEnd) - { - TokenP.x = StartTokenP.x; - TokenP.y += LineHeight; - } - } - } - } - else - { - r32 TokenWidth = PushText(Group, Atlas, Font, TokenP, FontSize, Color, TokenString); - - //- sixten: render error highlight - if(ConsideredError) - { - range2_r32 Dest = Range2R32(TokenP+V2R32(0, LineHeight-3), TokenP+V2R32(TokenWidth, LineHeight)); - v4_r32 ErrorColor = V4R32(0.9f, 0.3f, 0.3f, 0.8f); - PushQuad(Group, Dest, ErrorColor, ErrorColor, ErrorColor, ErrorColor, 3, 0.4, 0); - } - TokenP.x += TokenWidth; - } - } - else - { - if(Token->Kind == TokenKind_Newline) - { - TokenP.x = StartTokenP.x; - TokenP.y += LineHeight; - } - else - { - u8 *StringBegin = TokenString.Data; - u8 *StringEnd = StringBegin + TokenString.Count; - for(u8 *Char = StringBegin; Char < StringEnd; Char += 1) - { - if(*Char == ' ' || *Char == '\t') - { - TokenP.x += GlyphAdvance; - } - } - } - } - } + { + string TokenString = T_StringFromToken(Editor->Text.String, *Token); + + //- sixten: get color & font from token + font_id Font = Font_Monospace; + v4_r32 Color = Color_Cyan; + if(Token->Kind == TokenKind_Comment) { Color = Color_Grey; Font = Font_MonospaceOblique; } + else if(Token->Kind > TokenKind_SymbolsBegin && Token->Kind < TokenKind_SymbolsEnd) { Color = Color_Grey; } + else if(Token->Kind == TokenKind_StringLiteral) { Color = ColorFromHex(0xffa900ff); } + else if(Token->Kind == TokenKind_Numeric) { Color = ColorFromHex(0xffa900ff); } + else if(Token->Kind > TokenKind_KeywordsBegin && Token->Kind < TokenKind_KeywordsEnd) + { + if(Token->Kind == TokenKind_True || Token->Kind == TokenKind_False) + { + Color = ColorFromHex(0xffa900ff); + } + else + { + Color = ColorFromHex(0xf0c674ff); + } + } + else if(Token->Kind == TokenKind_Identifier) + { + Color = Theme_TextColor; + } + + //- sixten: check for errors + b32 ConsideredError = false; + for(scene2_message *Message = Editor->Compiled.Messages.First; Message != 0; Message = Message->Next) + { + if(Message->Token.Range.Min == Token->Range.Min && + Message->Token.Range.Max == Token->Range.Max) + { + ConsideredError = true; + break; + } + } + + //- sixten: render & advance by token + if(!(T_IsWhitespace(Token->Kind))) + { + if(Token->Kind == TokenKind_Comment) + { + //- sixten: advance to newline and push text + // sixten(TODO): proper multiline comment rendering. + u8 *TextBegin = TokenString.Data; + u8 *TextEnd = TextBegin+TokenString.Count; + u8 *Marker = TextBegin; + for(u8 *Byte = TextBegin; Byte <= TextEnd; Byte += 1) + { + if(*Byte == '\n' || Byte == TextEnd) + { + TokenP.x += PushText(Group, Atlas, Font, TokenP, FontSize, Color, MakeString(Marker, Byte-Marker)); + Marker = Byte+1; + + if(*Byte == '\n' && Byte != TextEnd) + { + TokenP.x = StartTokenP.x; + TokenP.y += LineHeight; + } + } + } + } + else + { + r32 TokenWidth = PushText(Group, Atlas, Font, TokenP, FontSize, Color, TokenString); + + //- sixten: render error highlight + if(ConsideredError) + { + range2_r32 Dest = Range2R32(TokenP+V2R32(0, LineHeight-3), TokenP+V2R32(TokenWidth, LineHeight)); + v4_r32 ErrorColor = V4R32(0.9f, 0.3f, 0.3f, 0.8f); + PushQuad(Group, Dest, ErrorColor, ErrorColor, ErrorColor, ErrorColor, 3, 0.4, 0); + } + TokenP.x += TokenWidth; + } + } + else + { + if(Token->Kind == TokenKind_Newline) + { + TokenP.x = StartTokenP.x; + TokenP.y += LineHeight; + } + else + { + u8 *StringBegin = TokenString.Data; + u8 *StringEnd = StringBegin + TokenString.Count; + for(u8 *Char = StringBegin; Char < StringEnd; Char += 1) + { + if(*Char == ' ' || *Char == '\t') + { + TokenP.x += GlyphDim.x; + } + } + } + } + } //- sixten: render the selection - { - text_range Selection = TextRange(CursorTextP, MarkTextP); - range1_s64 LineRange = Range1S64(Selection.Min.Line, Selection.Max.Line); - for(s64 LineIndex = LineStart; LineIndex < LineEnd; LineIndex += 1) - { - if(Contains(LineRange, LineIndex + 1)) - { - range1_s64 ColumnRange = Editor->Lines.Ranges[LineIndex]; - range1_s64 NormalizedColumnRange = Range1S64(0, DimOfRange(ColumnRange)); - if(LineIndex+1 == LineRange.Min && LineIndex+1 == LineRange.Max) - { - NormalizedColumnRange = Range1S64(Editor->EditState.Cursor - ColumnRange.Min, Editor->EditState.Mark - ColumnRange.Min); - } - else if(LineIndex+1 == LineRange.Min) - { - NormalizedColumnRange = Range1S64(Min(Editor->EditState.Mark, Editor->EditState.Cursor) - ColumnRange.Min, DimOfRange(ColumnRange)); - } - else if(LineIndex+1 == LineRange.Max) - { - NormalizedColumnRange = Range1S64(0, Max(Editor->EditState.Mark, Editor->EditState.Cursor) - ColumnRange.Min); - } - - string Line = Substring(Editor->Text.String, ColumnRange); - range1_s64 ColumnOffsetRange = Range1S64(UTF8OffsetFromIndex(Line, NormalizedColumnRange.Min), + { + text_range Selection = TextRange(CursorTextP, MarkTextP); + range1_s64 LineRange = Range1S64(Selection.Min.Line, Selection.Max.Line); + for(s64 LineIndex = LineStart; LineIndex < LineEnd; LineIndex += 1) + { + if(Contains(LineRange, LineIndex + 1)) + { + range1_s64 ColumnRange = Editor->Lines.Ranges[LineIndex]; + range1_s64 NormalizedColumnRange = Range1S64(0, DimOfRange(ColumnRange)); + if(LineIndex+1 == LineRange.Min && LineIndex+1 == LineRange.Max) + { + NormalizedColumnRange = Range1S64(Editor->EditState.Cursor - ColumnRange.Min, Editor->EditState.Mark - ColumnRange.Min); + } + else if(LineIndex+1 == LineRange.Min) + { + NormalizedColumnRange = Range1S64(Min(Editor->EditState.Mark, Editor->EditState.Cursor) - ColumnRange.Min, DimOfRange(ColumnRange)); + } + else if(LineIndex+1 == LineRange.Max) + { + NormalizedColumnRange = Range1S64(0, Max(Editor->EditState.Mark, Editor->EditState.Cursor) - ColumnRange.Min); + } + + string Line = Substring(Editor->Text.String, ColumnRange); + range1_s64 ColumnOffsetRange = Range1S64(UTF8OffsetFromIndex(Line, NormalizedColumnRange.Min), UTF8OffsetFromIndex(Line, NormalizedColumnRange.Max)); - - r32 LineY = LineIndex*LineHeight; - v4_r32 LineHighlightColor = ColorFromHex(0x66B3CC4C); - range2_r32 LineHighlightBox = Range2R32(Box->Rect.Min+V2(ColumnOffsetRange.Min*GlyphAdvance, LineY), - Box->Rect.Min+V2(ColumnOffsetRange.Max*GlyphAdvance, LineY+LineHeight)); - PushQuad(Group, LineHighlightBox, LineHighlightColor, LineHighlightColor, LineHighlightColor, LineHighlightColor, 4, 1.4, 0); - } + + r32 LineY = LineIndex*LineHeight; + v4_r32 LineHighlightColor = ColorFromHex(0x66B3CC4C); + range2_r32 LineHighlightBox = Range2R32(Box->Rect.Min+V2R32(ColumnOffsetRange.Min*GlyphDim.x, LineY), + Box->Rect.Min+V2R32(ColumnOffsetRange.Max*GlyphDim.x, LineY+LineHeight)); + PushQuad(Group, LineHighlightBox, LineHighlightColor, LineHighlightColor, LineHighlightColor, LineHighlightColor, 4, 1.4, 0); + } + } + } + + //- sixten: render cursor + { + s64 LineIndex = CursorTextP.Line-1; + string Line = Substring(Editor->Text.String, Editor->Lines.Ranges[LineIndex]); + s64 ColumnIndex = CursorTextP.Column-1; + s64 ColumnOffset = UTF8OffsetFromIndex(Line, ColumnIndex); + + v2_r32 TargetCursorP = V2R32(ColumnOffset, LineIndex); + v2_r32 CursorP = V2R32(AC_AnimateValueF(TargetCursorP.x, TargetCursorP.x, 0.1, "Workspace Text Editor Cursor X %p", Editor), + AC_AnimateValueF(TargetCursorP.y, TargetCursorP.y, 0.1, "Workspace Text Editor Cursor Y %p", Editor)); + + v2_r32 CursorDim = V2R32(LineHeight/16, LineHeight); + range2_r32 CursorRect = Range2R32(Box->Rect.Min+CursorP*GlyphDim, Box->Rect.Min+CursorP*GlyphDim+CursorDim); + v4_r32 CursorColor = SetAlpha(ColorFromHex(0x10FF20FF), UI_Blink()); + + PushQuad(Group, CursorRect, CursorColor, CursorColor, CursorColor, CursorColor, 2, 0.4, 0); + } + ReleaseScratch(Scratch); +} + +static UI_CUSTOM_DRAW_CALLBACK(W_TextEditorLinesBarDrawCallback) +{ + workspace_view_text_editor *Editor = (workspace_view_text_editor *)Data; + + //- sixten: calculate dimensions + ui_box *Parent = Box->Parent; + v2_r32 ParentDim = DimOfRange(Parent->Rect); + + r32 FontSize = Editor->FontSize; + r32 LineHeight = FontSize*1.25f; // + 4.0f + + s64 LineStart = Floor(-Parent->Offset.y/LineHeight); + s64 LineEnd = Min(Editor->Lines.Count, (s64)Floor((ParentDim.y-Parent->Offset.y)/LineHeight)+1); + + s64 LineNumberCount = (s64)(Log(Editor->Lines.Count)/Log(10))+1; + + for(s64 Line = LineStart; Line < LineEnd; Line += 1) + { + PushTextF(Group, Atlas, Font_Monospace, Box->Rect.Min+V2R32(0, Line*LineHeight), Editor->FontSize, Color_Grey, " %*i", LineNumberCount, Line+1); + } +} + + +//////////////////////////////// +//~ sixten: Workspace Text Editor Builder Functions + +static void W_BuildTextEditorInfoBar(workspace_view_text_editor *Editor) +{ + UI_SetNextLayoutAxis(Axis2_X); + UI_WidthFill UI_Height(UI_Em(1.75f, 1)) UI_Parent(UI_MakeBoxF(UI_BoxFlag_DrawDropShadow, "")) UI_Padding(UI_Em(1, 1)) + { + UI_Width(UI_TextContent(0, 1)) + { + UI_Font(Font_Icons) UI_LabelF("%U", FontIcon_Attention); + UI_Spacer(UI_Em(0.5f, 1)); + UI_LabelF("%i", Editor->Compiled.Messages.Count); } } - - //- sixten: render cursor - { - s64 LineIndex = CursorTextP.Line-1; - string Line = Substring(Editor->Text.String, Editor->Lines.Ranges[LineIndex]); - s64 ColumnIndex = CursorTextP.Column-1; - s64 ColumnOffset = UTF8OffsetFromIndex(Line, ColumnIndex); - - v2 TargetCursorP = Box->Rect.Min+V2(ColumnOffset*GlyphAdvance, LineIndex*LineHeight); - v2 CursorP = V2(AC_AnimateValueF(TargetCursorP.x, TargetCursorP.x, 0.1, "Workspace Text Editor Cursor X %p", Editor), - AC_AnimateValueF(TargetCursorP.y, TargetCursorP.y, 0.1, "Workspace Text Editor Cursor Y %p", Editor)); - v2 CursorDim = V2(2, LineHeight); - range2_r32 CursorRect = Range2R32(CursorP, CursorP+CursorDim); - v4 CursorColor = ColorFromHex(0x10FF20FF); - PushQuad(Group, CursorRect, CursorColor, CursorColor, CursorColor, CursorColor, 2, 0.4, 0); - } +} + +static void W_BuildTextEditorErrorList(workspace_view_text_editor *Editor) +{ + r32 TargetFooterHeightEm = 2.25f*Min(Editor->Compiled.Messages.Count, 10LL); + UI_Size(UI_Percent(1, 0), UI_Em(AC_AnimateValueF(TargetFooterHeightEm, TargetFooterHeightEm, 0.3, "Error Lister %p", Editor), 1)) UI_Column() UI_Height(UI_TextContent(0, 1)) + { + s64 Index = 0; + for(scene2_message *Message = Editor->Compiled.Messages.First; Message != 0; Message = Message->Next, Index += 1) + { + UI_SetNextHeight(UI_ChildrenSum(1, 1)); + UI_SetNextLayoutAxis(Axis2_X); + UI_Parent(UI_MakeBoxF(0, "Editor Error Lister Container %p", Message)) UI_Padding(UI_Em(1, 1)) UI_Height(UI_Em(1.75f, 1)) + { + UI_SetNextBackgroundColor(SetAlpha(Theme_BorderColor, 0.8f)); + UI_SetNextCornerRadius(4); + UI_SetNextLayoutAxis(Axis2_X); + UI_SetNextHoverCursor(PlatformCursor_Hand); + ui_box *ContainerBox = UI_MakeBoxF(UI_BoxFlag_Clickable|UI_BoxFlag_DrawDropShadow|UI_BoxFlag_DrawBorder, "Container Box"); + + UI_Parent(ContainerBox) UI_Padding(UI_Em(1, 1)) UI_Width(UI_TextContent(0, 1)) + { + UI_Font(Font_Icons) UI_LabelF("%U", FontIcon_Attention); + UI_Spacer(UI_Em(0.5f, 1)); + // sixten(TODO): this is dumb, slow and downright stupid. + text_point Point = TextPointFromOffset(Editor->Text.String, Message->Token.Range.Min); + UI_LabelF("%i:%i", Point.Line, Point.Column); + UI_Spacer(UI_Em(0.5f, 1)); + UI_Label(Message->Message); + UI_Spacer(UI_Percent(1, 0)); + } + + ui_signal Signal = UI_SignalFromBox(ContainerBox); + if(Signal.Hovering) + { + UI_TooltipLabel(StrLit("Goto in source"), UI_MouseP()); + // sixten(TODO): ACTUALLY GO TO THE SOURCE LOCATION + } + } + UI_Spacer(UI_Em(0.5, 1)); + } + } } static void W_BuildTextEditor(workspace_view *View) @@ -489,9 +519,9 @@ static void W_BuildTextEditor(workspace_view *View) //- sixten: calculate dimensions r32 FontSize = Editor->FontSize; - r32 LineHeight = FontSize + 4.0f; + r32 LineHeight = FontSize*1.25f; // + 4.0f - glyph *Glyph = GetGlyph(UI_GlyphAtlas(), Font_Monospace, 'A', FontSize, 0); + glyph *Glyph = F_GlyphFromAtlas(UI_GlyphAtlas(), Font_Monospace, 'A', FontSize, 0); r32 GlyphAdvance = Glyph->Advance; s64 LineCount = Editor->Lines.Count; @@ -503,6 +533,10 @@ static void W_BuildTextEditor(workspace_view *View) v2_r32 TextEditorDim = V2R32((MaxLineCount+LineNumberCount+2)*GlyphAdvance, (LineCount+1)*LineHeight); v2_r32 VisibleRegionDim; // sixten(NOTE): This is set further down + //- sixten: animated offset + AC_AnimateValueDirect(Editor->Offset.x, 0.3f, &Editor->AnimatedOffset.x); + AC_AnimateValueDirect(Editor->Offset.y, 0.3f, &Editor->AnimatedOffset.y); + b32 CursorHasBeenModified = false; //- sixten: layout editor @@ -516,9 +550,7 @@ static void W_BuildTextEditor(workspace_view *View) UI_Row(0, StrLit("Scroll Region")) // contains lines bar & text editor { v2_r32 ScrollRegionDim = DimOfRange(UI_TopParent()->Rect); - - v2_r32 AnimatedOffset = V2R32(AC_AnimateValueF(Editor->Offset.x, Editor->Offset.x, 0.3f, "%p Offset X", View), - AC_AnimateValueF(Editor->Offset.y, Editor->Offset.y, 0.3f, "%p Offset Y", View)); + v2_r32 AnimatedOffset = Editor->AnimatedOffset; // sixten(NOTE): We put the lines bar & text editor in containers to be able to easily offset them. UI_SetNextBackgroundColor(ColorFromHex(0x10203080)); @@ -536,6 +568,7 @@ static void W_BuildTextEditor(workspace_view *View) ui_box *EditorContainerBox = UI_TopParent(); VisibleRegionDim = DimOfRange(EditorContainerBox->Rect); ui_signal EditorContainerSignal = UI_SignalFromBox(EditorContainerBox); + //- sixten: text editor scrolling if(AreEqual(UI_HotKey(), EditorContainerBox->Key)) { @@ -557,7 +590,7 @@ static void W_BuildTextEditor(workspace_view *View) if(EditorContainerSignal.Dragging) { //- sixten: translate mouse position to text point - v2 MouseOffset = EditorContainerSignal.MouseP - TextEditorBox->Rect.Min; + v2_r32 MouseOffset = EditorContainerSignal.MouseP - TextEditorBox->Rect.Min; s64 LineIndex = Clamp((s64)(MouseOffset.y / LineHeight), 0, Editor->Lines.Count); string Line = Substring(Editor->Text.String, Editor->Lines.Ranges[LineIndex]); s64 ColumnOffset = (s64)(MouseOffset.x / GlyphAdvance); @@ -685,6 +718,7 @@ static void W_BuildTextEditor(workspace_view *View) { Editor->EditState.Mark = 0; Editor->EditState.Cursor = Editor->Text.String.Count; + CursorHasBeenModified = true; } //- sixten: keyboard input -> text op @@ -725,25 +759,15 @@ static void W_BuildTextEditor(workspace_view *View) //- sixten: auto close bracket if(Event->Codepoint == '{') { - platform_event FakeEvent = {}; - FakeEvent.Codepoint = '}'; - FakeEvent.Type = PlatformEvent_Text; - CursorHasBeenModified |= W_ProcessTextEditorEvent(Editor, &FakeEvent); - FakeEvent.Key = Key_Left;; - FakeEvent.Type = PlatformEvent_Press; - CursorHasBeenModified |= W_ProcessTextEditorEvent(Editor, &FakeEvent); + CursorHasBeenModified |= W_ProcessDigitalKeyEvent(Editor, PlatformEvent_Text, '}'); + CursorHasBeenModified |= W_ProcessDigitalKeyEvent(Editor, PlatformEvent_Press, Key_Left); } //- sixten: auto close string literal if(Event->Codepoint == '"') { - platform_event FakeEvent = {}; - FakeEvent.Codepoint = '"'; - FakeEvent.Type = PlatformEvent_Text; - CursorHasBeenModified |= W_ProcessTextEditorEvent(Editor, &FakeEvent); - FakeEvent.Key = Key_Left;; - FakeEvent.Type = PlatformEvent_Press; - CursorHasBeenModified |= W_ProcessTextEditorEvent(Editor, &FakeEvent); + CursorHasBeenModified |= W_ProcessDigitalKeyEvent(Editor, PlatformEvent_Text, '"'); + CursorHasBeenModified |= W_ProcessDigitalKeyEvent(Editor, PlatformEvent_Press, Key_Left); } //- sixten: default event @@ -754,15 +778,9 @@ static void W_BuildTextEditor(workspace_view *View) } //- sixten: apply indent + for(s64 IndentIndex = 0; IndentIndex < Indent; IndentIndex += 1) { - platform_event FakeTab = {}; - FakeTab.Codepoint = '\t'; - FakeTab.Type = PlatformEvent_Text; - - for(s64 IndentIndex = 0; IndentIndex < Indent; IndentIndex += 1) - { - CursorHasBeenModified |= W_ProcessTextEditorEvent(Editor, &FakeTab); - } + CursorHasBeenModified |= W_ProcessDigitalKeyEvent(Editor, PlatformEvent_Text, '\t'); } } } @@ -776,7 +794,7 @@ static void W_BuildTextEditor(workspace_view *View) s64 ColumnIndex = Point.Column-1; s64 ColumnOffset = UTF8OffsetFromIndex(Line, ColumnIndex); - v2 CursorP = V2(ColumnOffset*GlyphAdvance, LineIndex*LineHeight); + v2_r32 CursorP = V2R32(ColumnOffset*GlyphAdvance, LineIndex*LineHeight); if(CursorP.y < Editor->Offset.y) { @@ -805,6 +823,7 @@ static void W_BuildTextEditor(workspace_view *View) Editor->LastTextPoint.Line = Point.Line; Editor->LastTextPoint.Column = Max(Editor->LastTextPoint.Column, Point.Column); } + UI_ResetBlink(); } } } \ No newline at end of file diff --git a/code/vn_workspace_text_editor.h b/code/vn_workspace_text_editor.h index b1638fc..08aa06f 100644 --- a/code/vn_workspace_text_editor.h +++ b/code/vn_workspace_text_editor.h @@ -52,7 +52,7 @@ struct workspace_view_text_editor token_array Tokens; range1_s64_array Lines; s64 MaxLineCount; - compiled_scene Compiled; + compiled_scene2 Compiled; // sixten: text being edited string FileName; @@ -72,7 +72,8 @@ struct workspace_view_text_editor history_node *SavePoint; // sixten: ui building & rendering - v2 Offset; + v2_r32 Offset; + v2_r32 AnimatedOffset; }; //////////////////////////////// @@ -82,26 +83,37 @@ static mutable_string MutableStringAllocate(u64 Size); static void MutableStringRelease(mutable_string *String); static void MutableStringReplaceRange(mutable_string *String, string ReplaceString, range1_s64 Range); + //////////////////////////////// //~ sixten: History & Undo Functions static history_entry HistoryEntry(arena *Arena, string ReplaceString, range1_s64 Range); static void AppendToHistory(arena *Arena, history_list *List, history_entry Forward, history_entry Backward); + //////////////////////////////// //~ sixten: Workspace Text Editing Functions static workspace_text_data W_TextDataFromString(arena *Arena, string Text); static void W_TextEditorApplyChanges(workspace_view_text_editor *Editor); static void W_SaveTextEditorToFile(workspace_view_text_editor *Editor); +static b32 W_ProcessTextEditorEvent(workspace_view_text_editor *Editor, platform_event *Event); +static b32 W_ProcessDigitalKeyEvent(workspace_view_text_editor *Editor, platform_event_type Type, u32 Data); + + +//////////////////////////////// +//~ sixten: Workspace Text Editor Draw Callbacks + +static UI_CUSTOM_DRAW_CALLBACK(W_TextEditorDrawCallback); +static UI_CUSTOM_DRAW_CALLBACK(W_TextEditorLinesBarDrawCallback); + //////////////////////////////// //~ sixten: Workspace Text Editor Builder Functions -static UI_CUSTOM_DRAW_CALLBACK(W_TextEditorDrawCallback); - -static b32 W_ProcessTextEditorEvent(workspace_view_text_editor *Editor, platform_event *Event); static void W_BuildTextEditorInfoBar(workspace_view_text_editor *Editor); +static void W_BuildTextEditorErrorList(workspace_view_text_editor *Editor); static void W_BuildTextEditor(workspace_view *View); + #endif //VN_WORKSPACE_TEXT_EDITOR_H diff --git a/code/vn_workspace_view.cpp b/code/vn_workspace_view.cpp index 067de00..472e9e1 100644 --- a/code/vn_workspace_view.cpp +++ b/code/vn_workspace_view.cpp @@ -1,7 +1,7 @@ //- sixten: Views inline workspace_view *W_CreateNewView(workspace_view_kind Kind, workspace_panel *Parent) { - arena *Arena = ArenaAlloc(Kilobytes(4), true); + arena *Arena = ArenaAlloc(Kilobytes(4), true, "Workspace View %i", Kind); workspace_view *View = PushStruct(Arena, workspace_view); View->Arena = Arena; View->Kind = Kind; @@ -18,7 +18,7 @@ inline workspace_view *W_CreateNewView(workspace_view_kind Kind, workspace_panel { workspace_view_file_lister *Lister = PushStruct(View->Arena, workspace_view_file_lister); View->Data = Lister; - Lister->Path = StrLit("data"); + Lister->Path = PushString(View->Arena, StrLit("data")); Lister->SelectedItem = -1; } break; @@ -28,9 +28,9 @@ inline workspace_view *W_CreateNewView(workspace_view_kind Kind, workspace_panel View->Data = PushStruct(View->Arena, workspace_view_text_editor); workspace_view_text_editor *Editor = (workspace_view_text_editor *)View->Data; - Editor->ProcessingArena = ArenaAlloc(Gigabytes(1)); + Editor->ProcessingArena = ArenaAlloc(Gigabytes(1), false, "Workspace View Text Editor Processing Arena"); Editor->Text = MutableStringAllocate(Gigabytes(1)); - Editor->HistoryArena = ArenaAlloc(Gigabytes(1)); + Editor->HistoryArena = ArenaAlloc(Gigabytes(1), false, "Workspace View Text Editor History Arena"); SenDLLInit(&Editor->History.Sentinel); Editor->History.At = &Editor->History.Sentinel; @@ -40,7 +40,7 @@ inline workspace_view *W_CreateNewView(workspace_view_kind Kind, workspace_panel Editor->Tokens = TextData.Tokens; Editor->Lines = TextData.Lines; - Editor->FontSize = 15.0f; + Editor->FontSize = 14.0f; } break; case W_ViewKind_NavEditor: @@ -53,10 +53,6 @@ inline workspace_view *W_CreateNewView(workspace_view_kind Kind, workspace_panel View->Data = PushStruct(View->Arena, workspace_view_image_viewer); workspace_view_image_viewer *Viewer = (workspace_view_image_viewer *)View->Data; Viewer->Scale = 1.0f; - //- sixten(TODO): write an image viewer - // beign with loading the image from the file lister load thingy - // show it on build - // release the handle when done (and add a way to remove texture ig) } break; case W_ViewKind_Error: @@ -95,6 +91,12 @@ inline void W_DestroyView(workspace_view *View) GlobalRenderCommands->DeallocateTexture(Viewer->Texture); } break; + case W_ViewKind_BytecodeViewer: + { + //workspace_view_bytecode_viewer *Viewer = (workspace_view_bytecode_viewer *)View->Data; + + } break; + default: break; } @@ -189,7 +191,7 @@ static void W_BuildSettingsTabButton(workspace_view_settings *Settings, char *Na { b32 IsSelected = (Settings->Category == Category); - v4 Color = LinearBlend(Theme_TextColor, Theme_HighlightBorderColor, AC_AnimateValueF(IsSelected, IsSelected, 0.3, "Workspace Settings %s %p", Name, Settings)); + v4_r32 Color = LinearBlend(Theme_TextColor, Theme_HighlightBorderColor, AC_AnimateValueF(IsSelected, IsSelected, 0.3, "Workspace Settings %s %p", Name, Settings)); UI_SetNextFont(Font_Bold); UI_SetNextHeight(UI_TextContent(0, 1)); @@ -246,7 +248,7 @@ static b32 UI_DropdownSelection(char **Alternatives, s32 AlternativeCount, b32 * { UI_Tooltip { - UI_SetNextFixedP(V2(DropdownBox->Rect.Min.x, DropdownBox->Rect.Max.y)); + UI_SetNextFixedP(V2R32(DropdownBox->Rect.Min.x, DropdownBox->Rect.Max.y)); UI_SetNextCornerRadius(4); UI_SetNextWidth(UI_Pixels(200, 1)); UI_SetNextHeight(UI_ChildrenSum(OpenTransition, 1)); @@ -294,12 +296,12 @@ UI_CUSTOM_DRAW_CALLBACK(W_ImageViewerUICallback) v2_r32 ImageDim = ConvertV2ToR32(DimFromTexture(Viewer->Texture)); v2_r32 ScaleImageDim = ImageDim*Viewer->Scale; - v4 Color = Color_White; + v4_r32 Color = Color_White; range2_r32 Dest; Dest.Min = (Box->Rect.Max+Box->Rect.Min)*0.5-ScaleImageDim*0.5+Viewer->Offset*Viewer->Scale; Dest.Max = Dest.Min+ScaleImageDim; range2_r32 Source = Range2R32(V2R32(0, 0), ImageDim); - PushTexturedQuad(Group, Dest, Source, Color, Color, Color, Color, 0, 0, 0, Viewer->Texture); + PushTexturedQuad(Group, Dest, Source, Color, Color, Color, Color, 0, 0, 0, 0, 0, 0, Viewer->Texture); } static void W_BuildImageViewer(workspace_view *View) @@ -354,6 +356,59 @@ static void W_BuildImageViewer(workspace_view *View) } } +static void W_BuildBytecodeViewer(workspace_view *View) +{ + scene_view *SceneView = SV_GetState(); + compiled_scene2 *Compiled = &SceneView->Compiled; + scene2_runtime *Runtime = &SceneView->Runtime; + + v4_r32 Colors[] = + { + ColorFromHex(0xECEE8180), ColorFromHex(0x8DDFCB80), ColorFromHex(0x82A0D880), ColorFromHex(0xEDB7ED80) + }; + + persist r32 ScrollY = 0; + + { + UI_Row() UI_Width(UI_Percent(0.5, 1)) + { + UI_WidthFill UI_Column() UI_Font(Font_Monospace) + { + for(u64 InstructionIndex = 0; InstructionIndex < Compiled->InstructionCount; InstructionIndex += 1) UI_Height(UI_Em(1.5, 1)) + { + UI_WidthFill UI_BackgroundColor(Darken(Theme_BackgroundColor, 1+InstructionIndex%2)) UI_Row(UI_BoxFlag_DrawBackground) + { + scene2_instruction *Instruction = Compiled->Instructions + InstructionIndex; + UI_Font(Font_Icons) UI_TextColor(Color_Yellow) + UI_Width(UI_Em(2.0f, 1)) UI_LabelF("%U", (InstructionIndex == Runtime->InstructionPointer) ? FontIcon_RightDir : 0); + UI_Width(UI_Em(6.0f, 1)) UI_LabelF("%04x", InstructionIndex); + UI_Width(UI_TextContent(1, 1)) UI_LabelF("%S#%i", S2_InstructionInfoLookup[Instruction->Opcode], InstructionIndex); + UI_Spacer(UI_Percent(1, 0)); + } + } + } + + UI_WidthFill UI_Column() + { + u64 Index = 0; + for(scene2_proc_node *Node = Compiled->ProcList.First; Node != 0; Node = Node->Next, Index += 1) + { + scene2_proc_info *Info = &Node->Info; + UI_SetNextHeight(UI_Em(1.5f*(Info->InstructionEnd-Info->InstructionBegin), 1)); + v4_r32 Color = Colors[Index%ArrayCount(Colors)]; + UI_SetNextBackgroundColor(Color); + ui_box *Box = UI_MakeBoxF(UI_BoxFlag_Clickable| + UI_BoxFlag_DrawText| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawBackground| + UI_BoxFlag_HotAnimation, "%S", Node->Info.Name); + UI_SignalFromBox(Box); + } + } + } + } +} + static void W_BuildSceneView(workspace_view *View) { workspace *Workspace = W_GetState(); @@ -505,7 +560,12 @@ static void W_BuildView(workspace_view *View) W_BuildImageViewer(View); } break; - case W_ViewKind_TextEditor: + case W_ViewKind_BytecodeViewer: + { + W_BuildBytecodeViewer(View); + } break; + + case W_ViewKind_TextEditor: { W_BuildTextEditor(View); } break; @@ -523,7 +583,7 @@ static void W_BuildView(workspace_view *View) workspace_file_lister_action Action = W_BuildFileLister(View); if(Action.HasRequestedFile) { - workspace_file_lister_action *ActionOnDataArena = W_FileListerActionCopy(W_GetState()->CommandDataArena, &Action); + workspace_file_lister_action *ActionOnDataArena = W_FileListerActionCopy(W_GetState()->CommandArena, &Action); W_IssueCommand(W_Command_OpenFile, PointerToU64(ActionOnDataArena)); W_IssueCommand(W_Command_CloseView, PointerToU64(View)); diff --git a/code/vn_workspace_view.h b/code/vn_workspace_view.h index 753d68d..cde3880 100644 --- a/code/vn_workspace_view.h +++ b/code/vn_workspace_view.h @@ -28,7 +28,9 @@ enum workspace_view_kind W_ViewKind_SceneView, W_ViewKind_NavEditor, W_ViewKind_ImageViewer, - W_ViewKind_Error, + W_ViewKind_BytecodeViewer, + //W_ViewKind_MemoryInspector, + W_ViewKind_Error, }; struct workspace_view_error @@ -60,6 +62,11 @@ struct workspace_view_image_viewer v2_r32 Offset; }; +struct workspace_view_bytecode_viewer +{ + +}; + //////////////////////////////// //~ sixten: Workspace View Functions diff --git a/code/win32__main.rdbg b/code/win32__main.rdbg index fc9887638e0192bb77b2cb6d3193d96ab3c3346b..cb78ea4fa102b4ec0458e0780da814aa3203bd8f 100644 GIT binary patch literal 739 zcma))K}!QM5QS4g6!Gj$te{{;_fT&=c+i4(1-%49noQf^ZW5BXYyZ77-7al0)dsT3 z&U|^9H@mOnrY_7TfjFU!A`cYQ+zw$ig4vLpnwQq zHH1QW-$&qMM50|TDzG4wt14-AB<4CV@*5mvz%(~O3ok=j@R%kd`e1CD7W2yt>^#_6 zxl!JZtEmyuO9i4f&`^zc88tMz2B)S3QJR=q-&Yx4xd7OP03s$Vaz?sm8LqaJ`CFla z%7q1SJ3hg(dqVHYvJf5nvm delta 188 zcmaFN`jmNsB`X^P1B2w`gN$PArI~uk1qEtAwy=15YF=tlVo7RBOj%w$P$DDWsEh86KUSe5%YD#8Fe$nK+jG92fgN&lAAnkG>?PlefdB#TZxrv#1ATgi~49q~x z3BEventList = &State->EventList; - v2 NewMouseP = Win32_GetMouseP(Window); - v2 OldMouseP = Input->MouseP; + v2_r32 NewMouseP = Win32_GetMouseP(Window); + v2_r32 OldMouseP = Input->MouseP; Input->dMouseP = NewMouseP - OldMouseP; Input->MouseP = NewMouseP; @@ -766,7 +768,7 @@ int WinMain(HINSTANCE Instance, HINSTANCE PreviousInstance, LPSTR CommandLine, i QueryPerformanceFrequency(&FrequencyQuery); State->PerformanceFrequency = FrequencyQuery.QuadPart; - State->EventArena = ArenaAlloc(Gigabytes(1)); + State->EventArena = ArenaAlloc(Gigabytes(1), false, "Win32 Event Arena"); State->SleepIsGranular = (timeBeginPeriod(1) == TIMERR_NOERROR); } @@ -781,7 +783,7 @@ int WinMain(HINSTANCE Instance, HINSTANCE PreviousInstance, LPSTR CommandLine, i { HWND Window = CreateWindowEx(0, WindowClass.lpszClassName, - "vn - December 2023 Build", + "vn - January 2024 Build", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, diff --git a/config.vn b/config.vn index 05d0675..fc9139a 100644 --- a/config.vn +++ b/config.vn @@ -6,7 +6,7 @@ Platform Dev { RenderUIDebugRects = false; - RenderFPSCounter = false; + RenderFPSCounter = true; ListHotAndActive = false; ShowWelcomeMessage = false; } \ No newline at end of file diff --git a/data/fonts/fallback.ttf b/data/fonts/fallback.ttf new file mode 100644 index 0000000000000000000000000000000000000000..46a0712ae6e2b2195ce933b162dbe7756338fef5 GIT binary patch literal 806504 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 z z+DOzjuMJ_3Ql>0`LviJeLk%W8-lCL;$|a)-kVjMV&3N0cC0pz;j2q;nZ^> z-DAN?EDAFgLXtMKftA2@)21Wnc;GZ3OrK1|!qkSTC2Ao=G~$ScOEd`)4O0`QhNuCT z>c~xX&}b2b{04xQ25JILfR4aE;0$09QJ_vyk;(wkKvN(Q!1;S30^uUSR|Has5GAQ7 z;tJ%cI0XdX>2t0Dd|2oU~!#uop8=vrQU8#M(IfdN1=-?l}~ldD!f_>+E115JRA zz<6K1_bp79S^+i zM~ViAZ2+Z#CO}6(+J?a<3{PPQ6NdQ0V0#^unIWWmQ(!i*7m#j2aGPz?nxIVpjyQsl z19_JVG(ZGx;a<5iAYT@lt5!|Oy$JwEJ`>WM3AxP#qXCc}k}+xNocmO`r@}ou#B5wQ z0~%Ix?ZE1Y;#egi*GYtlAecZHCrkj0KT0zVW;V<$n3*uCFf&j(`8J2|4d)#z_OCd; z;_QkmDsHa0x1wbi?*x;`6Qix<<3mJwa_fa^d2@x@lfhn^bfZZJnKas@1)>YJH*U8# zj@jJKNz0iu$fSO(%@%{acC&UAsG|k2V%q{I1l$SCP}r7$Nr4$UE)%n#+GSs= zNz3g4WdgegL}c59W?za1exo1;YQ;8?g@s2)U^Qz;OSGjbR_T_+s@-B(`5R!#r{~eV zbq7|aTCqx1!-`do)vNh3+&7}b3FVSc!#kQ`-I%0`dGC!?77WEGDc*xR$8jgFyrKbb z&?1I4aP8|%4U(L$7cGJ_n6+73ml_$mL2#V#8||XnT2z%2?;Vxe7eGB&P*VmVKseg=BbgpYMt2s zKoU*M#MtnE{e1s*8y+q>@pCO~&?4To&M(1LPTsiv5*k3xvcJCrdxk2-#qQvhLep8A=9dBhI=QijncWUOlzY|Yoko7ZggEUEwk36TIv*&fG)jx z-O6oNRNzGP(_(zQ2h=cYbG1O&|B()szabq4cQCKGm5)OKS!(i#$5s;RZb;K2z)$SmQ(LrJDTM3Ohj{_AciVrGNit_viS{KpTj4F8Y8 z1fm-}lz|7y#?b6=<}ushhz3E2zI zJ;S}!y$ok}Jr{nj54y{``yx~;O2qD;G2kE>JB?1V1YVu*bx#LR@!(-R_5gjy!cn0T z(Zg#F-;;5E(GHyNa~kL9+`;)_xv)PbS?-ll>Gh$kL+%gUN$&m>htsl~QZiiqu&1UL zZ!6kj74;9Vf6lt$_D9?;vD;__b{WmaE~fR^iSZ*&q!!%DTk=+7BTl`mj+3d9AkBH; zX)X3QUB^js6>#!tG|m9sz=tW~^&!0R6`U?smFgk3F7Ue)GW`O(e-2^y(^#VHu?z-;r?!!3EDHx}YRRO=T$a5o{u$6?}QOu`}rxtf*z!e-!{;>)|}s zR@j%d0c(RZQJr+`pxA(Q<<&9h`Bo{YEY512)i-N#)>d}~cO%p-flgRKssIy-+SCds z<_*TW-8qn@Jg5qyaNZd^Hsc=|pcoTcy9-_>jK^6l0&I*C!0JGd`gYQP*ybZcc-C%m)tns1p6k_Z++imU}`xbk^ z&S9_2ub4i_j~ywccr~kp_b!(L(5XEl?~+i$lH=ABf)-%lA?_gD(u+5*A&lf zu{$Oa=XLMK|JtdCnl?6x z-Oeh?4Ux+0^DD6HL-W{vluH$~$3Zwra+xTL9qa=kk*d^-&!-?hfCr&I zx1!(KM3x^d_Z7;fDDOs!FnDJ=&l6DUXILIyij6}(?Ta&{Qz!y^nDGCJ_#CRlx{5uS z1z(48mid^ai+YsKUMb%y-=g#V3X=3g&DB{nYRG5M5v|ZN14SrmO%+l(#&u{J& z`5$Zy??XM=V(|<6g4e?7dR@g}UWYBr`a`KD%0ps1p-pOQRdvFuY(J#}O8g#9`jh`R zfV3XUb#*A}_#g59D0u;+6G_MC3Os{Lr3 zEZ7QXh$O+j7wiY)4K*73JtyKMyj19bg*aF4EMLc0V9Yy>ALhe&Pr6K(#ZeK>TGM%D zx-uST4Hl(lI6t)~PDhNwC?OT+$bFC0ic?`|{|acOsQK=P?u+gt809SvE(E@OFP9_R01HgaKRH9(C zqN2-)LXQv?w-SYGL=mtr1^=ZHf7xiF@_C3V!miRDqAEp+s>R@NWZ2cXPZWI-|HrZ% zQS3URy5Q@B9z+cgM+2nQXbn-5)kH1e-a3>hzB&F6Bm863s=rbJ6>mI}HG@ zb6*h6gS_S;o_X*y?+MZT8UUW>BX9FB6D_a;Q2@$j!4lv&@RDd@6<`1We+w@XEph<$ zfiVE`wFv1ghTY-=L?5>$T5^PF8T>CtzL&d*R^qyf6MYW(td1aBbAo6su4@r?-8KBr z&T~YY;m?&xw8c)ewJ6ax@V5Oa4)?uJl(CO!2h!bnhG=&f(Ki!`_N*e>yNPJO57EKx zM2F%3$S|U#C4l8b#~{~lI}m+`>j{PECDP4IpbWpW#F z-$tCbPsju4fjYn_0RHdX!r2Ce0F>9=X#o7+eMWRI6lf28PIMpX-+xZ@%O0G8;0;U# z5dXsgM2}*L9#;Zx$pfPR|#Mf@C5(d4fftmfr-FQ0O4|10Qv!|fJ?;k z6aiWTDZnA%1+l!LKo4Lsa0198mM;jX1Aqq~gz@PBz}*M#1vH=%fOrca-U5i%_ZnV=V*Xc&IqMM%MBIT06O8-dQ^bl|iG_3{78V8EAXXgtE`hj8Adc{T#3B%1 zNrW#6zDhw(rF#IkiIr&xY$H~-D9{)f2W$tP5G#i?%7MRfp97DGl`jPh0>D!RU!V`L zhgd})U?OmySfvO6`Kk1PSmjv2MXZVfv;jk#0@!6Ak<5I=~PB`H2P}ap1cV(rERJSnDD{O91J&1}|-b0Pr7= zc;iv(i#B127s>t%YZY)2I>If7>GO$ z+ya27K~4Z^3>pROBsL_2*zkB_BYOb|Hxl7SX+R_}09Z+E40s*e13=p2kiT)q0q~lf z25bW^0hz=mAnu7N#3ok);D0jWn|un$A~q!ms0VfXRZNm5S!%#GzXB^*)C#f901R0(*Wc>?Jlu7`2dvBoc6$c;1KYP*xXP6 ze&>SMxkrGD0Q}D%Kx{#M9Ayr>C7%=fqz17S2)EK70DmhF5c_m44mf{7Y;_S#O~B9E zbHvsooejv(regrEn;ihcY=+zBTfj47F7W5d0|XIEzXm{7>F~Q1X>CRNU-bY+5ZjKt zY~Kf*0g%rf8nK;_+0OGgY8~NsMFT?s$YIx2{1acK^Gyw6dy;}@f5lZYPc({c$ZcQb2cM1MY zG~)c_F0luw&yP?JkM{vc>oLMTMz~)m0&{^?z!qY^&B8xetOK+r_WT5~7kK`A1F=k` z`}z{bjs6%tGzTW*vsgT^7+6Cby?w6v61Rk5h&Tqoe7apHZnPzys~j+dc*#)Ie2S+oOla_Z5d6x zl|sCAAprchX-_;Jam8OGp3nz_H3Aj_ka0W6wtY8X8~{7?|9JZ&z-{6mt^~FN;N?U3 z{SZ8K@CL$&cf1B5pNS}wL?=)QXbd1O=ue&mev**yq;ddcp40(ATAc?G?*jWS7m0Uk zNWA-E0BQCB?>%k+FNpWF13>`f((^p=UP!Yy^3ca0I7hs1FXH{`6Yn2Sd_W}7gZRJ_ z#0P=T!46;;@geXt1Tq>541@cy`^1NXw-J!T$UekJO(Z@#3_!ldEFnI&2Jvw^famdT zi6`SZc{%Y3r-)C)by6APlaaqEO^Hu!4j}%iu%CK}cuGD1d7A+~XTV?T0phc^5l>4b zjy^1(9|a(dMS}pOyEqAeY!^cYi!(8p&I8l|kjIZ*#FtnBgk7?Q_)_EtI*)&Xcs>~g zYyut-UlBokRruZO?&T>$X9{si$2h;IY< z*sz`WrcwanaB0NTkw!Y=PhSlnKJ;Vxmd3=lA+GHi#4~(}@8raHfyZ6Q!>*kG_}GIq z_rTvC@Ua(h?_UByCWqknP+MRjfV2*sB7PX|hsy!r^)TW*oJIUd2Vf8Ig!oao9qmK> z7{VWeT#ly#pA-M?2=I*fi4DY0A>65J#7{pZj{Yw{YX_nMgoD21XKxVyeiQNYm4I2q zFMy8=rGUu*c)oymFL@Kc97_DkG~(AT1IWkqq5$H!z6>}<{DuQ)2`mSY-c5wLSqA6^ ztRa4@2(Se>4%`A>68||5fO7kJ9dM5LZ4HP4k^$u7_IcuWAjdlmfz<%Q+(nqXC5Ycc z`uE}Iml4DtARiBq=0oJ|A?zQ*|04nr<`MXPtN@Vr6Ug?-A>cl7^r880$lLEo?>X$B z9|2wv{{wOV(Si7j#l-*eC;qpS_{(kp{JcB`fQMJ1#4~+}zpg|)3+cII0mu#~#0&BP z;xU)J24A8Hct%3ifl2_*2~=IcBNAFsAQ4yv+$W)TAz^g@Nx(J|_NF8pd4M3G9En`M zB)laSlE@7|c_apr$Qwfr2yo!82Bl62td5W z?gKALg!uv`fGA)Pu!ivc96QALP??j1d zBqI8dD770n1>69hktnSIK0p`{Nuq2DiSo!tWu#jf=~iwGBmzjk@?>BOaE?S3@KFWj zQU$WCvW7%e$S^V#xJ#ls;;jCFL=D{61Ygm}Bi@T5W)F$l$4SIqB~hmgiMn-2)B_Lo z>yv0Ol|;i^BpN#a*frxMT0kzXP)6}%NVGcwAY41RpJA9(8zzx@#geQ+@lJPtygj05lE8)g-1UKsR7JiK+eo+^0Sv@lhnO62SemA^`ZD z1|FxuecEy0FA~#{zv;-+^iw2K5H_VbFc$#dGc*AF&A{^v#61H%rxFkfGz10#;5T(A zkVRrL9rH~`!wG2aT50TKbkJs#|-XmLuMkh-W48^eN)~>;Z|@ zrAT}^m&6*#bKOJ|8w!!w=u2V~^1KP|o6nGNA@1~-B(|0#vF$R6?UPA-ok1c4^2=CF zV#iJrI~SAKb%ez3Vj-5dfZ#ULtV}ydJ9qfQMsn|27FYMdElU0Ds33 z=XVu=`2b{gqCT($I7i~71BeBt0*6SPQUJ*GR4M@X(@r1}SOr`paRxk|`5ZtzXA$n~ zYT!1BbI8}ZF#z)VJ^1~;2XKVM`C-6z;5ms45kNNp;V;}LanT#70!#*w)(@e;5CGvW z`2g^H=>UK{{Rlb!h`ju`4ag*MIR-$u%P5~K;P(o`Uxgg5)&UUzRq*!{`2OiOiEAZ* zJ^7%64JFXjW4vdB}pWKznn0gjVW0sK@zd=-z7Qt2rv zRkBE_iab}{O-dxfN0tJ>LnNN7A&zRz0mO}O7fRFs;1nsexmIG1%q!sg$l-f-J@Lc;EDY0PyWbuD6_9pOAR9XM`sp?w0JLxsOrS~mM zclH&?((Dknh=^zmASx;%i!v_gAZ~~Z3ZsaK3W$h`ipm-hkwH{MMMMS}#swHeL_kDD zWJu@z-Abb3^E~h8ANbaC>(;Gv_jAv^Ro!b13B4hEA0t4#`#|nK@YB}}?gNmw-)Iv0 z&n2M&#{-U%FvtT=kubOh%p;+3BMBETC1E(^9f9~<4mq3gywTvQC<)gf&924suIEV@ zcb0_lJ4u*u9SIZfBw@0Pgqs{B-24;?e;G)^tqA)zJm}ndXE^m|I7}-|?)!!`~x& zNtg#&9)thK$CL2HR1%(CMZ(hv`)Q=tBE)eqj+aa);hA+LEJeC3n?b^JCrEf6Y5W4@ zc>(c$5zl|AfrOVK^D9S4cy$j6uOl5-+eugh8P}OfSU(?ZC!qy0v>?nDg#RYwdTS^N zoBbsGV+26h|JY2zI|%<>ZJP#O1BXcX0Oud{AmPJaBz%mxemojH z3^oDW58Icps}Vr61hpi<1$T&vAsa_=f zgt-6o2tZtZLR?Nq!Ek`IKfM7U9%ta^mmMVh>LB6VVG_BIZs-?mUT5$V4ef zqP&kpbsmZMy0MsP1}8`~=zfGm4~{+SNX(9s=5FIf>qlaL zgx!!!;((_}9C(VvAsb1&$V1}LDI{LJhQv$aBwpGB3?&h^e6gtiFb}6@vlh|r!688b|LX@$a@duy$505vz5eq3E=*F;eOwI67Sze;tV|F0mwBI zGS5U9(6hw{CxL?`&O$oRx(`6EzvY7k0PeHR0B#SB1*<@s#D_*G*p8wKD5?@A`uM7m!0ph&U3eJ-FYB{(GoFwtJktDv3 z_`Hs|zdo15Rq(%h28nCN1BAC0e%CH1aoucyG+#dtK%N#axCP+(Z|F(fu#ChvkCFJ+ zS0rvK1qlBikZ}v*zXh^vNt3vB7>Vz~?LEl*el9pqB6MJJJD&65CK5jm1C*5=t4RFh zD2bmUtvKOe%Q?^rxzk%oqDqo@J4wO_ zlEi^vFG=zQlGKMu(x*u>WCA})MlVSjR?q|71eSmuB$@KSD*cG0icFF!50g~Qlhh>& zAWxTBBy~GaQXRrZA1?L4eSK<3>W8rV7lV-i;S30qG;j(@=zFEX3rQM+=MK3CATAd* zl5{cLFX=(jr94R^a!I<(MN*TOq~=v5jao+1l~8fM+g+ z+p~D)vv7MB@q2bYKpdVuOVYA@fH*9B1iS~}_FNLcZTUEW_`ZO!SL`F{=gv_rY ztk-ehswpI`UP02D(@p{CfK~ zaEPSMJ-~FZiKKr(#w{bj36kFF17-q*zZL1Tbva4zMghWl_Y6tzjRm_%dfyI)lC(_$ zkbBz%fOvdxA4%Jnko4hZl0JeQ9~~p<<6FQ}0J432iliNoc}FjRxbA@LsISrvJns|8 z@yXR-E?5V?AZaH7Jb!0DFdpFA&NbjLNuPSaKrkIF1KR+ex62Gt05a`b1a^QlNuMPF z%Hn6U0iOBUUXpej0sQVpys$0YH|$i0i))r+*Cvw*kobFQm=C5T|{5 zPzXkYc>v+;gY5q<23G^f^6%~797$i~f)QW_Kze;~h@>xZ|CjLle|&|EUHe!F^y2I7reV1t6S5a6g3fJG2?#x!>Tq-!uZG z-#074ZUDIt`#}#d7AyoGfiy|qCIQm>TZHlLMsSj(BT;}j9)a5tgnQ&PN#DWkJIMUq zT(Fa*qejpV+zDO-`$_uV40-{?`TLgv+>TiR+>RlvW02*z7hDbIfvw;yNhgwEG=SR) ze!lAFcpP!4Z;9BCaQ=fEU0QB>iXvHDD502KJJ43T~%T0RB$F?bL3PenR^F z1h=1V0WSlj9me$1X~=#Wa-N3UX~_Ar9l-5pxc!W0{EYC`+8gQ0m!kc(B z9c(6_LA&dMl$pc**_9Y2b;h#k^}hwaR|%;kRt%OgGm42FtCE;5M+o-AO(=F zQQQ+70pK2=Kyog^&09!v0@sscNG?D;i*SDtWG&iHa`8}rXO%1>xfE$s3b!)Er+gmC z74TQl2iylXgYzU;B26mq0f?CKLFcR5RP*KuGE$=#3!H4Ok^*5JI>NOB#{ z>*1$6{P);Sa&O4hCrxr+#J?ZXsz1VNs0RH2o;3in512;sz!hKvz&!)^kqmuF9z2j_ zjECfl5Z*AvdAJ`yhD%>2c?1L3E*}g=lH9a}$luV@~ybEG z0?AKICwbv`lAlC6K80t)79uZNN%9g8I7sr+FGya7YtJDqmKOrJJr6%GBK#F_d+8RE zVYio8E+F}}u3!_%ub(G*)gvUYzK7&B4uCXShdtH>$?Fl`8`!@I88^c3TV|3s;l54F zNPZj7e;e1J56PSH{LPJEF4#u$KNOH6dCMu1-$A;(0~xk%B>7#W<@@maKAr`8yu9rS zFbyExwrv6DNQMq1e}M2mK-zCdT(<8c`9nL%Cwa$Il6NBPPpu^HLY$y`$a|0%ds|5U zH;%u=J+N!Y2LzH2LcVXnVcdVD7+gp4cY{ejI-TV2asT%S>p1+Lc#357G4iRg;2g<6 z%>vk;)`MQ)1%P;*LHvI~I{bn-oJAPFA{~E4dY+p{@_$E@d>(0bejq^H&aVNurxo(I z&H!JLoGu0Mn?6Hw+tpwzDbx$>AcY$Pj*)`)Sm8e+MHdDWz*4Y>6u}5mU=mmcj*uey z!C0^WYy;;>ks3h@I75nD4DJK_Nm0B2*VL;?(Z2xpkzzoYh8_U-8}Lm0{*z+FGmO*0 zd-z6-1HgaAYv2SanFud)5_lQleiL3qHB|!mF)adkju|qUF9&N#v1Eelz-Cgc`CuM6 zO^R(CSOO3)yBRcqsbB^8f|M-Wm(>SM1FOJSq&Rv3$c1@w#fh+-ICes2*HEyF6t^DK z0X)Nfkd$m9#d`%QKKS+Hn!gd?njiNB1W*I;%mC6NfMV#qY?C@I4?k#bp*l*=C`rP)f#$mOJrwv#eu1u0jZB;}e7q+C0LlKs|P8V2UTVt#1E12q|AZ8xjRXD zOi+P?s71-nT(09pP6|A)4aa`+%ANAT>Uh|f{Bhuq&kOvZR&%fL)|I9|mbsT?a{ZFCf*E1T_F*KsQo7<4N^G9&Zb&{^6ts zf}{p#kQ(-b`2b-@x&p`&*+Od63g8~|0LTzW9CFRz2slS-o)I8Ed6l3axE$aad0R}5E;8r$))N+JVj&Ld#l3Ix{DmRmgbs=gMWUC%WYL{W8 zc7=Rhx0BipGS?(Yt<40lky>{fsr3jGYe3ZcRp2P8sW5U^U$noL^QeRR?eK}3)%3M-kD<}1J#Q*hG;3HDkpbV`=8mv7@ z>N@yahcMPv0))8^>Adb1FcTaCXGmQSKkMOVeJN-FkZJuCfViz+1Q6c(ZD1cb2JqY# zGeBCkAiS1I0BPC+d0P;t4G)uwHI3?9dQvyx+S}(y#aavX9h|>|d*0~^hJtYb_r0?a z;2H1W8Sm^T^r=fhw*cn=&V^-}@ho=%ezqsvZlU~MNPLp2AB)vKeTuplYYv45L z4FVVm_K@BPzea?EcZ>9yBS;V3P;cHqddo`ETc?xWhGTm!>9Z8lW1Ovb_8`401(uTD zy^r+Sb)@$iftU2YMWpvXO!~kI(g&xJK7{9lc9K4#2aq!gSz-f8A0JQp99++V-`p!m zpLYxC^QVCOz)8|45njPyFp~6z$4C#oPG8hQ`r@vnFF8v3vIV3shkGUNtwxw#AZIt+ zQ?rZob%<*UGWMtekg>-$aD?5>O>%IJ>?~U;KVBZI6 z(--O0Zz}2g$3ZVJ20)Jf+eqJlum>Q$214G!Gf6)LacKk>LB@*?k^W+YH|#pnU-A*@ zheOs8xaTsYMHAAZX%*?O*b8uPGyFB0|rAlH9@>*Wg=kqQDMxD6Aq5*6DP-N0ph|I*#1RkULz7!RFI7gIa3_o6pn? zGPmNRRW+?OjFRFqOUM!nSwhzebUvutd_Ki~gEc5@CZ7Ag?I3?p6!B$+01Zi*_87h~ z@QSP_GiRIPLGbHSwhZzZ94pOroW9Ptl52u#P2R}&ry$nz!gsX`Z({jSe^LE$D&B2@S2=N zZCyUw2#>U09`tyE{BoBeTv!;zQH;KO?2* z^r}i6=|5LD@XN@+Z%P@1mbWdRSiZLWU=b}FIINH6H?3CiE_(~VY;7@qnUPmE@=uVJ ze&ib4<8k`9xfQWFeH>|5W3EAZA{wENSp0r~XZ4YSZg)`PuGJ1*o}eh~N_*mgK%6_= zzDG{J*)~nEh&`w;`(|LOtkKr!U2I>R{i^*{&#T#TU+Nc+_3xglN)}W$^-tL<`mZbL zR>E@wBGCp#wfelariPZb&8xx{+Ai9@^J%+v&WeV0&J5@45|3~GWv6PzC0ws1sk|ix z!6i|yX#h3#OEp#1H&xeFmG>(jP;S*XS=1&=oi&v|zucM%S6EYyt~fANjIwgp7QQi6 zFsQJpqM)fV*3>`R)KF1ZS>C_Av4LwSw`Dik=em}-cyCjqeXf0pU1zVeL9UbmL78oH zZA)xA+eZFJ=;J@)y>pa@)6I!v&BvR~$8mJ}^fBz)|G^!9$Joi~)2GjOI-}^Yf0t2F zk-3%mXsuy?W^Jpv{m}s#(#-u#49Rnk&dG(TYJ$eEBpPRva$?c#g%nsw%?9e zS(GB72!6OMXnn@-@%Wz)p(tA1p-n;FWwyGx;H%7at@WvZ#}il@>TrBZ^X1_}tJ&4` zPjA^a@rTl9oi>{@o%Fi|lgGsE`2C2vbBeaz?Q;uempNU^{dT0?brxmzP+NE15%D5? z|7BdNG#oaX>l-2s(c2=oN8hG@d!$Rk_l4Jn*G7dAO2@B-$vJ_>A%h1E9MB;5A6nnS zf4HjpK%W+_X;o=yes?2(Hx*JA{{dxk8K@(~{f7kda!qTLxACw|+Nlfm*h&W6VzF59 zTgj_)O0Ugt;diX-*1tB#GrYXJ9v*svZU|#2!e}Cezk5}ncIaFDM7;X{3@4F`yZV0A z{#MkQ)5nja*%^fDgX0>O-&AzEx#l=B_Vn>0=5qQtDmoelCt8M{x2J0Q4)f*3Vgus7 zVSyBd8nGD|?VsZM=3(Q%*qh>pQShQLE`=M1G{gs`xM*bHpnkc1Qk0i(u1TPB{Oc0Ert)KuIcL^VDG)DZ9j$Dj*$=e+m2Ohf0xnZW_Z%Qb+0PQs?xQYs#If@2}P*QS|zn` z-=@sH{B=@pU3HZy$tBzBs!ChRMTy%cY8O)T0nbX2qIInR;U`XBTkf;Bi!2)-9Lo zQiV-@N%vgpS%8g2Hsx{|25f9%RxUX?Y}!8-g%Z+HOcDvLpg1}TN=ohF?do-SGrcw4 z)i!iuC@LxJ&A{GvsJ+Nw%SsKWm5}y=BbT=q6IKL7k(Hc^@~X&MNXKW^Oonwu}W=w=2t@cfxf*UHZC~rs0{i|?cRG{mdZ&D+ zdS{pI+($vNTmJCkYa`bd-67vs_h9!I<)wA+)aj!|d8vw`uBqnuC0(UxaY;#}OLxqv zsny8YmQ+ba#gm}4q_nyu5-BNxvTeu3?oqB-P$OON7RzskCS74uPENdq^Q`eFQ>N&f z+#Ki&oK8$Rt4Uv<)EV+CJUv5A#@B0-lDo%`8(l42^nRwn3_?r6G#IKMbiBUiw8wqi zRpdF&T9Ec~(otLjTVjD|Y6stm{TSZw}?O=S^i* zyh9Cfwr7zf%khqyZmX69 zOy%GQQq8>R%(UsP4oMQtPKPb4&L$30RojxxC=p(hBe!?^27Ft^#ksXSX&%(7HR^a8 z6iQUvE=}hQ z5~S7ZAvEMQL2c#9<6E|Y8`LT987A)`lo(Ci3#7I4yxdt;trg|G)@YZNIvrLAf7kyi z?TD`?Ke4RP5<~ zz&72k3uFhP1Eae9=;(~AZ8t_ga{gpJoqaN@B=f^M%GKL56?@2<%+E3DMIlB71<_d4 z9*aez_)XAA)SGShdb6|fL!q9i&1$#Vtg50!trol0YAL{H|GgsRdhoG-Rm@bPWK|0U zinZW_wpNR5ZBj6Y6djZuw7vyBAhU&Am@+A;>_OI`48Ov!xg37@wl-xLk~=Y%&vh5R z|9cf|9;D@VYmLWkKJIauk2fD@M=m5M+tnYc@4_^EttPTcDRflE2Qmv?2?Z7K!UF*= z#Qa&x%CvIBj#=4hW-Y3vePm$iXg4KU>?}b!ojFw%>!`U-zS@QA!dYy3v&-U1|L~&O zZEBOPkjL;1h6 zXr*Vf=7XD}MR5u{<^$;~G`D4%3b|BkUPiKG)>0(WyZKMKLNo|vDc2U-Mf>R_6uor< z_Y?mQ+GWD0Re5ugbKHySI$FoQ&wZfo;SO`(sb{#e zs?(ryh8AwyTAiVen$#9<6@+S1-YUW`rGIW|;of|Gqc&V=MW54=E|Z&^@jblu&YWvk z3+=l7tyfr}Tg-MOt;B^2Iw2a`v^wSZj^{uR$F;}WJ4Q! z*X8u80woV>#VN|gJ1;qHzmNlDwf(Zro2h0hnfwMUVKKLzTII_uV0YxVok~UWL~mvw zGi<$4@q4XQ$mNI`;Yenv)|#vpt)iIWsl^EPqje?G+Dv!xGaEEbJlWBCLeGNU#T0O~ zd#I!qwrN+nFXs!*ahKcacDS?LcDE>bvwhkA>_E04<-~L2dGY+XAQ_B$qiR%)vQd?hLTI0` z;C=oV@dCkqH4+mYf=G2&Z+O$J=#t`c1?7`SjKcPD+ZYnPn_z>1fD)Yu|p? zhxxf&khNQ_Vv77S8_n3a0$HtTv}mJe;-E849!Dyo8ka9CazdRlUxS zNQ_9C^D-rRSG@QG$e+gGV%cC@^oX=>(- zoEf<@@|Nc=&wJCjCST34>Kzrv>U<$DlJ8I0bNsmxsAH_axQ|+oJI+~K9YU^>n{RdX zxFn%%I}`Vd^&M#|zQw`%jUjUe+PS7Rs;W17TDV`=Fq!C0NQ8EPjj<0{YGd6qFi0-I z@S}QY@oHJlgan>j{9hL6xyW6t?IYE=T$%)IVLhVD8EHuv1syZGcRE%h4{A)Lk zbm+g5j8z-_{j9$^znh~|lZORX-Z5c?TT+c?i}U(7u6+7nyy=$o-VMV-Ebsnu=iw6* zuN#s(e)+U!m#lZ1i>NFH&01_@eK0qowkDl(uzXhwNj+E5+;q5 zKC4#e^>)#Dx)yCfE_nI7*Bjhj%0wyS*amKTdy!{@RMsyYIyBgP7~_aR%u<0uehB|@ z%EqXy5!G}Zroyy0rQY(2Xv}68#8`PG#fF+NPgKNHY;c-l<4xqu-T1?j#~Bad{pDN}!L8GoeEkVub(tv?!~NzakH96&aEl8 zt4?!n?ImyDHw<5npgpXXL2vcpi^89#GSJHhd4EXs1-uR<>)~}i-zJAC3#OsbDQjlt zrmSEnbSIn&2Q4+#FfD7XIFpi4!xg z_4xv1@^h#S{tf&D3UN&-1F8|{4huq-5q;P$WCsR-9oaE?5X`WXnGvwH#?167s8u!Q z6Pkvl8D?8+EL}vXolq@ZFe-57pLf@E?oB1dletg@S7zzdGCB`Bnx`_0CBo@+t)Fq9 zz1oKV7FJY2vRqPLJxG1inI zH4ddzU#%eMDIT-6aQ{iE&RV^v)(k`Y2L67^uY_cU^igPQ@-%Bp4a3aw>nX_~# zKq!)|C%mBKM#Al_NoUi~-PJI&cF{jiuDNx>;8fgYw%8tD_2}m1)9<}En1R7n18YHq zN7B~>0$;7&cD5o`6>?bJ)`vcL{^3`8n_UjRfHgyCL9Iw#4_c836>}?6#=@{YS|0W% z{2_mQL)#gmwu7n63cQ5cQy8FJB3!OWF(mM6q;Ife4>bVik@9Fu+wPQ}wH~-Ts${g_ z&btIbQ0#(Ti3@Qh-`3SOz}93NXS>}t({_LKP21Y&KEpoi_Zc<=Cn|DKin~qGU@UY^ z@T$=5q1$tBE}B%lI{aq-9^*m%VWahO1*(wQVh!5tfh@nn=X9H08DWZM7-NRGo+~cm z3zO(n^5jIm=#(-uq9v#!&#f(})#=pi7VfK*BT#D>b86KL*8!=P^3D0d{Nj8e|1JJw zDy1kFB_qFleYmz5!#8)yn_M+_cYB+q4LMl%(b}vT0MLi9ygtNoSsQ0*<15yA#FD{~ zU^AO6CaXy&88ZwSyp$C3Q(Vv%ZsA@|Wl>xY4KEhWRp6Kq3sPLj6kt~jTr498wpJON z4)qQO*F+*epS5d~wQiqjQ5`)`qElC9trsgP=ylkzy2BO_2@|uYb~Jjd=y2l)KX=WH zotvJ&@vX|9^~Fp6dFQZdm&1}_&8vMU{kA*)?8Hfnmt1q@g;=8zPJjt^0T(IZVzf@7EOO$)iK3LLerJcOOlS? zq#83auFWEQRu*MJ#V|SzS$JdJ%<UN-iVCHR2sXjCa zCTyltvxW!lj#H~mtTJJk+irxqpzFq%s3O#9F%D(HilnviRl2)dm$SA+r%SI?9GO;^ zB#e)1)nf6C|8DbGTxPu$t?;)PNqnn~Bw|#;J&@{UeLlRMPS6RX;1PUTiGoWL*YKht zQ*dQx+Fi3;^SFh|Lc^muixW>3yvRM9vzC8bzrna6@v(k;!gf3NT!=5R7eLWj<&F4T z+P+*>94Xw;_9ccOXV+Mi++5U>FIVN~hBv_K8EZSbDkmIbT9Gx8n^GdRd3lnr)+QF! zN*VYmjekKC%X66HwYmeI+Iq(j2k&U%j;9P|!CLcyWUcBh{nKECO$@NvG}aUyhN@Gq zl~b(^DlRC=4p_1T#cvI!$ZJPCR48L4Q7obx4Oq}3WoKbipcJL31jCNshZwA5{h#9t zYUY|J(`1Y=-k?O=k<}O@ARJCP7mhe~#IYmMWjEGmx!^sExn(i8 zEarw5@b|yVe(S%{23B=8g(%&!RP_flu|e5E{|)1=$nW~k`H%1JnwRm+ zU#2{>_?BB2J71nY{pDBgy6YAGZ)MMqer(^q$3{J0UeV>EF|$7TWY(C*uHTJ+@~LrS z9(^<|Ph7Ta!c8yWYgL>L?V=OqB1UB#X6s}{$d?mTxFWhCD#ckN8A)Q3>B1%>(_dO{ z3}aL3C`;xfvzR7kYAX50`fKE;{L_UZrh!UWE6MI^VVUkg{vV}Mq*DRzlI&|sww8QW zB8*frq7=_G<`{C-e2fWklo5wRhG2^3)#^poo~86fXwdYbT1Q5F1KO+%etAkCtu=Wn zJO||38>$f+WWBRg{rj1IkEFJe-C8@a2?^D-_reRLO&5CN>ds2<~gCKti$UEH}S5Ueug` zqMVq_{nm!zSgWL+=3y;gHD&n^eI8YmV~D6t46$acs#5oM_thgWeRlNQOK#d&-m^>m z(JQ9Syu6FYWidK)%Kpif+AE&E{)VMX$9B89EX2Qe^OURqF>Yb&!w>0D zgWK)>-K2uK{`P@{W(n?8c{H`scEK6{yO~9^wP+jNn8vDZgBh)JezU#sTy~oXUAthlVh)o5z8^@00P_zGW7l@~WL8_yvETfH$oX1dip$lwy7P>d(e_i4fRgDs7Csj{uO+b|J){Kg!0!kCd#Kvk8OLvu9 zL3(Z@df53GCBKA~=^Ix`Z*VRAODN9>(`}_8cVkW>0+rNV#JRLC_t5d<_)qTBuH$Yq zHV-K6?LYP|ts`J|H5=Eixyu~a(ff_j&2|_p?(q3DIyLOJ7#w_G?i}pNZdYpsF@cznuk=qK}*#csqov< zr^Zu8-36)n$5d{DF%2n;6z*<7%Cb~tsoRmV=vH5X1@Vm{iIb49jdvhnLw`)z)CX;kSiEtw&zb`-*`CY*rZp|urW`IKh$&1qj$|feZNifEZp~b$UV-+fV^IGGm-gy( zVXfll!M@`9cVoe`_w@M7Fs6SzRXBL?^B>-x{%BaTwmyFtR@?CWC9F(5bkRixy(TU8 z=MC4+dK+!qo*4P}^w2-7yrIwArolF2!LOF|<(l7s<#O|CufN>NmV>BPe|bgwcpnfXOslfIVCX;_40uU>Aw6ivDf!IfR=DlrD_lge=D>nbXvb$z4wF$WC#7q9A` z#Db}!l);e|EpS8&8Zk4yk^7eV(fe#dilM98!%yfX+F)S(dv;$Y}k)H zJA_=acF~5F<{E0&x}>4?J!9pfD?gE!$W7!V;t5Pc*{ybq-E0@6qIg-XUd8;gE9MwQ zrsAwolu>HP<$8*6ODT1^oHOAbMfSqXQJk?nGneZj_3E6M?o>27HR}$ogRAIh4J*sE zoMzS=DGO6Sn2_vfVcKF;;I?_WaIq>-oa+)%<+qc&KhU8XV_f5?tARUF_xH}D>Mkgg7J5}e&vMO zQFpZd^?TE6x1@jRixn)vcx|`x!2GTkO~Nm7(9(N)KXZNSW*(}0mdfqt?in_4tSF#8 zvtSk5+rlH14+HkPRHD*?6wR(nRu%NM_V)}-_9=i-(=p03D%n_YHs6$>{QP7g$MXex zGgfD%92s*m7H9BZXK)#LmW&Lu#izGeBYEsnW;|Y&ACKqd`y%;C6($BaNm7}n==)T@ zz-`l<9FE~uhr?#Yl#eCsWlsG96qp{E8_?|xaDlw+KmhjdaJI*j%+L2{d+eBJvsx^E zz5q6kf@may-_9n^pD+~$@Ut$3s=FW=_t@f?jPz{aM!=j`m$K)_vr{Iuo-CXRX7v5p zC$j|%?2_w>`M9MZZr#Aukp*?YqOXT3YjesBza|SumLXV?)@BjVXeL(|^&XFwquuyA z8D#;*52X`>?*vLBX55(NgEb$`D6HC|vfO{bQai?KLca(KG|J~Ag&ON|i)%rBdQ}|6J5-vj-^5U0DO1ZJAw_eSE zDe<2EUBl;kaZdiM#M8kiV~Z0jW6~YbyJ9yd{!%bUKga&J=$x2xiTN7yUHVDpNtQ|0 zNjAA5I4IOVIv_D4Q!F)g3w8~4jn(IOOY}DNH7jb7JLnB%$FlRYiz24{gmSxiWAyzZ zU7uk8*e$^s!CA$R1)mG94Jt_mrm+N(&%rBVg5!KjaWGRC$;~Vc=J@jBj-0sS_xVdo zOC1XDP$DstF<>k*)*FWyM;Rw#LZyYfHJQG0zx&+1QyZVVvQ?YPe3#1`HKexJyj#<&xfd_Gt?sf#e@pKg z)}GyKr!E{-^wh{|9oY{JFaTT{pTJ1#&t>EhA*$vU2R_r1BF+xa^>sPZ3T9& zi0bjXIy%vjeu*Rwke-r$%M3qk96KZB$86AqpJzcZorjkHOQAvG? zP~z_Lz#lSUkhZ+7wUs5mHoL}j?si*?Ho?|zAI1mJ-LW^P%+8gA>$Q$}68(w1# z+FHyjd0h@RXM(@W*pL-9z0+8)O%k_HIkDDWmN4%`+E_#D+0p*P4p*qd>N6{P0Nvhp zZO!83#o<%tT{%1z?~&u>%xlKK)M&}FIub)azP@Q>zmX4?-v8|bJB2_umPOwMJg)3v z-7iZ73I>nrGvd*W>F-C5%5qqoMOQROvirUC_e)>8lhfgcjA;?--YuwmJ~Va4ROn&- zgNB*b2W=19XJ^d`%n8m4J(M#mZ%)1uyNXeX8B#OxSEbPkA9L;CxAo#|x>zT)-E! zpht9I=?Xecb*Qb#`h)c(8>&<`Ow?xnk#on{I$pGBtnq4|jA7v9j@C?5!?3}BnDSx2 z{<(Q~&2I-C=6%gQk?6dzTk{LEKbwTa1Y}1g>Re(`_FF5~vG$?@4OXY0_SF~_+$H=B zR)@}C$#P_})`sbBW-hJEIn5r;bZ5RI9nku*^ct2a?af#EYj(@W=>enIK7E31M@lA=44}1hdHmhR1yn?h>M%Uamo&6 z^Nra{vUh5Fh?qUp5;SvUo^GCNK4})r?us*SuzJJ>C|Z|-#7BB-`GIPL<#zQrWhyXJ ziCh0i>UZ`l7v|0%G65?}I;R3Ut3rDgKwAy{|K!0_?bE~Q?9Mze8T`7ZS;Dve^}MfIMrngl z6(Y_^+?W%IM=PUJC3TrgUAmC3vZ9DJSY@VCuC%hSw6v(uSD{w|IpzWz=Xbi$Jrz{u z2YhB-D7z+JiS@Z-E3gPA6wA~>{kuLDwA*cbeoRpPV+#ul{2WJ~x}3O4319`EyY_*J zzxVB0x1znQfmtpLLA3UaX?ur$?_Sy`Z?vAC>Ck^@*_zv@TEtKJC*!vSiH|n>$7`C$PS# zvx145RY4MpM!!AkfsY>^^5BWtAI_GUUE5`~I63LlJEpvOQ6)zQ2HtaNdscC#ZP#HVM1xm*=$p^J0cG8{5;^aj+b ziKtaQxh*N9^%=*?qScPKi-h)}f*~W(F+%VJS*~T8eVi{5^7(=xpC^fht8l`qoT9w4 zqN36=U$UkLb26Liu{@+c(X+n3M^9f(`#8cNB|3%??Slw|Bd=o&k%(#GU{Ic$i00%#NvrW`@Z&Z>v8PviOVn6n;D$zu>-;=S}=5ej?^uH{z!dd$Aud zX5-h>u=!}~%utOJY$%H{0y7e@kphYj{$b0C5Nl;Sm&X3wQB>fJg|dG-`_rP1|5?EP z*SjtZ@ia;wS^&-bUc`(6CVRajg-sDUqV<_JoM6L-wwH0C|1llgp>TGZ1M#xbpItgG zb+#4Dsu zc0CIHfTQy|%G@^?fP9BC7og8m1w}%k7%>Jjg7#omk+;ZSCzctD?ZsL3-g^IFv8OR* zPh}184)G1~XR%+Khwfvn)E4RZRCho-_g0eE8z7&%T^BN-$aN-0kA|xMGT91tJ@ST83b)jypK}>&~83d%25cHp_Li;~guY|GYlu4_W!A zOxAMiPwh22$UmA7BmCe0v~p)ZOJH8J9}0E9Csuop$P$rRV_!n+`zq2cPN!0LPSf3G zn`(cMpRJo?n`J-iP*mPvH)QD+@=wbvRlQpHO3`;$w@QTcS!Ws@Vt+}SLnSMo)*#((hm<}_YJLl;) zxPNwZcTnM28_Omh*tl9dL5GLLL&=6c?oaCnG<7j-cJNY`!;Y;*G@;csNwQ7nEa1!% z+F%E7EofH`S=CE0?T`(i&;_>Z@Ez+rb!^6yjhFtEvbt9fEgH3cJnQ7RL60{K?O)ZD zUe5|FKb9r2P}k~tV*jOAah2>WeX4KYT>rxt@rOIhDPnyYTEr)i%02k2Q_ZddSEZ+W zw5+16sUOCi0dAQJ{l9 zcYZM|z>Z+S+ycJ1fGa4NTT)O^T;j_w!5c&DQYMzDiDefQcLNlj_TruwVO|>Jrg$J; z9M{DYVbmuK zRq?v|dPOnEF(HA8si|v1A(vX(!i`uT?9roydc;fd6Xy8I*r_RJs!3 zUYoW`T=szY*Y>5;u0Ooy(9DcH|3{r?t@0nd7Bx@4!0(?MZ8;OBp7wVL-=J{Y{?+bi zIUC8X!X6@A#+nIji28pu*&XZtB9>0eP-h#C2~!M?I?woc4mbQsR>IRuv{qVcyt&cL zR?tyAV#7UOTfsI{JF%vh=<+4{+PlvpQSl-y53N|Kbe>G&qd(Rr%AVbU(>F zao6Jod(@8Us2w9vJ3=%*RgFPX1sfzW6&!6#HU>%m?idqQurU!IH)OM6j!ETI5435& z&FT(6ce~cqwvRRsH$yvapJvk*8fiN4Z>n#nW{k8#$JMc#y|bh0?8rLOiTfvCs4ce} z%_6&P8{2ZF8}8MoK_ zsqYM(;m-K#rt)^~??@R9;`o;E&;DTEE}xi(@9tmukR^5Y<(@E-RkR7Z&AI#*2y!2BTn$ z8 zOHup(=E-;^0`Ij>c9{=*Fm7shW#cJrAf=6IYjDg)S~y|anWm*ND=y5p+SH+lRcr|? zWBaWezp$GAsSaOIp)WZ3pSQ79q})wV@+Wf;xew&ocq6c;TMfgzh!=smC^Ke zw(VQNwma|>;9YjGT3X(|cKqQO-#XL z%Bfzrmw%t<44jmm%{j6KgGDQ4nR!@%Xh98*CE809l<>S{Zf+v!i|GZ;i(ICYWkKiD zd+gddtQ}6L9hE!kXXoKinJ*Ob`+U)CEHLBz?eEoa*ROzO|K1#VSn6A<0q6iOD(1uai>JQ^;c(dN%WJvyQS&w9T=d zvHz2Ub(-ehL^K*?a*2U9%`w<~XKsK>ek?D3x&usVAM6Q`gD;OrJJHs)+? zCCX)*ssHy9azVcT-zOKA2&SZK&3P!o{oiHbPfb=t;K#Q<*4}o1$nv|7)^>lvk4Kqs z2ikR%zJl|7?S;+sf4|ke+u20poqf6vdf{~#m1mHfJD+O%!1S)0w;pyJcKvGp)q2`- z+AY2B_?P)#);*5TUEi6%v&tT`$BK7zUBdg;bEY#k-P7u0#%27A;*07s<92DgqTI{R z79Uck8)1~pn#VsWDpgXIQl{1zyPC_aWsa^cC7(|ii_9@=%u(d(hIe61Z<|+HSJ_r& zz2#;3B{~bMHtTGDY&f=z3a@Nn0j0L*+1{L0Z|vA(diNA` zZ(ALgiH$MLj@Ur&!oPNfCUF^Tb#@-s2F!xMwC%9U<$NTJ_Xcrd6|S54!-F5DKjbPt zeDK7Bmz;R(_5X76b8nsC`@E1ou!Ose%f#=(k64mE_~OT0pY#V`98G`D^=4&jHCmD; zv?LKKppz*V7RqJIehS#Kt$|o}MRxD(Hxl}MYfeksiIn*-p8Gs}j*_oD>Uk`{|5?BN z-$!R9zp1N9ZEO}Hf6Qu%)<^kh)P*5hUJMpeucxR0Dx=w5c;@$sgHCfbvsSawMl&(J z@BgFhJpkjV&b8q=GuwOLo$YJ=0-@J{1ExB3 zFfqmj%Qj#_Z@DH3JtPo5Lx2mx;WLB_*6MrCnO#{jko*4zP1~6*r@ZHF&-0q&68azx zD;XQTncBq*sirv2WdHeDEgRc3*&omgcyGpoFAjM=nTLjD{U^$?8aSjkAMS612J-3e z{xYRuMt|G9(*F>{;5{=Q{$=S+@?q)p@iY3hD~|YOqQz^UbL82bOA#KRbK1)0bRE}5 zUX~VJmbo-{W#Q(``oe=%_gCLrr?IW5KQYhiQbNX;a%3E}Np5F3wz1cS-JwrrYATrEbhz zU$-u|zUe;h{>+~)Aa@xegIma#$U>-*JdN1|b<2ipay1)jlr?8HCX!+i zGn@r>SxN|IIdTpFgoi4brBMsmqZP$l4U!M7rI1;;PyE<}>r6K=UGUr?iNI3TXspMF;j(29hDGGL2L?i(?l^;1-fYp;=U$|p(@Z#6U9&!=qBU9#2-IZ zIk;yAm1;zn+{|)i`a2szQCMZ=10?r0C;3J?f9Wi?kD0;zsjH4`S}?ag(l*6!K$fm^ zdP`IFO_S=U9@pW}T0QRF4}68mjR{_Q{V$`_J2J-_c4uvFyIJoEi%kZr6-k*6%VlXY z{Zl&OOAnU*Rr;p%0KaVPwC7nwKEgq5(p>TC3qKekm#1KGgDqE+u zTrgWlCp|XkwK|O_4HLGS`gcORz+hO*Z;*@}en`-gPx!ec0d#(F`x^gs2)YcBD!djY z{m~84*Q5KRiYQfx%~r`mvheNm7O`b|IfvkobAR99K1#p>#gicdnbyhj2q1_nMk(_t zvq3gS_xxYPP79)&HZUj9=;oG?A-oF?=E%r_Z5czOD}?oFOCgNZ($D3w3gnCIV#X-@ zS&c)MUWhY~wH5&oEr*%O+#lPG2k&_MSGOOv_8N(5qN{G-xU%%k$G_Nm#6#zlUgdSA z>Ep%Lix(VqS7YbxU(>6^{Z!+e{*zng+yeb`Co~cVG?IzjM^bf1ex|Q4KbSwub*bwz z?-jnQTh~v}O$$%%=IM}lsQbYQZ@NEmf8$mInfL7$yQc~Hv(loBl-{aUFSVYEgXMnj;p zi3U0mIcubmGrQ<&f^9FxY_L8MAkzT4wDNI_#fsP^6h_o8R{_NhMce;)cD{u|XdzVAXmgtdBJp&~wg=vThmR4SW?3MdQbv^aTZUUWJ= zV!$Rl=}cfLs7-@qAjbu&tvV*ijA^aWsM7|lvL|jzGGF$I)sG9`Z3lIjGwaYBOfuh>!{iD|HYsg zZ^PgWUBK`s7~5rkD-z&Xz<`DtnbH%BSshrwsOPmDNhn_zhQD}V)uwY1ls6fIvh8x) zQ@=d&isPAqD_?;7b;4u&m%Mm3{}g)6sH5FBJmIQmX5P7!U144)^ppi7l&(J+a-Ng| zl+u&qW_qS)76*Q9c|Gtyp8v_{9^@Vj@EMQR0>2B}Qr&r*);eJ>RjRks0|PTyO%_Yu z34EV3U~syk;9&zefQTrc=_p`DE6)$hpTUIB~vp#7*40$i;AjzrMAG<*y<0 z)pFpIL7+Vlp!yR2GAOeZR|kz#WV02A$4{iK9iFs?3HcLV%&~6G1J6?7m@+j0{7+a2i-68FS*`xJE}Z%L}8?13qubh4Sqfa8)-N& zvb;#Er5_IMMu){>cLaSce5PEGC0|Bpy7!J^UE_ZmS^u1JY zDul2@sZa!+4q&jrj>!c*B7B6%Y~TeF^tf^CMx>JnLBw2~P8Xka5AkP8K~E9^RXF_w zg(j7Zcj)Bejj!xQ9meKjyNOUuVIB!NG-K)xqVCw1JL|4*c_2Du8;T4ShI(GI zy%c$=@KVn^+!uwfy1wlBH&_h+Wr=$5whhGAW3~0fEKxv;3i$>SDHM8aHU#Pmh(;9} zVgM!u0rVlHfrrL!K@dx4Puh}^Bx3&)l0C^nvN2h#Pc|fxm~gh_hsLkdcr``7n*XXm z3dx?Hu9lWA5MS1%dZ?0b>*`iol7uJ?24x^%K!O}}m@3I?R%Vr57+Z^!N~L#FLlRKD zs_m)e0eljDUDtWIKQM?XJtbNA$4E`Ei_zZq2VeE4Odx!#_6({j4o^pj*3x9otAWT z;)$J{ZRCxucm_VKH@4z2w#Sp$e+rO*e2(Yo^)2Jy!i;}R)U)@=kNiurn?N37hJVzm zbkYsHQFK9-?6?&1;Kd%gv3QVwz}_GG2E4uld#ef7Va4cWPN{{X-tUS+ci4p{_{Ym5 zxvcrcesqCfPp%8oAzS*IZZ9p}S9<7Dc7A{+z2wQ2rOVkE|Co;GW5`4@;TU@K3B4!G z&mSJ9Dk2U1kf%x$yLQ$~Z3#l6xx07@SKn=1;(wZy>kR(A___g6;&+=YL3z z@YOvYCEA#_L5ztFC&o@}P#tAE#R2>NEKw^bh}wpjy*`_RjVactAO)NqzQrgL_oX6@Zr}nPK`1-N6@V}3x8%K=?G4x*P zx&}H%{y{fKk~Wf`Jvwe0cuQ&G=(u@;ud57?Qi{A=Ii|YGo5*D;VXRXbi0xSI zvChS=Rl3#sRW8+#@G1YPSMdbE0=S0eKL=H{TOee zeL=I_Xl~MWfszWreg4tb@_q+AV!U7uQD{5$eMP_3!f`Isb+kfWX4$sCum86b`J1v9i?Gm9nk1jZnBg_1o~@^YXGmZ@@uRW z8ods5mK=#|ExMepUnl59+i?$#P3@t1fa54F@XJQ6&WgL2zu`3|U_O)`x{6&Mp(q8{RBS!#9emrO9W^UJ3>BRzMh zvYyO>ZQyN->cySpRiw`#aSqdp@?#Bij5Z7-x`Jyg!|+HOe~(VI`mMu**!h$bzF*+d zS;U0$A*bGgWt6m+hWVRVTXag{!`s55w`p~8(uMC^X@!Hd*J(oP;ccKCHRdY$GeT~0 z2gDDoIUMsU!EC`!VbK1blT^C|0fbAU@hkIx%CTROqHDIemsLt2JUolTu%T)n@w?sPPVfDSChwFr-IuR-=PPd=sJ=3?=@hk7I z9qYUs)f*i5dN*aatDi7E=Gf-l8GO}rpx&t?BB>_At=5~o{CRa(*4)t9Oq&@CQkzclZ-3k&r+p4^Q~;8Gs!WwltNDu^g0F8l>r3$0q7hpGA3% zpnlUmD2(+TR~XsPHR4YkIk45HsnbA%#yRtfL4tj|$;P<_BpO7VLQa=7&FgyY2G6wQH9=7S>waI@8kI z`|sMaib|~Kiar~^aPCaG!(sOQIzw+G2&6dk2EpOE!mse-@R^PF77!iEo-ltAjsMi5@8@G?`?)F-e~cQKnl3D8AYw+#^D1w3Yz}7#I~^2UXLhV~d;rdIF@4OnW4nWP z0?X*5p*5uEP~!>fy|~Xq(VNu!Id-8wY}G~!8_Mg1G-rjDrV-WT6N zcIux9KAw6``Ksm(#rv9l%Fi`cm!h6DC_D5$q)$IBIFHO#4yp(B%gA!&$@(++^K|D0 z&k0=-+!cBfSO{IMWQw`Tc)3&E&^pb4U#0P;91I%P$w!6F!?7a-NQ zygfuzrGIaK|3+pCmC*@zzW3{2zeoQ-@A~H#O5Z&5TxtIc_ffr3(Mje0!I$p(>tFA} zAEY16#GHYdSD}fFSR;QVkAXbiSW>H}zrY!^nRpK2NFR&Xj9nxHr+8nj0QW z9F7n%%L`KF@hlVtMLYuTq8d7pE661zW;d~8aKl9eZOJ1Gr1OeJ{_q_CK=?9{J_4k6& zPiM(fA+OsvW$ouT-}A=QeuvwdnQ#&jUVN2+EtBUiL~C!vTnM7Q|Ni*2>JzGYsvB>T z(;u@;J&tOEaL#U$EWWJU=kvIuL7gjFr5)5^8f>kKpuI62!qJE$$QkqwHGCT&d((#3 z5`@7B@zx|FYvH^ZB3EzCRIimMgXP=ROi=pRJJ_u(m5ZVb@m76zC_-WNAiaE z-`_w-GS3hlS&U>6NffV3C+b}5oqPj7fuGGUEl937b`eM$v_T2XuOLD$C* z9rIt^b`$W|xo<9dr}P0azw}>3H(z}7#v9-8k~{8su`_QLtyW9JeByg~2PDV;z38e< zk6c6bz_(#39)*!v;9ivylA&L@R(Y}EqWTSnErxBGXEJYObZ#U+8eXzkqS`_oNQYqR zDL_08M2JQ?L?p>eNK_NAigJm;bR@uWwy;=N>rrVnI*>?R4cI@RW*W#qXr!am|X`T^g6o<`Pg*1E*gSVZ=|aVY7?~-s@&u*& zNsd(x{{6_G6JJF3C4Pt;h^tOYpHjOtyEK2U@%;4a{MG5T`8(1#~?qAc-O1Un3^LIb| z@VhrJd-a-YUU}u3YhLAFx|Kwcg{S7|Tun_j7fo9bQKRx6qy#zF6 z(PjOW66tS}VvSkGqaSS{6gsO&S5=|ATR4TbdL-^NA4^?P!AffyVj z|Gl+!O1UekWy~BN*p@{;i||{2R^X3wTu`UR&o2y>v=jm;Dd_W{%Y3*65Op{+kPi-4 zIg8h)RI3s`C9?m#YQH=sF()xnDwzR0QJVX}_OK!3khLFJ)>HwK`2-K?s1=8sm1;i7 zE~)6Qqu0x0gv{>0abU?6M;`;jCRF;0uEob(e8$n;*^|e@FWJn7Ui8EKDU+`28~*p` z{1pbytqq?w{6*!0tSVt$c@m?+1vV1_8tfXWIx04Zk~mvjDxNN0BC731%L0cZYE&7t z3zW*J!Q~g%Iibf2&+|j%rpNs%qX7&Q!BxW%71YFMI|Fm zHRY!)SkN)2^bKnO?Mau=Uq5`1&HSY&U0)kw6aVVtG0XR$UvI=LN6cm?ppQ>)MYdC# zBBR0UM)y)5IHQlZ-*4xiE0AhOb)qg^U8rhojdvwF(p`lWjukQeayyCHo9ukX(U*QV z@owRZ#21Ah5d3r0dDd}Fa zK=TeA9Sen`v8W%Zig_k2a=FQcTrOXT))pGAdU{E3%IZuey)J5{Y4xz68^olYjAH3^grh=&^s4nR0#4!g}B=3*$#5##KQafdQSqD8;oS@fxr z#hQGvwzj5**B5P8)cGYSJwZ)q?Mj4EZ%xGKHtr%DxCE{kR~6P4_;4XtSX>YaR2l`E zLAPbY>a$9_R?AzoVQmfvbRAM@#irfl4&W|4Wey~nwSvkdz+>P&D*I+D@hrO5RDk>N zmMBXn9=sjcHw6qe)xYHjA zyhASC!|#RlkUjkNaWEM>GG)E-f`et+S}DuXhg-~6DjpeL=8$E%lZ!!vc4!im*u60F zEi><#FLE{FXmP0C{ZPH>UEgg@h=nk<{u$hch9^j6>W`*#=0`C$mDt%~aSBvdAWw`j z7M~}_W!PLXQo(U-3G7J6(xcLTdbL=(nVea=a*XNtJ*lDMgHEW@KT8WM(vqBp8MPZT z%7Gc>;RdC`66a~oi=9wD3=62v2rY2|)evnS=Q^tukuxZU90^-3z+CUK2o_NsD-Egk z_aCI-&q}}>#>>C2sr;*$4u^gO)pwovu6v-9P3Ehmc5}12#nftUGq;;N%#yjsJV|Ry z8k!8-d|PT1Dbhsvx&9^UCH~XZr~8#n>IVNL^(6mXwKAt^?qKutgErDOxwEaUqchs< zM3`ig6b#!)zwLF~hafmma5jrgLO^1&$!0T~qRs^1o=_CHs0Hwu$-!te6pSXC0Fk2? z^OiiHpPbF-bJ=LqWQkrp?t>oEGr6m$N9u~!W>vvtU2RpsuOjN|W~sB1b6h@#r)R=RvMQr+DG7t=>lJq>e78O?xc5>NpS0{C3ah-cQ_jU@M;*{#& z$!n49xWY`N34rAtdV{8E$l4!*&6QXQq9s3vMj59&jGrlhCLjK4MVU}hDa@3K! zQ{YcM@*Z@L_c${0=Zfx0WL8jQ*=}`tI~hX;_E2k{-hw@wx1jBFQpbQBNhFlDwxWo{ zm}YWFF_F*5Xex*Ma6Uchnx-)3kK1PD>y~#KPJ(?}5EgE4p+`Ifz^)k&epKzP+J{5mnXe-&q3;xiG5R!a=b_!y? zvQcSvhL9*WnI(!vZHMc$@{(ktC1fU-S0!1ewQvbbfGmJ_;Y%#!{-O5uXMiF=}p7c<-UXwgnj-p92zedlQwMuos8{m;@#|S|MI5JggvAGm3a4-umlb7{x z@_$kORsE)3b&~o-D}Nk+oZ>{yiMkcWldZ?um%BC2h+vLr;Z9c@BCznlC?j^UJ)-J# zFBzSUn>k_uqGd6Z-y!}o$zy~69Ji??+_Mrc^u4MNRr^&+)QS6Os|O;8rNYB*!QuwU z%W5=hhB|JkCcs=J)Zlk1BOgI6_-Ly!XbrLn%^ICztr^)b zc>X9v3hClL%CYt>l%-&o-hquqhmD$UaQzD@0F6)WKms=K=e91F!|LvI(2d?zsKK570NY@Eg$COF5ovrLKCNxiy8q#@Zu5N;7C&M$jj! zlZ>a6^Qup+(?6?vTKBH{UG00Rck4eYIoGKL~>)8&|a?}`Rik; z*l3@#9><`OXBqYGP$zmtQ2%I3jq|0?c;t-p|8!bu_{qOtEyqlm`={(uzvIuhtbgN; z^*6sEELlHr^yzy~-Ci2mQBu+QL_=tbB2$P?ykYO_*Wd8^Ui95s^xebgyBLC_Gb!8j zw_D7uFe|>5TFkARxCeZj62fe5k#`yQ3-5}^Y25kVGwUwquJK-4w?27$&CPWWB_FA| zzs`DZjNF#q7~Yr`Wcz`^=fe) zrvkh}6uZun(Z)NH|Fe`G-?3hq`Ya1YIN_+FG~`u|3@FDROCQ#=ve$mpLsUK(?N+#l zFzMolxrZKkp32Hq%%5BW?FU?XSAFzEX_yF4eR$Oyx7_ju{o`L=PkZnOpb_OBCExFW zW9adb(u^DS?!DoL*I&nKx)H1CQNme}_D;!hzKPUm`*bU8=h&{W{YG_%UCk^yNgsNt zY`yuMyZB8ob|gt#Hp(bL%qFR?Y8GRMiDvXBhe3}%QL2r^&N)mLT|80bGAdn{1&bkU zF=~?ebY}H_6zTHTa*lA^9P5wC4!r#_RZOfIzV^_9h~gwPskT=(oX{(b6q5Fftg(T$ z=w}={ht0eHxCmmEvzEp1cDuvmviapD4zX*tw#hD4#%u<^^kJ&{sG-91_ueyU#zmrC zXR^l%V)Jc#$mz77hEJhZ{HqK$DlB>9rn$#??eMb1ybCs#3aoQL9K=6CI}1IsmsYOC zESpIFC0*|5@^|yLnV`KmapEK4N1A`z@|ykS34gP{<$A00FBAUTzOV4Emsupb8KGeyv!VNEzJ{bVSmD&aCbUGT+!DWBF$lJY!h(m z>hgp*oq2HZ63;^&l&+=)h(oU1BFXu&7RS zzy;!`?}L`1H|?N`g@bP7FG05yBFZ2rlvoe?HHDwZk!*@p8TIRrt;CCQiR%cWP~N?G zxmciZzHH6XxL(Wb%dVMKoSeJ#(TT?{`mYyXT%&Qy^>;;gZ2ii6Hykm$^y1|+-?(v; zkO^R4D>-4wExXho~x$i%Pu3<%GJ=_$*2-XRMz4LbJn&YAE4YB(XuK*zV%1T*Qk2 z6;pByS&hM<)kMv5AXV?1RSu-4BJ_0-o09nCa6BFfM^nUQc7!8EE~RsOilCA(YqUks z_&AUbf`}jIMtZ_Mk~VFzhBbRZ8AKiIRfjv+(U3Ik%#gX5G36w*adFlEupAzEP8PSI z6OgDUJv`2hZnM*h26lxt#Mx91x#i_)XfF%lCsC&33+TfiA$#^C%sCn{WC7Q!-lXiYzmvhu-uBI#nxtD&L3|*(Q#tzQQY*f-6n-d z>_>1HpkH7x0q%kWO4+taaw3t*V$2!^<19wq76rMpyu_j{;5I$vB&ED;2&t%4M>AqJ zIGa!xgkI|Mm>JW^tWl?^6)2amTpQI9<2Y31LBUk`LJ6lUyFY!FqE0C4w5nJUPR|vR z-p&`Z)-LO#R>8W9tl;cKD}lkBDG zlKy{$w;Y~|f0%Rf@R#X1m4h^8jFvBE_!b(|9CiCKY|Gdy{N`&*56q+b4=K{^Riuz0 zb&P|Tw9}Z$T){{?n|1gU*@ZxlX1WQVb^^KckOg-b89%> z!mn{%=X%ujlO95S&Rbl+ao^8xR6OY1;NH&fRtz~eyLX5?s$O=z=>CiA4fkiR zeeR6j<#T~4#+7kjCSF$ch-;B4@6h7e>G zzS5FM8T17gh*rCvWx+81WXv_M%Z$G(^H-qtT#RiAdqIB4ROD zOG)lVQOW`DQk4PTB>}vP6bND?da;3nS}aP7!JM+2JOCTUO|AmqWiBt(w-$JMA5ZV& zC5yFy;MN0@Q5jy09tu3tucAAk-@iFW&-hu7$Jlo^V=w7n9 z+y$lNY+M6i3{UYfJg_kzap^I0>f1rk=am0_Nii^k6e5Fv!weuZSOLgn4gfE+Z;M&&O=P>!qVoSgAu@-}!z^4ltAB(%`>Bhg^YakV^Y$u@s8LW9Oj#)+r$*F* zkg7mnDu&Hi2u$UgaQO*4hfdg(rZe{+baT?Wt;>e4TR}bCpHRiQitv7ll4mXdW&5wl zYq8fFo+&)jV+JcMcMGaf{{-BHL0rNz#Dzg$!ZP%QM@o#j2ytpJ+KQ24xah4fHWcH< zSh0FSv8UKrEEJ1U1>TYZzNKrSvM@yIwuO6cMgBELwU5GFA`us$E*y%*0P1q9S-BF! z0{|DizBP7h3bhAuU*y)*LUSNnc10)wa?$C$x@uKX^~o-x#ykOa{upI?-)MCfs!x{@ zFM|}?f$xRJyJJT@D@5DuZPJ%PWTgSRUCb16aP@YKu{z z$wyn^`@;TjTYT-E@`xS-fstaCCJLIV83oPg@R%h?kt#tb&6eosQy_l3;5iC=k=2Lo zR*%tK$YTxNf<07a#NpZ6AUn46BOjsoh92c~;n~7nA4$`3VAZ+YomMQYoju*4hahy* z(+p+^LN`6lV1^)c(?e6@5wbRSMRb91XTgk3gG2OnqT-U1!e+jpWH0ztY>yfq&uz6h zsQ3Ii$%unkJ2nxzDccd{nap;wR!mSndxSgtDuV6(ieMPMDN@;L`d6QcQU(YR=RSg)5-5$0s9uXIg43fXkQ1zD+s}?(ZofRb)B2=+SM-JG+fh^0qcu;M3#ABKxK4q| zG|B1^(jMt0j@TM()&>+br&>+WXv~gkM80TnE$U^ij|Snm^F?D6g0pE`U5=Tb?lJ}^ znrX0Wa{meAkHS~lvFCqkT_8waqJCX#%H7_ zR+}wM%O=_E9BIG{HdLz61eG=|)t^v$x9Ig^!t+#riWjTvi=ag}al!r|zbg1)a6dJE z3;jx9AT7$Ua+UH!<$k3~Ddwwp5vn}NmGlNzvwZoAA7hLLRjy({D=N`oE=7&~FEQQ2 z)uzLw`RL1-@x=14!7OUfj}Q8)HI{ZwI~%oZIz`IB99T4E4Ec|SV1*{FJc=Xy$)$6} zpx5YhF&x)wGM~(53O7(*7DwIi7Z+1;USbRgL=E|ELy;7wg!S={$-@i-@Q`PU>SJFb z7y6$Vac=H2NoS(2XreLc_$N{O(uhn<9j8DS>eX3Bcox;U*tnT!&zkM1^B8rR2yf%V zMiVg3CO~9O#AW0S#AFV0ZWKZcqr5j6R20p+F5OD%7ZhECD``1<&lzRE1a$@Wmh-A9 zA%bl2&;(lwp@I5NZPKp)#f9%BE_7RWRz02pi8f5huhM*@Mj7S>9k>An!!JFDm{1+`J3y2xM@R#x}Ljb z`7PWBg>gqvULP@=h2rAzeko!% zh&@YBri})dD2-jB2rvyT%B951$%%~!4Iw=lKfalg707-MSlDV->qo^mHQ3w}>O(rC zSL|z?G9mAGx%`Fhv*&ocMs2vEyNZ0BjMjFR*0)Ym3R(k1Tf?NKuK3c=;Dy9C9I zW^%$Y7kF$ogHBLRZ!X=^)eCeIMdaLowlZ>&ofuDffPy$u;NohHXeuL-;Nzzb1k4Pf z%xS^C8#sYw!D;s>Hhq5?ZG7c95XTs~o=}qbuEq53*$|)3sbtZpH-iq!EYmK7VUzpO9_qpA^!i2Mr6h(us(tS0Z zSz+ftK=kMwX?jAF z)TV>N!oUj4EtZ{eg+?SgL@q5#!4>csG%8)l5D5hW13HaEr_*qMiVUbW+5co1@U0Yx z8IUGk@TOd1a_L6uZI%H|C?|K|0C=c?VuBQ=)ypWNr7WW{Bq)g>R`iO0PEOuqsrKN8 zqCrp$bn297Y7+k2;@LE<_UO5-MNhyR>j*$2aeF76P@nGaIhI zMJ z?v>qZx>eoYp^=ZbPtEWG-?@vw3RXtVuc$j~aCKv2<(*VLqwn;Wkw0)>aqU|KzLAR|*MLYs&-o-1v9yQV z`S$pUQvtAR#fO1EfPVEx4o}tLsf(1);;DM})Y~H^fDWo87kRy#Sh@+;ks_;8UIPX@TbOeS*7HylF;z`>s{_4>l z!Z$qpi5@%=m9Ul-b497xUsMzWkE3e|diKzBgY>t_PX*RJ4T;J zwmqIV@{4EepTTo8q#68-z) zyrm=Dk?ZL1SlqFyLq%J#T^{7)zs~AY*?8QD@d(rp-fuE%`SAw=r#zCD&$wCd)Qx>$^fOrB$oF3hETNL^-?Q!CoD=R^;^#c{?(k3C zO~1c<_gjy^jf{7XL9@Sn+X=Wo`Q!W9_m}U#_7Qv=$OfLzaB93g&yW8$ET@N!r6bt4 zr(-Dznm4Z3(i`s0^-8_{y{cZtP-z!Bg^&rOAI3&9%lBYCIa~hicp5#~6&wM{7zjV- zu%7gfZRDSPu4e@FERu=O`S*i;PWv$J%izyEMcYFDG`TNzJc(+#6EMFMW1m1vvv0@R zLcaf6%%|>#I*09}TY0!p5 z|8^kCMF$61eNu9Gv;(5(v8dqJ8?dTTDx#vru~ZGH@eJL8WSep6=UB-rgk@!mMmfq~ zF0bzV4KxL!#AwWjmL3xgHNFM&!3WuX0oBL}nL$rV+o@`Z%p-Dy@St$M^3OE$h?@yS zsN{4P>~zBvKI~0caJOS`M)whMyR$~H)gV)7({@7*CwjiwN%~|Z8|=6gmOM=LP-;+= z1A|N>ZDuhkxe6*d;+|7azx$rkPQB-prIRNuT{>yb+>64c(os2)U zI2ohqB>qZm|IY{T~`y{`hRC5_xBv#*0Q`HuYOA-iphlqEZN&P3zLF>gr1LNXGlcGjf*Q?t_ zj)lY*rBI@$M!cl4Ch;e0$K%#cb0`~HLo;C}R|zKFr5Azkpc0fv0j2{qZyi<;CJjoG z!4igcj9Re_c{5xA8B?b%hc@%Gt((q1@m{aR=IA?V{sme-`v-b; zm##RcxzXbm9Y?MNaNENto1UKCQ%}3_v6<&?zO>3DipO6#KbBF0kkIb#EH2(d^8~LO zxlqvo3Dd#NgU_KwJ2f@6dTz75Jy&d)kyGoBO!(8q^XymJm1?56Nu$XTRB5>>mCA)J zxjA#DH|IKYxhYeocMg#bNw3u^-qhqeI8SamJ@-{r#okQif+5Q95bDc0x8Q|NZw>@= znISTHOE`?WbN|>rU!%@ZK*?muB|T|q?rhB&w)Eu8g;0Sni1YhtA#S;}@*o5PNOV7D zbT8kcL*VxZH3eiub`U+Z4`FXGzOX&Kx_A)|U%C5GC{8XYM+?RQjdZA#a-`h)G`9c^ zucjOHTV+F!ylCYs(_eQ#6KX{SVs zXZDv?SaF#wShggYfBcu5+KQ`AjkcdL`970laDH3sofq8JrgJXqkJsP)%ToZTf7fZZ zJ8xe#vA(AJTuexQXXtT zrlx3^x|3X3_HM}a7130(_0Nod;h0}9Uw*?4%a6Z-zu@>AZa5ytbo^|@_^HPDY2kXf zzf0zciODJc`0Sb4PqKp6f~uz`DPghXXbHTpqtTqNrGbNa^*P7o8h8zbK7LL}PUE$^ z>75AK=DgJ%X+EdXL~=eKDstp{h6J7D1=p~xHP_HUEub72K0gIlP_7lUxWJ&^A{je= zZ%K#KxwMe}bmCHZ{eZbYEaT)#RPEg6Fa%Zo89@W%dR)uHrvfQ zyR-Bu?b)}_T-0((E+)qE+s+{CU3R;xH1CEDzWSEwOBE0QV5LLIYSLI#im!gKsw^6u z;R=6_CgB{I)pl%mvD%xQLN6KD9ogGlH91tJMPqRbq2a61KU2VsE-iMGC63*p-G#lO zy#-~XW=i+OETF#KZBobj*4C(0o2kk=a>;~Gt8DO!zF@+wP33?rO{Jv9h=M~WEtOE( zSJDLmmG(w5gAR41;qFMpjLbyuG=$Y}l5{PtVX(POowAnYuTd3*F=x=l95a@sQ&><6 zoz6`__o-{4wJb&{mcIgutL#~lN;2OZ3Y#sws!3=GaRp@qvIH!V5NYNcLnN=lCTtFd zXi28>sz@Qi9BOq|JZjVL8I+zASSNLm-Ur2BOpN8t%>k0O7{LN_M5F|_wL_BZu6_qQB5>&U(%`!%syvA$S;epbFO-`_K< zr?019%XP%M@?AY$N4Fo@b#%YFS<~T}RlB&Usd?67k7u4ZZ|>seA^!Bor<;$WaqS`g za;W4ri(@fyaWpC|o<4mVbMnj_t? zF)=8gkIUockY0*}VsLXLoS5G75`e{87WOQ&Q9hJ&Fv?`r<=ZfVQu0uW#S|}=ZY>R$ zZY9fyOJw=P(la0Zz4Uw1_4kiR=kW9eM!iO(H@+nABzRrvDG4t;cjkipw7x|7`ut<1 zn=e|ra?zwm`KhCCg}23fu=jh0bUyW+O0QNMluCnIWmNLbDuW7VtEc3T3Pu-RA)noG zawxm7AvYHZ`eVn_6rzwOEYYkqEwLXrJH#+BB^_Qmd1 zWR-G_dX0XKagBAAeU;lHOcJK>%^Gxl{7Qd)w~oIBD%E?O9~?=OL0okw*cDIFwO7F}R=kX?Lm$@;N8I#z{&_Y0&fu=vcY~h=73Z{*`L#q-qpZ`k z@2=Tdt6c7XxMp`iXbm*fG}q4eE6(-b=KoENupqFY_P83MI#6BPUNfymQP=KALg89T zS6hdw;i$$OKxL%0QcrCSPHQ}U)-CMmx2}=AIW^(bVdOolvvqZ-l$pW8hzdK1Skaet4!+J` ztOTC{= zZEY`Rz`ndjGKGpEbL|>h(XJo0jYSkv%jZ2Pj!Vfstof|`e*?=I!7(td*fh|~@C={& zCB1|#^P9JhmV%;!j{S#M2Wgr;t-c0Tq`lpQ9sQ#xKm8vTOLr?iubn2jlzBC=gMvl@ zNH9E5<%yh1l@lkeV9{8}Lu%nL+DPf_=#IpMaj$}lH9zhGNe`ye2h-_e?g>YD4ak{Z zoOpj*b@gwntK%na*l<#u9kwZsDD_9ecy;r2>GbQbr_IqcfMN-vR?l9?TE zqPpj9FppWmJZ6R8*uV)EVX?4ESSu(6$~QXVR1n=A8-|L#kd#VTqo zU%2T`@z>WJqD^Npvz?WC8oCtK!gY#2u$8g_Uei@t^D3uPYg?5wtTOP1SGiRx(WB*7 zKYU24K$5_klSRl_?N&KP(h7>0% z-ske%t&*gPPmNzjF4bNhSJrSutJ7s-KCjJcjhm3xtBYr<(^a~pA*0j9t#Jn~CzA$1 zvC&(c&zFzJG3UMmT^6Q}*DJ>D8m*S9xXO?#i&4h`L{I;N6-xj6_RB*l68&x6}f)NL<4 zNtGJ1Vp)k1Qj!DDTYWZ^(v0OYqQ$dT$^JG?UFW=ol=|W9h2kB^R?&xS~4s^?vem!O* z=`t=d?m^<{XwhG*&4<)q+;2v%#609mL{Mg%V(Y<2O>1pub6q(_F3m9Zf!dyF?B1@) zWO8Quf2YTevzeq7nmuvs>y`p_LB{4-}(vmSWrWAF5uQZ+3=%$v2BAsUF`#=r4 zILP;cM6j2)CUw0i5i}!6D|cgsfUmMpXo}55CnwRX6MLGQK>Mp>)x2j7q3B0)#*FE~ zToY-k=>j+Z{-&nuk?$FtIkUg7xh2@$y?+9k(CzbqUi;a{d-AJ((a~AM%96E}IZdWNRi}MR#<(}dPTq>5Qpv1dDsm4rl8j5fH*mHHDEY&j5|;zRdU*D65)8lEG|beqktt4 z4&(x~B;xs!E|oBd4PmWW=-I{Sr9&*`PFB(&PWM4+r~gq;7{jU1-J#$yJ+oq|VV*LG zCk@hWu-K_BY^Ongd!WksYwHrpV901nm{N6IZ75qulEyf4oq{z8e=@V~BK!mJn+y&n z5N?+x8T>J{5Rsd9I`eVDe`A371J%J$U>HzqM&Wyy@Ds{U5|a7F>F_75uC?eQbZ}>(T=X z#hIm-{<7zmo^wdkU!S{~_UEd!*ES;mz}x7rKt<>+HIizyHB=mmPP(!^F#N zVk=f6L${Xy4QJ&yavJgkr@}GeH*V*|sy^ysjWE)9T4rb;e5{z&V%C#IjbqSienPWq zS)0)eJ*sK2!lm?}K4&iv6!j>AkNI0E*4``6rR_ZVH+eNErc%jlBl|5~jo6s&N9cmY?Myt~xtshkUXbwy`0bD3;P70&l;cAJ7-RHZ>BdMx7w_eCKmF%Rd>XDobo+w z@I7zpy%-2twr!bu$xIqN3^(Rxl9`~iL1*ePEp+jiR}|q3zH3_%#N$QWDv8wpbV*mP zFSjVSGN+&iAexw45uczG9sDvwWde=u;6E^)mL^ss<^m|0@sCVPM?Db*RHMtg(n*nv4cA^0FRJomAADS=Qe3jTJS%axkha zRdlGsa#?AG9QiGf(Pw6!=6`Kv(r6OhZY}+b`lE?i-hW;C9n<+)mg^CunKaL)ckQEk zPpP`uwB=4DGg~n@A>im=sfxT)IUXLSH&7euDCAf#5SC!= zyg-_$H3Q-Ye4i%>XdehtBPkiu2Rt8_a;1Z2RZ8cGWb_J?yDA(qhe149XCYy=TGDLL z@EWo95RC{FS&9Lm{%3UNm*`LGULNn}uXy)qR47pihL`osJVQPH7+J?CPsx1xLw*un zciSVcoDwbFL|aHPpRNbPhhyx{yPe9g%_AQP|A1dU%w@SrQgWJ)R1b&(HxP-4x-%66 zR$e_|+~AKCxB;iPJ~iMMb4wZN_yLC0M}8(8VsNH2w<*ii93*wfm!zqP@-JY^wbj8Z z%BOL+3dD=@dX1QsaFfuyphY^P*<>>~#N%$Bx?b;&jk6>6YD1QE%O;Y7XQujX00lH_Cx8Co$G&f>hCX{Hd|r#tk`z!!e0#Be(5o^ zKQrjhUi>bR+aw8b*L^NM-E_6Ad3S4Sk|VE z5g@U?qka0r-*|mVrO?w+aPT4W!|*qyKM^gPLH8WRf6BkpSNc6Y`+T@*SVvo>39WK7 zTBQMcO%WBR8wP4>6azZzfKG2B1JMCLKj0Yf`}nHI;@QXWz(DA+SSv@b zZ0^VGcH5`m0g>Uk(jU zk-+?($lW4!H#g?s;K|jKp1NYfTa1%pA`$N?HqU7lipEwGs*)95MU%-`{cJYd_-roB zO}xA_^eps0!iPI^ojk(KA3v_SoDX}Rwc~Kdq`1ncJMf4cxwm|KU>H@%s4S;yFbf33 zIDycnLxE|0EQWxQQE|@E5FlEJHjo@4f)k2{gXoG4BmiKwqbeVSFN+Z42HILw0IM;x zXy^zID|cRKD=loOQ5j5TqpJF?DzzSLy;W12^Lk3hJ}AZ8)FzA8=l6h^F&)fJp|@}X?t zluhyJ+E4^Bp~_5cO)V6fgfpIwWS4Q_kVENC5|_I+oLWX)B2E4UZB9n8Acll0b)-!a7r3>B0B1b(^ZIPQ1EeUe*^3S4VI%`Rv=WS}FtKn88q{&z5J)79-^VRJl$`>)u&Ysr1zExR9xDT@bVThoQ2eUvep$!m}R^ z($64)6a-JBv4iad1{vpro}N#aR@SF0&0=}*Ljzoz2UZ7qjS^Y z^4`{Soocho-n_PP?L{qKx7&L?De11-&|Wop+GhSQExl(=n|*;=-BIEWl_;GSqr>E1 z*`7b>G@D)bEz_v0!eyn6sGkJt=K<6Y#djT){BQ7YfF=KZ?IFV<%d56mU2132AIuu* z20**F2e3!ZmA54$4h%`FBkQCa5GTGpfIY~U-UdCBBMaYBrSKFWVfso+$?}1<@(>u0 zVZPn5k0>zXfo_LIr?8CaG~RQZ3n)olKuPKXN>Ue4lDdGB)CH8JE}$fJ0VT)jx1+IY z5UR$Rea90z2@mZ3&Ug0Gzd2W*dFIvhPdL7D=dSZN?%cU?!IsPB&xbJrkJ*aZZL9bY zR}V~?zYNp^7l+r!?+V`^CI&Q@+Q2Yrqs zUazkPIc|LAq4+w4;tcV>lQe#lIT7CsYy|zJD?^Q!TM}M#!uvEoA6&IQ{`EcOT%xjq zek|k4`40zkK;;*}`eMO0xBm z`r_$q*q@6qgcuAfqLof_jshG8mbM7oJz(M~^e-3v1_M=|J#QwSC!ZmwymKoNx9;0V zkoCb}SCM?@;4}I69{c{)yAD2{pF$@%y;`sCTUPeZJztQ@8}i3*dF*es%Q7ji(U!dG z^T68=zH@ZdRfivc)$#dNNsZ2^R69yxWibQA@I&yyOyRn@rR00knf6SHP?7;RX=aiz zOWB#3Jw@u;RDFKet){!Hx6U@*Ipy&wd_|^C*%P=;dAISNz&+KsFL^+@3%NxGmHUj( z1fI@3)AiI6%dJg2n)r-5u(W@Ph&e{!6)m2r-C>R_EQ_4dKtoWq=}61WNM~n@3f8dW zQowPwN2~p*B4S+>35Tt^C3gn`exZ43GicA9&`3U%V(raU;VM6A?r!esp)^~|mQMwx z!U$T|yS(A*`H`4s*&X{y$*8!3sX&%gWiO~y z(%o76r2XKVXdU_Mo<0vBJQdl*5T1qqXx_h3t}d0GGT1*g!#>S3JqTT_cnwz|vzMoC zHeu5^Cb~jWRRwc<9TQ9o1{BQlGIp~#htWBnLaDG*VNscHqV z8WSx~mB`&hHCgZ{wzDi5RNP^qJQM7*Oq*4inNgOxA=xoC(c)9VJX=v2jrjw5L(~wD zautE9D2eGyqNLJa9vx?%g<+PhNXQV+eCx2w$~}R?>I!CA3U;KOgs$#H`W86#-Oh_I zCZ3=F;M{PDE*HCO)N-uw`RehYlQ23E>0b<)~xW}Zr%ltRi-0a`(7m+!^ zZ>|z%Iu|?FIM4E*=YKx@M);%f(Xhtv@>SjC5}d{w!5U7kr9puJIaLKBl}7SYwW`N@ zA7bgPm1=P2Il|6mpj{OQblaTHOszK}rM9MCO$h)o{N<@kqW9%Q-H zBSUjTFyjH{*nYayQ;nk^?J@jWKZGd?94(OT$V+)4`c#nDd4~f-NY>bLMg%@!(kzt>y!;N>0X_tEiicXfC7L%+O;|3NF9`mGgJ&H2sqsK|bO@0{w%Yqy7z zlj)~TQ+4*2?p(SRYx-aE7xTXtzKMDZaXpgu1rLHogHE@@H^lql8~6d)pmMkAb~+XZ z+r*um3F+Pthc{y&tWxIpk#4r;5WMPP*bb>b;4=oUlZET`Mb8cE3QEC7*9)i1RuJjx zvizn}`XY35eVjsGk#Cq(N24kJUi#?t6;AZ>SBAab@bJYheMxmyoat0z^ViVWG7h!&(gjA8+-cfdbxmFlnEPe09ONt&m;gcinVgmT+ z9CwuzyU0VLbxqnPPqtLF1F>7F4m7Kpqr?_5_PZkbRHVEgYQdcYwUMM|Ke>}j@)^Lr zPK2K(s~~8IWEG5kC)6B>s5pwS=KBU3KHCiCJ;~gSRKq+Bwev7Q`lwN~I&JwBbWl3c z6k5N(Xlg=IZp;o$pr`Tzozcf=j9BkxdH}tIi5L9Mj8N*u-Iq@8sC1gOj`rF`byMYY zd$-J#l5UGKQdPA&H&f6vJInLm-s`ahtuB?brE3jeL(lEG?tt4Au)4IS=H6A*>hd&E zi8kSCF3!y&8tImpraTx;l}{EIcCM+vqki8^aaBa9L;GP)57HSnJwrA0T4PH zYtsKE<`djt|Bt9pVaoWZP@Q{xRA_$Z`0pl0jG~3-LLy%;UWPSU#eHu8NyorM^C!td zlVS62mJ-{ou@y)dD%laR$fC*)8a8AzNGp_fj8PS`BJv6`4d~hr_$~@l{sI9iCPdzI z?~^X^3ln7w6ZogpJg0pE{y6Guf~$#oPL3U>i!KWofMJ>Phfsfs%xC}*A|-a}uSJ6L zc!Wgfk^|ewizj9Zv-9URiI*MUJWXVNA4IE&-NG60`$V~aOKZGRX`LT`TKuW;=ank) zxe}i%@tGc%#Ijzx(bA2YZhFo?^pzl$Wl~^a~$lp1zLExl?--jbLjtIX` z(!h11d6e_SdiIepR)TKxiLT*(_#^Ru9_~r78R8G_Bsh_nKWXf!FijLE3#enGA=k93 zzUo@~>Y3BYvtEc0uKdqPqYKDfuR}iJq$iy81lditf&0qr$v=>P5EehTi)=gj4EoJx z)cKl1oxdP0nxUSmo#CD87niD+X_tDJ`L9r3p}*XHc~C7WC#ffCJM@x!l6R87Blv6X zH<~xKzqbCy`y1bzep4jsciFrKi&g<9U0TDeuE(kwez`>hYD6|;zehWQntK`*>jVAR zq5sXqAqhK@H~5Lfu+C@Cq-bHR#Ttb@CaEw=+k6FRtQtF}pyNTPe-Z zTq`)PHASxV`AjB3=e{-^BzBRIg=vi!Vs58~cFY8>37;4-fX7@Kth@xK4BCzGCZ5sETVP(ICsBJyxq|uMn z0UESTqGK`J=)tr^imgh6!S5f^%B(uz0{X){KNt+SQe~#fP$gekmQDxC1dXze=L4FO zq|D-87KsFskwiMJ3ub~&2j2vXeOV%%Or#^90Mkionu8EpxR%yez$Y_F<895wjh+?< zuTuki#Hf_9&!_>S5Ilvs5MLCcaS&cn49Ai8qbG2{RM}*0qaM)G zY(1|un=B@)$z~Fjwf0;!*Qm#)-jt~(4TdI)?uIp|9Ck#QxeFpPkUt#k_fRHb;2t&I zTWSkms|xC<5G|qZ5NmBMzn|=+QuFZXALrk0IQ5ja&CB>JsQ8e-&p?JSFdcY zzmmVP?%MkA=5FV2GTvQxcl}+t+nR50*&*!kKT^J9HpG>c z6_r&bHPyL{vNd<5>Z+QXh1-<(R@_^4Yt5~-cQ<@r`LOA+ipQ#U)aHP!;_ZPB!`ry87B$ky^H zvbFsA$#RyrlQR5+ZJzWukVuecMrm20Etoc_1XS<AWVeg<|F`WP%G^cags7<-J`(KU7KXzM%q_uN58P{S{IC;z@D;0$W+`223DyZcFpYzC)~K?O}{ z*@QW-&_N@`dLYBZdXo_K#(cBGy}YjiS3F=~NyRGBO6MxX<6uK;X!`&2x8Qm916Wz$wss&XEjdN|^UG06&SM zpakq>0AC=l;~vQZQWdq(MPV*nm!eA`ih{1of`jJ*YN3*{t{84wDb3#a1^ zS1I1cowx-u&kg87Iy#>ao}W_kZN^j3F-mIuN_hsy5Dk{oF3T>SQeAwg|k2-l*Pa&{~`N$xWhIy<315pC? zk53VRhUm_TOQnj0EEX{=qkb=Ce$*|{h4C!TSX zS{9s9d+jIaHr&}z4liT+RHqc%%w3`3m6**ykA%FXs2vjwjXdYEDoy$jLN&ZLXpdb? zdjw_&GaS}_wxSoNxUVXHXP>P2eO1rH6ZDO0bsbV@9Y?OiGa&K=&!7aiKTL-_=e6l& zgWM25cfk5{s9Y2_B&S>$dj<}clChp#g!GAPPS&2jsw-h;G-5;zv3!gT+#JHgJK!OH zr>8rBd@VMExtr#hY{=AgBi&+VddHOR88b>ckax11=ACSw#I=#O?xv=aNwem3r)JJ9 znNt>5ASvU*Xmhe3k`?D{&dkZw_>~=#kdiVUKV|OB83LyBWqUc&*VvR+bnhp(A^`97 zL1d_G3L}K`2}z>}2R$#OkgSsOo}Y5ZX$9(dYQjV9e~e8Fi?U|{0+d07CG7>-HL@|u z#$CGpm=RYm?;*EOJn^4DQv(Q1`ZyX&U4*fXl9+#uF|Y`Eix<7zC*LIe;gaFs-9{yk z{A#*={C>K<|2qpN_mn%$D$|_m#%PLt&#UfY=oMrP@r3TbfLNka~ zE`_J8VeTbVikUYd*(Mchc*ruG_&nCuEZ4>TU0PP=Aa1Lp8(>5$=vunvtjaar9P%ko zZkyCSWlBjKGUj#DjCr|M4%y|p>+4Her*+LtO`TfO1*1@?Io6+ybOktTb2ZJg+|~*} zYb4U$Gj&Q`{mlL3Ixa%iNSaE-7^v>XjdZ3Yut?f=@0|EV=(U2CE}x7dXLvE516|JHuW`&s*~8Ee0<=4<|H+mUzW zMB_9zqmTj?v()hdzfKKzxfE6Nib0Jg!=nKQJ)VpeoCSj=B^h5$MK$HysYq~!A+m0_ zbumWQd6LJs7@B8^Qj^tYxolZ1YL1rRu2JqC>T5U*+c=}&K^*JJ{5unCo)J?Nq2@)c zwHU(^89R`1X`^vkTZx8M#=oeFT4d@e?wRf?Um%$CT}-3hMK33F=rI{!+ZpT!_R?c2 zE51xV7l*N=RB+>^us&bBK5C))M?ElQ&^MrP02q6#VX(q)9Vp$&w~< z48Kzwqmm}ieV9KX24Rt)n#4@WuC@XYO67OkVm%e%!wg7qRI)lWi+L)>hj~Kf_ox(QRK9<&ji6CX4br3kR?@w~qWpycP^)M$XGs0~ay_oKR=L zlNdT(@&vMr>1I0JNOS{U_CVG`H>Xi)1pEHNerjP4s%3V*qp)Y(Nw^NUnP;Uw9Q5?| z%+k4yRwl7?yS<uPm6?umV5F4Hlf-!r2oe5AvO>;AYKJqz|titZ`?(P@hYs4>eY zT{_r*)H*!+9|5(ItcF9taXH7scwowBofF`JxGa6Dl>g=O_<#N-vMbd-YgT(|?M!Ui z7M7GOToj2c;;%Y!%%Ij<)o?0l<%9fL)zYk4ZE0L6RktpRlq_0Qf(sX%eEUM26=NOJ z!c!-8bl!nYZsp2c{i>Be9#&ZOI*n3U*bm>{G3nF=9UUEaoGNwHuUb`~TeT|p)l)@_ zqp}imyKHfMbL7Xw$mJwIk4|rbYmqmlLfGLY;I;lR^=V3-0%zuVdsczst!2DG4*``~ zAWy~GmO^A?k+1SirU@h{CtZEGetG@6`VZ?rtyk8=Wp2f<5YjnnkYwC)CtFXiM_w0b z61#cuYmU@0!)IoExzujT%4FIHpn{{?M+LYbi8Out^be;C-1PAD-s!@0l=?kTAyTbm ztk{AMBR}~V(`F}Q+Js-2gb`C2V@#Q?V|TH){RrV)pDDw}i`J2R7ntyH7v%*EL?Dxa4R`(>9C)Oo|gm!3TDr@tx8(A-5 zOrz|{8gLI~MRlSEJ>cE*wE=&Cr53 zVxd0D9Sxh2#*JGG-`I`NVpte`s^3FWDL0H3UJrs0T97y423$G zPIQ^Y8{Ke9R0SM86%8O>^d_4<%O@MqGf0b=6>b)(C;I-F2=vG)AzQ(GmMU6g< z-s4!bb?YLB2YNFnI{25x-@}#{+9O;GBB>!#vl|>?)C@`GHRkYv(E=rov&Qi+7oBI~ z#j=;J1=yk|g-->aqL29n=OAUP6i#N1bOU(svjf-z1B{TaWLC%_xziVerksY$fjR7t z$ZL^4yL`0~du{eo}JtXXU5U(2*i?bK~!YDosV&BRz=9 z&8eSEiS4jYEfYmiYkQ3gE2&E&XAr#DzsiMZ2dw4%nFG2U-cq+yKZ5_jAK`QuYe!(cIRX<+xEU_^}j zZbwc##GiOd%=xsIE_5){9_~q14k4092ZB^>qW~IoE*eaIn0b=WR`fk;(h4?J$WXk( za~B?)jxqi=jmi~ks!Lag(Gb=^RojgDXS5ovqCunL#mQCCl;3DE+HK)eI;O6);AvYh zB5qRHFdv^GbFXoJ|}6-8@Y{P(F5ay+yQG;tSo%W zW@V4%k>acjK1k#khd((-=13W=--=eTHdI%th>LN>Qk9?!hC*7BEG^}OfwGV`87M2| zb$Slx;O6FOT4F?YdFohN;()UT3IIN5>o`Q9aDf^-*naTY@*X09jfQ|d4dR_0Qb$!? zSyfeeSs)z_#012=B;(Bakqh^CF*YxW(9YkK?)+&tEZm46E2lfu1y%kIF1kL@fo>GX6H8L_E&>eWd|y!dL2}Esk?~1SNRwu2X%!61%}>K2@(Tu_dc3ZYwP< zsSZYcDM6jqC!#?=YszXnACHFvT04F%5cj2cZCW1>ped`lYD2S~LldqV(1%Mwh_GrP zjo73i@{hf#YR;~mL$QYl$)=8Bs=m_@FHAWI)BS%m8f~@l=E^baG9guA6nKXO|Tb>I;=j!R%+;gx;=;;)wbUS6dOw8nHmNQpj z!<`tp@c0}WVNBk*Z*33X(+QGwcGox#dMXpY0j(#`%0ny*r0+w}lz6K3ECUo;K}mJ# zecn-7U*@f6d1_c${c>4g%8pAqVsewU?t^aL4XVhk>`wOt4-=K2`Oyp{c7(5-Ey05q zi~4<53)1f@^-fJ$DIipexYuqqs(6J-;e86E%%4j>#Zw5SGjYzWgMeAb5esW|p|HkN zK4x)a@ZLfoBpkHIfDE81a|^5_7ge%D_OqoBpOv|bb^opF6sg?!%3gT zbMsf9s-?L(y2*tI(npdN&51Ic)7U7b0X@g)AMm~-!&HyPOj-`Eyx&VVCPPGD9ZdP_ z%d<197p2yuR3)yMCmybKWjuA^Yf{(L-Ceycbr-N6yQ+6J9IQUr@NVkey1!KarQvvk zLr0XgdVPQ(YjIh5c_3=ETgnWWKwG9xs&8%%Obtx;RVAWL3Hwy&s&+oA&Lm8}T|VA~ zID6jbo!-=387w!H?}8?*?}6vVGi^U!MylYWAWG^ zDh@6>w*gKH@6@PMwis(liBPFz3Ktc{P87}eHmEmitXH@kz1kd-JdSS#Aa}Ze)4UX)-!Ro($6Y?bL>4 zYr0l%xa^;cI@t90VLp8Ab4%~&Ze7@0IU_#{7aL8u7?#D$Mt&z&L+-7CyI(2Y1YW3M zK_>BmR;Y zSMCW1&rBE^)D_8~mQz&u>Xp96Oe~nh2O(Y&Nps=mRGh@)jhbeGYm9`QX(uvIIF*@* zSr^?_RV7VQ-dG<2>y^PfsU>3bNac@V`YZ5s(7zdu^T3(U!=@n;b1suHAx7t*Jgrn(d8I(rN`Nrp_osW8?rK#0PY%*`NjT{#uQLGl1DFu|obLjTiVjvq_c>1-yW8N#a7C@O2>b-LOr zlD1)!)z?>%j4@SJi1wk8yI3g;QVI1k({K)^PZvLoj`4yBQ*UEK9sMFggaW(Vha~#= zd($$rdYk6wza)%2S5}1AgImF5f0yX{ADs2b<@qGxu;<*E>A4-#!4{A;*DN%~>w4=Wz3dZ3RH?-66w`1L}Dj7Uq@lqMBgWjv`!0EechAXbW3Xyu`Kue=8ijGfBnwyy$&Jd z_luWoc;(!|{K($Cl2#(ERvNl*b)PtV(<`rTz3J6g(D}Koz>(3|8V6S^1#BiHDYqzX z2$EB)pgj^DXo$QnrN=n|SSCx(%);`us2t(Nufg8{dvp@m2Ktea`@8V0@Bo+KezTAB zkDQP+OTL-4iP-oK@^5l>{umrTIviQ~V*|G5xWFX(A%WBI3E_yaqXhrvK;SJuav{Ds z=zGimoE9#pHwQFtX|34r*1ZK~uxocI_uxL#OT7^uc!rJ@G3w^w(M+P83|ePQNMmPf z(zBlM6cTms*78VepWn^#@XqA9h6aM5N%`yLa~7RSUtwgxMyxh9&ck9sih&bj)IeV$ zQA&VCJ^!W22+}eaQRcsNdaM>FQ4s~=qukE?aiYQ*jZ$mm4Y*8I_*UhFUB`u?q-59U zkLSOnDFj5(gj(ImuM*}X53iSdXtz~^_^o>-o&Hv{UT-pYXw=9eIfTT&x3VOX9cqW! z1^P}vBseqw*`P(;!=Px7Ne;_m&f4YOiPSe6xWyJE9O0+2Gn? z`9Pc-hzHHg>@h)en(zU7YUinvVKdpxZ&q*CY&LB+EBhCI)l)pG7xCBK14<)L{$jVo z;lB4)o!VqKI2HWxeHJ|k7x2ehl7dC2F#>Qx$UMCHY=r{S=1cpyB#cf-xSB**$bjC? z_EHs6rfQO&QJAAkwVcRXkAA!~a64v^28HY8AP~HjnyBr9@ z<`7H8=7XX|vtU(}|-k7Rk(QsWFHujY?a6{)Lkh!SuT8Xg!|JFBHy1J?6M?Njj5_oMB#D%ENYs zns_SQ3*!)sDP)^eSyQ$%o~tqLwBm#{XQI(@G~%tKGTY{;G{L>>ZLDn5c^Yas<>&ip z(g7;fa4DJixsZO6`htP=hv<12esuW%`aNETM5ICqQU=RW#S`siqY_9#{wQ>p9Gg$6 zxtIU2ed^5@OuN~mvYAYQ?*4ge&N;(lcQ|`G5_6`ltT))rc3osc$I6S{5#g7a$&Sb@gqzDH~>+SAe~E1;B$g zB_Q|1cEHov*D$2;HkhDGrPI+y+pq(OkwRnpAkxY_mEmdU7lrW>Ok z89fXP8)hmdcA-PTy~?p5|6vL+EQFMs|He2%sVNeoBIJZo-bT`oj`o$6XLR(90iozZ z<*@%B`l91&#;v&Q#5oiZ7#41!yZqL#_E(ESsWX{%nqq(b+M%9*W&)J(#1DKbomOS- zm_{7!(Matn%^8EB)+*7bFJOHd;+@D^?)gH?&EUGoddY;rUNxz5QrDcyIbF)HpC~=! zCrY2+AB)C7yd0a|)ip#)r3RTg8x8Igv)%sa%vrvenoD<8{i6VObYo-F zteI6^&6Pv^gHm8-MTKcf2msHkXJogvZJW{Dw5_K&Q-g*>8qjF7<^$mV>*i+5OhUsI zY_^6Yp2l)w=7A%Dnyux3)EO8MhD#dB{rRO9oyw@X*rLOFqtlxQ$eR4^#s2gRnTKT$u3EgR7g6>9X<*J5B)?n9~nZH`IV*ZR7XRTf}Z`OjdRxDe#G`Pa;j>ES7 zhXLyfB{)X@07ifnHOd-p*(@?^sdn|eS*)APM!%dtf5EDiGuJeO0{KD7zjFF?(~8gv ze#O;i&Dpki+gZ&Eww+TF$vPt0e$d(U@AchMxlrdh`;L7CJQd8_LqogiZ2VulNs7)a zGAG%%ZZe^hjLtL@`w2B2^#A{z))gl~jQ^Kza_RrP67V0511wuT*L_XrvD?vk{`r4c zGESc`Q~kFdMY#LWtu{c%oC=n4e_d?q)N%`nsZ^eD44l%Qa*KAc*|pegQGP%@Rw1k<^pN`E{R8t_2i0Uob;51b#>1b$ zcLr_#5Y>QQ&d-9G9M-QOl@_%8v{+#g^ zR@`$bG|O)(thi?;?oo2@Q2Xj2AHq;e42?J#v|+kzA1Gv=rS?@B?eS;aC8Isw#l32V z522Wnb*!W@ObNAJ>_ZMuJIg6cEx^bri#3Yo@SFln*vBk~=ky6#Wnak;2zi$CQ?~ok z>sb!ku1FGKeKKRh)tm9=vz3i_o&%sh~W^djOIQvcPc_x5?@I;T|o>|N?GL=2i z_1Mw6swo>9+05>kkh~Lj$feNwl}kAU2$Gs+2qmFT(wU1wr<)Db;0C)fxPi)P*Bjn?2klk!Fpi zq?raz%4_zGmG@Qds#N!YSM-*;rbtkVIQ37H@4~TdCDnT(HqD0!?)|Rh+maKwoS6m;z?|T0jUc@GQ+Sp=opoGLWz{-$_zzNL~-Eq^ob?b~jD`|aCrdt0mp(}v!uK5;%B%0GDV zq7N^)@X)3gNh!6>QZxKAW}6P^ULU_yiV#PM&?IY7K64zw$pXpfA1dY7P^s2c!=FPYvMFRXAMjKxOiN=d9>8uf=M94HAya>nhYt$45Aq&WX9oAwu9f;z`xS3ZiW5bhN*W(GEIwuAU%c+$P;7(>1zl zOm7Ah*VdCdNn_5Y=yOpPS(<5k*x%|SCYwUj@Ue^umng5;3QjM!#{wDBFB}J&5)+jwbWz4BG@OI1L&2n%UUs5 z5#)@(AltaX2{s;T9H3X?GRoc|tY6>I@B-O5c=y{M-0{RFvaX?F-D4MB^w=X8U-&p# z?CvR#2YWYpW5H(ekH^1JUVhgBVn6UaF+D|IEU!56;=R8;bkDZm|5nI#MQY~FdOT6qM|P+>-x5OtIcMosE{?Mg&CUE$2z2wPku~vZ4TIUI8-AL7so{;W#d87?IZlA0cG<@wIUw4kOz_Nki{V zl20MpRB)JAitmV7L4HTvmwFMgjy7Tng+hFY!t6ub>GU?d=ne9V(g_K7R--;IWA#~6 zsGSnjC&dXPp;@i(E_zdXv_9o~&cQtkm^3s8_aLt{1iQdq!nK>*`F3$=WDWz4wv0>9 zJysH3737i*Ar@54mBFu1XFUl*!q(jOoH7U0LpAFvC(nL(TDfG}TjY`t0sj+0$(?3! zNucDP>|Iq+T81g7u~>M2;XP$EZv*a>(YYVs$=Q1fz!o%6IIqBup_Jv^_Hst?H10Wt zz2^rgKJpZ9fT0fw#ic<^@&bQSM)6VH_>WkvQn)Pbr3sYA`gL2b2dUdh^Z2P9Z}uqa zbP=mlShHxIB2xzKqZy<--^KbUT47w~b~^5U#KxUm!l98rp@bw|?K;dI;f^gG+dCAH z2s?8BrYp$=6z_W0XXFxTUCJdM3dkkaqaKwEwOu)(L>ZSs{?vW+)>sw{Hncnfe;vHjn4BT;J{u!|aW3L`-1xK8a{b62y zig57?Gm%IItKFNSA2hRT7RcAY#YwNJ&U!q>Yi>mSw6OZ2ze7K!SP4<4V z(SA++W;bJH#S9PW1(A7!uxy*Mgsy09IOx$IPx6MOH+hX385%B7-Aulx`i=LnSGmJG z=zZQRJQRGv_oh$S7`!TYTM!Ap2+(X=6NgAkkS{$ex$qN6R>*NFeLFA*NXh2#xYRb+ zetswCAm>Vc81Y^15?d`_(VR-Tn!$9fj70pAgf4ouV~9K~x$ElOo^Vao3+u`bmhm+G z5>N9mVgBJi8mKRSoJBA8_aBD143!n`@Zn5~(q-cR_VLSS=S7mSH0kyEN*=dbgl7(am%P}}kZ-th$*DhUup5&3qgUUu^R9-5yUHuXyJtV(HwBs^ zGs0E*iz~{9f4!hD6ET!0S6q8OpDM5TqM?D#Au@h_3Hnn5Yt{FF^`yPtz+)2W%`MNZ zgZKpKdKZQ!!XhTX=H(ayIm3M)egPv08#0P;z(y=+YFjp0$-Eki) zM?tl7xtw=_ev;?^q(o7fgc_3v5p_GSq$v6sZMV)8T0{*0-j2MBZWE+31PT^LJ3#p4yi(2hm@gO zT|f!)dyhL|wOV+EQtfsntlMqGX7h0R?I|{|Vem%q%Mr&##Bno+eIsj?9`^)4GvueWh=UNhbZM}Xt1wsa6`$DRaBe9(H=(`@*`|wo3dy0Y-l%@s2sC%2 zKr{0d5TJ8f9tI` z^KX*m+jso^qIsX~ed5HI1A9LkzKv`tM_g)t3s{jV_^BgY{!VfhAtPkf-u#h!-ar=F zpS}A|{sq#WUx2pDH#983p75Ap1a1-f=(*^l)K--teo2=K+g;fV-N0S?;Q;m(v}N2l z*pS>%adGP6j7X}gRcc>pB{ZhQek9I|kri-@#$pLBP!b8yGa-7$4`h@-5HV=z867>N zMgj#-n+$MRM*5s zQC%K)xj1#uf1{0nJg+rf3#Uip=nypq3ObMZ|bdu!H|?3``sl2!N+e zC&PDHdpVd3QUwk~ZbLVgQm2?!X7a*@O@{( zo%MztPE@ebgd=RibW|CPS-?j=l&0XoV&;q{QyVc(NB;H0}wzuybQZQf37KS|bIf@$blRj*aq&` zQrQeOQHaXWw8+#7u{`XGWtGUe`RBSX>qKq2rtYfb)eRyaw#BlrN~6=_AQX1_v#blx zu{g8wa&*;(u-=+gD+63fBpNMqxpe4eN>x==Sp<1E>}n6pZY9yEJ=~Kf>9k!FG4z@2 zDSMAyu!kdpkcfoq)Aifyh5FC-2@cl(P-#a}hzmy-l$q=(VKyA(n9gfcn9@4gUA{F2e z5)vW3Gj~Dv+SR1(f#f8(LYO`nPl6wzaLSA%TG;_gsW|u{)%_Z?bxi2UN5>wj~ z-OUf0`c}=Iye6Ⓢ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 z z1br8O&9npDhPl@*FdZAl6>csh2ld#dexrua&Q@dwL%kSHLrZzCNox_qd83qO@puo^ zdfGiC+hg$rJdEdNnmby8KCAXn36heb|GyI5RZY#!#Z~?ceV7XoyM=STV}4x5x#7B& zw<^u)M3GuX{Z$mi$N9Zz-x*ZnXFtPG4;p#L2eq^3ol{h4r1u28(Z_3kT=%h>9(SAk zD$Z>iuj#Mi1)G@>=`$Yn{2btYS1(?7LP0qK_-;qT%}b^B|h9U z-XqM&oE5Z}VvS+Q8X}<*Yex2LTJ~uMFO)sIne$Yl>}QIhk8@SJe(2dkU*$EWj|M&G zi$MARsPuWkb7mlK*QeL~pYm~`U7vAs{ZEqT{n^6jrp|ih>3+#i>YTi}b7V*N6QgP> zqS4<*qZO&O=>tDX9v#~L=-87t&FDP)v%#*fDbGATajGu$I6wb+eZcF1?{jWnOk?C@ zFyrqKdcexC*YZE(-%qOnZ%t(l>8^%@RWP**!d2j?g1<)LZ`e?R%a+D)T1yb-`Ih_E z`YSD=!3RAygFZDEzXJaTLOG9fWn@)PY2&(-D{MknT$zGeZqMYUou% zvl@0~AIT=I*;}$n52e_E&GOyyqjIK|E6Ab6t*5ZWP}m}e#WI*FgFYE}u_T;UH}}e* zSw=fGI5C+m{CM88d1PeX&+|w;J}VDO^Jt%voIDWFZY44EO;#9Y?X!{#RyblkWhFNh z!;s=p#pE2e&L}=vOp3);#$&S;gw4p~n(YCPr>?-PtZ=wo`HmcBYc(X%uU8#IyB3v| zG!!bvE~P?@4)Wb><{;Y@R&Zg71SKfM{9L-8a;fE5>_dGN*ujLV82S&tq`MD%<XGra+e5X>KHpY5zA9)^x>8?1 z{@CM>1%0|~zyHa#f7$cS22AK(b?4!=FW&KxcKM&7VO`(6)aKN4A1u=rWJ3oufI9WB z)N`*am`~9;64CiI`nLSYnDab#Jgopv1$0NIMM!f5mY0LG9QKD`MF@@sVO0>0d11O2 z<~uexwmX;wHgMR0vE|vw=Qj8NU0hal6oJAD-&o=AR#<3(OBQ(8xYI}$8DSr`X2XR{ z2Sqx_*TDfDOr)os6nW5?2ghmbklfip3I3t6F*lG;j_1KDnLtQKak&>6xaDy7+>Je(fs!P>`H-yz? zwCx@ip#9MRuN&Z~0iNaR+0HxTL*Rh(gp)YM1_n!Z@=I7dy8Z33e6~&jic*$kb6J%n z9BGJjMD}C-k3r8$i;JCZRwzWD%`^%*TH7#Z0Om4?>=>CA>R%mSY>@K4n^^~aU!mQ6;_1z%fWwPmw~#LTWC$FLLr2~I zI_mPDQMI^gbrs{Q0z(xfW3ad!)??a%9d?RSwF-wu7z^p&x zK$kqm?6^vRjErbbI(p*!C^ag&;%UdvL3U67eOJ}3PsKU;EYN095$& z8>(yiiwID;2-|$4C$|st4{(GQ8r_HT?qJF7_(eZyBuE3xtT!_G_2s|2jIzqx>%w`2~ z7$%3oRR)JjArgeiLHNY~m7j>M@TnPIH@|Bpr%Z4PBOnI&$^aJ(pBe~G+k*@i2g3&Z z*)r%VgN8Eb}&&ez_upKO6(NJbBl4Ar`lg(r|VWyFV z1j9Z+3Is8AjKs>>{s0YC1y==V1|ouTNg*JPhpq*P^dzTKJ&gxm32O?z|8%czh`mjb2FYM6>(p z%tlpTa%pIs<}IduGW2)aj+u%sw7xNR8!s|gE&3d*QY^9xaED3VS|+}GXMq@hw%wE7TD-kS=H`lSiviWAS7we6jwO(KpUffb*9bV92o}0f6 zlbDQVMV5IB^Bb*U;4>^~b7&kcS;`!hX(9T#hjg zvK_lrlle9p>|@+H@M+FBIRvYLvc1^nSgJIaAuO=`2FfZ0h3Z05Xff*^M@u^7G8M0P z!b+^sFLE4FVp9RQO$i0c=}Lke^OuxgV{v?TwnAeu8H!2S6?{-n6WyY7x&}>Pn#W9m zavYuXh!Khq%rZGnn_O{538#++frZEI5+I(Ja;>&7xhZv<4Ar z#lZ?efx3Vc6k0VS)S%vI-(e>Se;@wBI3?P+QP zQ6e#B45}F(a!@%JB!8!T^?#q@cHRjVddR68YUzv6(x)6tK0ySzG2fMxjVYU2wxdk= zMHy_P6j5De1eaj!fVl&W{QxY+B+dZD0zCnO8F=oJoh2mVO<+pDXM=~hJfQJF40+)k ziyXvL1T94~ipX{gY{b6T7MN;TU?B-hmxZ`26&7+>518uh&E1?!3Uc99n)SUq_h>Go z$u7z!>s8xS2UN^43EV4zB@*bB%#e@`A_$8x3u=XsIE2fE=Y$^$|0BebF4#jO6UAl$ zGVYi)1!j{?6EWIMDzzNbZN*q2$A}$jG{SiLzLzi@jmV`8nKbl>o`;hm3_x>BD{pNL zIOL&CFLUO1+U5rIN%I*D)U%q#ISP(TZs5Ku%MkbFOVSBbShFcS_T3$G7au-LZ71LM zfBf}`B(Y{D4!-oE_#e3v$OWXrmD4L_S$5pA+M zYR*5lb?YzQsVRM7#eMfKf2kCumyObU6zwRNpah)p^G_7-EymVXkXwwMCeId==e^YF z=-uOGE_mrCZKnqw#w>077CU)@-OD1|7@$G3p54Zh6)X&4p_~Ps6&g)YVFIL>pIkVv zkaQG6q7aT3{H`7 zg+EB)H7Rs+B#g(3FmD`+1a9_0^W)}ckwiXdDPiR*Hdkkn2jq2fMoz>|ONm;?$}JX~ zk2OkctQhU3wBTq~8<$JacY=!U1m7}^W5?w;N4)rW(>No_^fzho@f#vuVy-~~c!?D~eCyq*|2n(v#GGuXyMNDa%CI6zo#p0Rsh}E$#Xoaa!oe6! zje$1S6(ifYRO(0!xh$ZOqmTL`3cHXvitCf;E{~RXmovL)WVa;@u`sy9uspCnKyD3y z6Wh_n2%R& zHd@U^Zez90ZBofGaadg8@Z|B|M{3^uBwEqylr8i`5zIswhcq0tAJJ?7uorpwd?T=2)1&a>yQ**=bN`q%^Uy?f^ z8u5AyEm7mW5B>gk_pRudHs{dMd9!eK9{Smx-0a+;z8DN%%vt}?TZVYeq>5Xd#Wm+1 z+qV4|=W0rit$6VMUtAxhOSK(thwUXdy1%-}RCm23KX`VKs!o(uewmSPdkR+J>V_VYDm zWj{Vyt5=WjEDi2UeTUPPitko#ww}e_usB;k+Sxx_*Pb=3%2C(43q@3f>TmW^0Y=x* z8T;SowjZZ6_JQ5IA3(-}53$bUlJFs-#cCMjJNW)vjQhPUMn+o_$1Q|Tx&hzQ-Oz8G z)PqULFl`Xy0d9VThef$~|MhsMmfp|v9bCD4K)><@7!O#1nE<1y-wk=%8%BX+6lh1m z@lh~!6m*S(#!;}K9j3HHQ#<6h!yoHthk?Vj@IWO@N4j|v95ca|LgX>^7FHInE);%K z2uBKGCl^S-Y-r3JjOjP&NmRd6k2KR>9XX1gH!fBA3k?k%AOxBiXdv(rffM8$Aq}L1 zkgcO(n;zzCV2lQ~=fM#X93fCMeAsYvb&aOFy5?v#?4fxC)2qqX)i7$rLnHQ%VE!@! zb_|1Q!yqyYT*E*#3_c$AH- zV!v|Y8$N7Ab`vzUn5t`Hm`7wW#bUnV3e1kiRH7HfaG&^5FV=5QG0X(aT$>pGTs#7_ z!{PJc@WF6+dpI27SZdyBgI42MBZ(Q|b&diKO@y&JXx72&)VG4U@H!2_Z1`poV7$^V z0twL(8mz=H)mbbL!~b~%9H@i?F<2Sf7$f%@V2J_d>euPXRJ1S1!93U`+9kr~&Deu= zH6g>QE32)o!!)g}!_KxtYkMVQN?L~&P?lf8D8JKV4M9l2s?j+UF&x`T)?#M?~?t4+9bP(%HV3 zkd$Tsq^^b$w~lceCQkG5x{u<9(|-8&W9Y%GMq2taFrGhfcSW&tt>g$yaUp;3H$^WGbFA~YFew+zy4p1Z!THd4;zeYzOsAAb9{1BI<|dPmc+h- z?7yL^6WDP-OY1Vif*0c}j`%?D!%6OAwwm^v$U`Q$(*$Bu!bH9>!8y~1Ci1cgFfR3^ z3HTo82D9+FJXn*rC2vn2voH^u^Lp~8V}W2^G>;VI!9FD{Q?65PRWf->H15Y^26e<{ z4!G)&SSx5W3ovGl$x)^2~(B(|n>zf3+@^2#r5; zWrk^GKzSzkYFf1R>AXhkK236kE)X?KS0>)2hQ?z~W_K&RJJH?kz$#3>()Q1ZL{Dl| z>YuBOa!lm0y@nlr7<&SleQ4Qi&VahwPcM&7wL4Yrr9-OjRAPH-+}YC6EWrTxyL?A{WTEdKA5r*>K61(jdrk153EnpS#q@6zlO92sqcTzxGn=siz;NMs;myJagl`J}gjtb8aXC_l3AZ3=^T!p8rHyEhMzsyh0HZ=HL4-+Ov` zW_q^nnVzkCX1Zs3mL3L}Mqt=fP}va|R8)uoRB(wg#ElTQxS@dNF^VW^j6oFKc@&LC zh(2+N3z+3ij2cPuK8YGlrg?wo+RYVK+n{9 z@7;N(_6o;&=c)Hh>>qi(D4>URAfV?9UXbBm$7jF1@aEi7pR(kFC2!G=lCeFU?~@>n zM@c`+Tyas&`Wj}dCOk~QTc}&`IvcMtYbJ|;lP#6hTuJv-(0U7sE>PS|p7HglhJ=SQ z;Q5f?`m>5jnKU5vdV5(f4@C&t!`@_D5=(eY1V74ykxWNAlFFD7Xt3E%*Vu_On=R%q z=KL-8P^5t0;z?8~j_>7Ly~=Unw&F`2e|T8%Vfd{c^uHd%C#5G$o&DNUb7-}&~l>=)Y2kH~a|e6zeomSNA?WsB778JIb6 z^1zCL>jz8&Lvb|;VbEXKP@TkE#r9gi-lF;RdS9^5-O|u!y2a|f>RN2 zD$>+#t}BahPDM-(RdtFGmqPhNgp&x0gx{2Bg;2GqaGo0Yq^@B-I7#DL$%UQg(-KvQ zw*CcP=dTj8^n{b4ZNVmJQkNeu|EWY|n*REqB<_Vi6;hU#ev(=JL@V9aN^dmN&v4d6 zW@&a6F8SF7P4tJRPn%e4fRs9$2h}IrJjh`_gv<3YQoXnS&U(2Xl_-N7+Gt+ex;BP8 z(zceS<(_YO9`HQrQ9>TFdFV?IeS|nkzu(;(t4&li)Yc|gpS#v9L*DioWepEvu}Zl! z72Z_M{k#tnxo5G+p~j6S^)d{>-)gX^aK5E{!UF#~4rt}n;q0<_8Qz!#JR^C*{4*w`7(qXnMJcz3JuENP-Q`4b0L&O4#O!)yG(@*%MAksebOSPu9pa z_2G(H@YoMGZ)o1yEcbJdedGxbE%2P}xyU2)$~Da6^SQebZxyJIgxbw1H==SObVcmS zd7k$QU%io6f>FhM`g(3><>cY)+IXzSU2_<(Ggx%vgh_V{*p#nuJ9A5>5)#I5wfd+& z^TIBXU1BWW9Pu0z7sHv+yA(qwFSxpb+NWUtSw&VFRP2i1F=}#A1jxGP>ak#5B@c@hCIFr>U?UO-0rebd&?~dX4h;%IGmaVS3j1sl`uc z`KYX=wFNKj0)ar8zpb?`?DGeF{++GV8gTi-$tUde0FNDm>b*tXsM~87{Ga*dd;L58Kl964rlYsqAGkkr%lEo@f*jf8 zqCdJmcd;4^)er@uk~3-*iHoEJQraNWMAeu=%EYPjtMb&8&Kfi-pA66c$>ZRk<^C`U z?--2!FeddUI@&X+Z&Bb6`vLAO=5l`+@_-rqVN4q8udN02U_Sq+j@|UOj$OJAdGJt+ zDC3lw)H}%0%d9((UsM_q6qJ2B1+)>BM$ls1L{36xWAZda3qQv2l<@KWfcy9)FZy_& zycRycJH^lQ@$U&SMtDVyVgJPAwc`Tcn}_V{FRP z2lP>ZUdhL3YT(!l#+VwYujf5Z=JAUj3krOUCd8sqP`d7IeT=Q0oP^8_Gd6+U0X zg377tSk(CfmB9(gByW+<^9z+>NO~SE2s=oO1~b1ES*6yr(PwRRYa5-{O2JmLv=TyM zQBc;>QqjWZA@H@D=8I?3ts?XMjB@(8oZc(PQ`!3iY!Muvf$0JEUf@pwc5&eQfu9HD zvjVgrKvM%WfN$V<*jOgd$ECZM-t*EWUb@^(tKD?En{IL4<9gI3U*$s5QaGsS3lp8s zu3+$O^)qH>bS3)~e5DJB`GnKHwwju%L)CTBra&~>R4Ixo)kOVpSk%`l~wyDVz zt*@?aWG0L3@HEM|H{rQs2ZrFa;65iL|JZ|9IB)T{ws5bjy9hr#B2tjsLi{iPgWrfR z;!_+c@trv8h=0W1q&}fl-Rk_9qduDD-VJ`40@KqMDd+Xmk;<4p-L>f4Z>K#i-oWM` z-}u6J&RN#srYR%;6_2quv-=h=nvN_Cr)>ITOKi~VZ}ptF^Sreu9oOvk(2CFTOk~Cd z*&VKN-F*xB+PVfO$98!M3tCXj0zYF#DfgIefQ%g_BnE=4`_tP~&Is0)p^^~b#{m8& zWj)}R2x)oStohU1Q~nkeT9?Qib}scQ_MHBJbanP{^o+%eTZH86GRNl&FWKuPtb)x~R>@TT~mR9%IQ-F$qnZ z*Aoizvv#}P8Ce-sbty;1)Fim2jRh?lT0sRZ>Wip+7yUX`tYG8;<6}AWiK=li{+=-* zQK_k`Xe^hZO@mm$c;U>o(I-M1p#?VaO3ty4A}Z~N-dCO!vwn=A^0pMvXT2*eG0bCU zo(9H#3#8^YKI_tng2LNiw8%2uKi*dc=$<@&K&#mKtgG0s19q`%phu|zj-HLus44}% zYp4{i0|m7{)xZ!Z!I&X4wU~85#hlJjIe^;kR;^7c6^nf(6pD(bwWMP|6t#aoOsQjwT+K3c4S z=B`E_u{$!$MIz_&Xj61@RK6-ow;~`ROk2a$5T^1l{XI;74AT{1S`$XSBEs{5v9_aa ztkTA-KW?(}ud!=DO|;EKn@r?&*49;(OI586bryVESHmBhBa)|EQk*q~4&|pLapj2cd;Mvg`ba3%4JR89*XP&C%9`}ZHP@cD^tKCk zQ!hMgDEh?H9F1gux#5g;vyNVlEcqv0^Y95r@i%eYmZsl!j=$>c$rB)@mtxgCp!^Y5 z#uUf^!qD;a-QZ2TG(ht+|Jaz`mS#vsa!W5=*@aqBbYBClZ`jy?o81jz9#(Uk^FAkg z(#B(6=M2!CG!3U|cF*ZO?2c}_x|=TUCTBPOql-T3qL;efMtLb7Kz6z)%s97!rZmvp zdYW8MO|D+Chba{<+Tx^PCk33Sz4LuL`^Zi&+22OZC?w9Z(J~9?@N(0)Ojn!aO)_0A z)5XYXB-2YWZDe#cql+1tJF9BL0dHrggFne=4oicnh@&|YPei=lJ{~T``XbgyM0v>k zjG6t1nXWU_3iEf&Y`+*ZekFodp!N<@vApp7$Dmo#A~8=UM!;8%ex*wpD&B zr_EQvclbfu{ls^wbAa!C{Euew!ikUDWK3;g5nC;+her&+p`Rl7^7X`4eahX*;eGEM zHT#h(w_&n}^to>7zwz#5)yjc^JtLQ-Z(H)c3(q`lXn9(b>>G> z8-|x$IlONfBDZd&s?_kNb1s|CbE?&eS^p!9#{qgda|lUi*7VRCy!1gC)-;{QXLW9x zm8FTL>2GQJLz>=7^E5T)UV5~LhI^>IhyKv>X%Bk~73-4IlTRe&FO&36l57cjvYozx zniB0at(~0hHSO$Q?euXwz1>ce!n7ewH`mjedOD+?OTva)T7#!RKDyUK{cdV>(^c*b zZZ-$CR~>{G7VUOwwb6Yx+GL~kHi}#L!-|jis=MFBu9lya*@rT{E7Rlh%Q8c5pbR53* zQA(zt>V1QTif3L7`6eLo;1(rc1fx&`D;RX{Ju|cr$z7OuULG+iZTo%q}*6 zKQByqA>qY(b44arAxT6+t%9eE*52I*`HKsljf4w}5HJ2IBuc0S?OXkqs$Hf2QiJ2B zm_f|AdBtDwRH*ktDZJrPUHF=enRq%sU7O$n4`Mdyh1ZWd`p5UqIcn;H+i#l+(R!gd zb;WIoY9VB|CC9D2ctTe)bIHo_33}zf&%9~-_HEyNXv-CMT}8LXWB*!z^VCzXobeLm z?A`Bv^SbN4arqU?uehbatB~I#k%EjO^S&5Gvq#k-}MbBl9ZnR2;H3iXNLeb@}{Ls;%`cHbqvNBPN&6RB_eim(4%>?$;i8U^t!L{NZ<}Oqej` zyL0{$i_hyh6G@6@&b=<)QZ_9d=2?m&v&&Wt&%WdRbmG$!AAFGJs<(%BKKF=18kGK? zc`%fs@-BL`leToyuR7_G&gVPXU7d7KJN2PfPOLoE6q7eMldZX`d0O*=W(75!uL@C1 zh`y|(4=d@K^4rTFESJwNzo?v{X!H7VJOQMBHifZfMxS-iZ#w9|I%s>xa~*68e8b*& zq#_xX5Tj|WJ}FHz(=c- z^E|yk{kqO^m)+c(_=)qu2NCbj*Wq#Se{RD%94CF5d3Z-Z-PKP`{q$J>i~a1p{>%H> zj$XREmrh90h7?`UO-sA!?ryrJn=b66yF%MT?26FMD4!Ri*`d=z43)MmA-bz-dlkE) z>gFo8DM(ibX?l?2K?((FeUKKFQKF3OW%NoJRoOP$m{K=xz}uJX%kdFB>8Y-3tZ#2m)>`1vNBR!`KxI>FQXbGA4;<9YoI#bn~xiuqZhX0!XUJZP1^!>Xjz{-)m1t^h z8lx>S+R#cZ%~ak@mS*~_nf};JZ#E-SxhPM^9uK@6U?=-&hM&gxX|tc!`{Cj5YX4~) z{h;m6Hg;~?Wo_)Pw(V`t;VHelEYe~Lx2N0{;c#`Nv8v4(@%h@zBXy0IcI|<}K|ODl z2z7<9=NJngCTFc+pAd4v-^GhHR(_3)R}gG9+x6dMOBXob-Dqz3HUqoiu>dt7gg|^(ytz$#N!rJhKeWUWJjIUTT$n) zx7P)#NvbAPv#jmzjVzJ z{;s@ebVvuz0$UzZ)iX&}p`Dk2lMiPu_##f9x6zX!+7!A!#4ZedFT~yp{VBv=4w2#v zIN9HvU|iaaqB&q)pMiDZV%CMhx-hcmgL~l|_aZo&f_sq$b1b59F9PmC(Smz>N^y_B zM=NHZY8ruwhv8c;;v>g5qefjh>F9qJM13#>A#8Sydl|;l9NyEJ!n3`c?d@fuz`2AtW#&a@ zm6IJ^VU3NF)hpP@!wFb1FGsU6tg$gNXpcmr!DLeeY>d>#d1hp<9T{iDF8|eR)VL^i zd!3EkE;H`y{|*-m#BlO4*=a@b8MITxXQU_m*tm+H7#)>ilt%86zY@E8A8JMaWosv` z>!kBLX=x{Y+DZS5fB!}&!%y?t>CrfCiPJrC+7PGSI9)8#HGJGm?=;i*n>RJHMNMRH zqD@US*hH}=+8F&P%8=X~FP;~K$r`2)!_?=c4IaAEL+5*_+|%Sa!y`ZHp)DR7_RRG# zi-*p@^BG*H6a3Oh%rM4|G}HKI5rQ0Eu`40l7#n-SMhk2-6)71kv{7WjM*6Vs?$!kA znU&RrBqiNi=cquHwc4JZhK?O&bYt0FW$cPFI=75wmz|DyGG9#tGA(p8@tV0%xo}4d z;pW+gFqh)MzV9_W)8H=&)iV`Wy6X0yH_iAwa$U@|asG?=6-Ot|>%!EQV5RlFaMbR*QDWt*SvC#-|mUUnq~7Pr=7EI@ti4r zE57j*t;qfw4x5|Pw7=G-d~)FmYWQN)HEXX}zhZ*Zl71%Lb5ei%_<>7KTD|d|i&oQj zV7%ewGG_TSSO;98Y{W)Q_sBU>3n_joD4sY7|i;VACsJ?|- zTI!<_xzZgDNGoNMJL)4VkWj;CmZOo!+_c3_H@WG2_Z4oo#7&djv!S@0!34Z7Z4EUM zXTcL1Zm@|t;xW-Y`Vrw!n4;bKV^4Tg_ylpb^QjR38|MX+Vd0ks(pNtt&dtLQ znXvgq8CBM;7~vN+FzGSK&tXsT%}i`#mEkbTBv~`oS=NWGzp?(+ zYAzabSgHv7F;axpc@Zdru|~vLBR+F=PQx0Z{2`LN3~sKh@9L@#-hsy&bf0puY%zT-StJiKD~@|y3dqMl;`J)dXXN8i zkV?W=Me@tX?+7xxo$bOun%!=*1oC*Y!VBj@b-mAX!GJ5&*B`71G&UowT71gdC*4OA zCa{S|y{mqlqkbq)Pav8wQ5jM{D5ic&MEjMC*=y)iiwzkOf`FE)Lk8wILRwM|s|>F*c*B<(9d3I)s-t}$kt&3yaq>Q|2ktdW(>kYY9~nT%pGDHCuNU}EFPF%$ma(`>ew zB*ud1?K2OwpKQ}n+8@(>_$K>H ze8KE&2j&qCbCuM$-D;IE1sR*-bSii} zD-^H88Dxninfc>e=Jw1Rs8YOcr=N(rz?(z=8+AxlgEySBR!Om&nabIHxMxwPOl;41 znHGy3k}x5&l?TCAzO%|dANfexjajLXYBF{&n1Jk~Zif4`#J+u0$xA0fJs=+e#t|$J za+z1No?tL7V6w8x=l4~yn$@dARX(5ZHj@qWy31GYtE@O{aj@JM@~tyD?I<}UNyrb9 zlYlZQoN+0N*9kc=yZv^%UkDs3;fm^f-QcJR0sfF{WRXsF3pvB59Lhe3?n@ZPQ4=Q~ z^-lJ=c-x=4xa4v9!rX-nTwq1=B~%*9UPHbP0RzoWns&$jggk5G!9#hBa_PQY?`%x(vm(6!svm(WR5?71Q>2BNSj$mkJ8=7pl723eza!Dm z5ejvb5k)PFZpaiMr<3OX0xqc`~EUGt?}@AQ-23t*u+bdsOe4mjNi*2%^vEHoNTg~>{h0n zTsv=Q{G99*h1qN-n|yMlfBc-e<0j0hrQZ)U$NT%^ZGBl&UwiXFUt7H2G-qgD-N}l{ zW|K{(lNHw)WmJEp6$3$lRUakw@^T zQHo{!Qe~ZBOUYx2b*z?cp z0^TP^K4PC@HM^k++-92--Wk4*@mHNfu~pzHF4x$f1}cA@OzuPmh^i3siGBhl4GjB% z;g|pS`hZ>jwe`X19RZm_#E!uAmT~##m%X;)F|U)MOO}bh85Z8AIT z6{wAaHI6!$up87>#Fu&sj1R(kw^*86uqWwT6IZ3|#UPbO9`9|7CT~Z*d^x9ooAXoVGe#VcP{>)i)c4tS8rCbND;^1fip@d zS@}-$YRpZgG&a++!%2@h=nBWpjx7#(y@@|~l^<8=YGpGbMdX0RBiYt6KR+?OA3`_w z@B+)~A(fj~!rn}E*E4=p(HtS{@6E2Vrvpv+;!_^%8~L)gmnmt}-BItIJ|DgWEbE$@ znn(BK2?t&6*z9<~AtOF}y?vv7n_Yf1_oB!n1uU+$CSR~*PqZ-VAqMF!GxQ|zbeXGJ z@!@Mzt|#W>e7-xqQTP?^^kyI8T|r-3m5=4Ef-CLFu6^1zUN3M{8{5`O-)f~3TffoD zwpPbY_!W(d4NI z2iIEs#A zJ40Y>^!8}uRBwIN%Y6Q8VfF{r^quTLV3`;@zBaw=YDu@WPWZ-Pee1aDvbNMQgXv|% z;ih9fo*3uGLcxuN-t6Cfp7y%(nelX0Yjw-uwB#fgKi#%MVz!#sNH$T!`i4w;TMf;x zISbiYYN)cNwI*F7-{Yd4c=hk1V7NKVUJTRDFx|tWsCeX%><`;{)M@7~`Kj%#b{xK* z+HP*OJ}Eyf$x>2&I^&JkxxCHK;!?H&H90E-NGm0HvVY$y&YHJ`i~D`NX~1oP;12jB z*n@|3_*NW1V1dC;Co(wj(};G`EN@44(8!0P(Dc`f);DNW5ZJW)_;Kfmd;LkAXz z_Tf3n!2ukIR;AE0IP3IdFz*!K(82QxE_UqUY4~$j~vLd2DOY@&>e{YbOu#PcQ^h z#(PCn;|~Be7jgO8+krgPxc(#p*fl7`tttyl9|MZVyjDo>B7#+9=#Zs>R7+zqJ75GK{*lzL3f#&i*~`#V z$739IYX|QFhw1=S9%BWdb_gg;Wt+2BhnkoD)PO5!c`cw~N~c>}b(jvoeS-3o`lS74KI&_wsTg&`;}Sb`L&kIJsr~&Kk|s=u$1$Rl^5Ylp z6&?VF8Ky2^7*;U|K3t0*MEkWF&j}~AwV{0~)!2ykv+_}$qWuqfRHxv0i^_4xmf$#( zQXTD4v@pD10Dttz$37nU$T^OnZ_aV4D;@{{y2rrrAA*;N7)9R%?i|NC>bgdqPnQCU z$5N^oImZ#jD>&5^cRF>bAA*~CT;Qe#)7>E%Fnwykl!r;in{0VJQ;c}%poS;eXYA1w zBOW@4*jO=hJ;wfAYQ$sNui@!0=+C7_JeK{xQ}Of~#x)=OPncI@^bil^nE4oZ)Y#?e zlgltN#-`?HTu7+;LghzjF_q64Z*i!dx8X}JslFg7ju0-U0(aQINd+yAOa+nN2{GSd zEE-Qp%Jlh}&i}O>M(6?F`(Tc5aYR$-F!Qr-72x@`;4NNf7T^Jl0gnm;F)YCI2zXn~ z`YhF)Q_?$99of{_^F?zyvE*rfp0|+gwOC8y?T@8~_YLqOQk_Z1AKlUd*`AqSJAnQV z%-s26ndrXx^nRN1>SaG$J-Z!uKE?=7Yg`k8vOlvcsy<@h8MSzJkDO?p+^;x zAvtFBNh2(*Ylp-p0yAoIR7$L(R?TeQ!bUm!mf;L~r6+Z?tt! z()3A@D6mf{=shCKm2(9A3=KXP^*=PAD1aYZ0KXiodWDb$fj_tQIeIoxpXoV(I!CO1 zfz<#tG!Vh-163z47k$N>0NmYiP8eT;OrOO&%b20JVwI@<kbO(!uIbSdOT1bYSCY{#PST8}74`W4tb1jPWq?RoGF*3 z{{DKtCrR~9z##X4r8Sz6C3^XmE_Rp&z_L;7ah+oJu0{Slt5o?ooX-1pPMcO!1KAla zkez4I;wI7JSgl3wUD4RFem~#`3g8z&iZ%*a6BG0EjiP&Wx#6IcyUWBaH_ zhgyJrCXY+sLr9uhfay~MCcuc@AIrYamcz3a)aHvm!4e_9t39L5Zfiqc8$JoBfaudq z4NA31z|tz@x!2@h;1ZeuxTJm+m(U2U;ADNq$E5D=GCXvV1a2Hn^XySqkf0+lfR4Zb zIsyadtiaHg z@Thw$vJx5aR6<5}3mM@qM=q7ax;7n}D#KtZ(nsZhe^%H@APDVv?O5#<(lK*exbB@^ zpdAHvq3u-c@9I_&Nkao)g+km``JaMeD115oosPdQFwPoc%}VoB>MBq)z7FCEvIcEbD%{?L-c?|%^+W|3MULeco6x%|ox5^$&<1q0 zR^1JPkRrF{C04X59uMq7Z9JXYc-jqg_*tiTJZO;{PrEiA^i7us!GmHdfBLtnpv4iX zJOU|QBvv=dbc@xk?Ev6fPe%v#9K$Ua#nTZbdR_e7Zjc?06?{unQjm z{6c{pHVgWm(;eNA7_47Np*{l`>3pm;WZ=-T=T;;~PU5)DXZ8U=EtD?+6vxR|P1z9f1LKFb4jzSL`ZdC$?I! zs|c!iIg%fW+I~KCLVh$@@0d4!(i&GVmQM|10n9Jdk#reG@;Lke0m1XWLY|{2^5lsy zH_32{0)JjT^lLdQcs{p~=Xq!Y&mRXj1ImxVO@TefbB;WMcgX5kUd=uwXNAt;IE`A+ z2qk)I=9-D)3R?fHt{)gtb7%67GB!KUWU=BzUri69g}}>OsOzV&jox3;Mx}CTj>=zh zR8BZXr2;>IE`tUt_vfgfMUIN0O(7M|7oF=;zqOQILrwcn-Pybw!s2CmlojBVY-cYFwd8W zy`S(&N^zRCF}Dd%IWcDbJ$S0PmgjD}2>57iW^? zQ0V-0udiqHY!L7_Dmwv>(--tH;8iOx-Qt5Fk-TyI+JYDz8LSY{P9HjiD%jj|UMPB++x_y;`jQ89 z6Z)`4$gIF_=qajQ3Zdmvlm^tzqNg0Ev8P5TEG=cN=qb2W*wg8gx^a*z@_?KH_+_G} ziwb+1hc@(7#m@Z?D)vI31xG*HXQ5Kyc??tv*HO+(H!Igdry->FH1z2#F@~|lV;D$9 z;65z!m#di)IJZw!#{d&USpNelk&D5QCjoqX6F!5inalS$f&H!g*&LP=6M4$#ELzvaZtU(53Fp z?574?dEHuHfay~MraVlo0nZ%h=)7+y4}7Q8_I{?j+GdWM{J6q;j80W7OrjU>#nkp8=MjS`CngQMnl3G~(~6Z}Vn6DL*Jdk>v2ZBT9O-d3*{R;^(K zz+Vi%A`jo$Bj61uixTjY1iX44nVa@=VO)r{rF&;yk6AW~YK3;7DJGMYhpxANy#%)uPS;pQw z@;9#Q`Q6c!>`E0e~_^c4hs16SHn-r9t9K)+hsOx*P-3p?cSbU zAmkV~jyIIqv1&`01(?%fTE~gD&5z2sKHJ?;YDcNdBL> zis4t}WxSnxPlybDtP=1>nVldAFlJ~W^m8!{qs)%^nr)0StJ6VtF{8|m8jDe8bvh;6 zaGkF4YZ$VtufgLcaR!JR-qCanZB8(>nLbNxgY!#48!m4zi+v!zuxMqxoUu=u1ocCt z$%L+(jqrwbu_t4nHA}#2b6*NRzba<%RS`|~@Xzhe2v)`a$~b1s;0PEyZL~BSspi+j zVX-VaJeK^5I4qVU^d-L@4vVF*FGBCXEcObO@A_WBXxE{aGma%oR6d-ijzGl1jB2Cr z6}-)!jN_Z%RNE{!v|%pn6)VKL3u)^vr~5-8mogSha%((T z0Dor@{G>y_%gJdXz#HIYQND%PD>f9hIZn_}t<=`9Xj4pQatS(BN1$_j2|C4Xkl{f7 zo>)UFzlIHThPu`97*0E4JQCVmYG`wUflhk7+QyKrPUs%2JKWE5`>VZpM|wSD4~NUk z!Rjt;Ce88)OWmifO4UYgDTv&{9{@s8$8EaI{rkz`E%N-}Z}f4QJm$2h>&vGLG@% zIV%{OY3$+XRwo!*y`6DPpRTsjZ2-Xy^`3*@eM4h&s{wShvrAJYzfB?i+8VA7%uz9X z&d$;kJW?nxp(WsP{!-TtE_qUd!059}F^$}wg*NS4o8o=0xXtAM3p%+y>o9b%4wSt@ zrn^rs*h|=!0VJ}1iL*W8Zg$MZy{v7m_|;X&}KkuWArL=KUr~`oIL#-baL`^ zBsxN`s{G=SinRA;o0CK0ayv96 zY?`roIXu4z{V8Pn+$?ZczSVw5qRPRTYxUQ~V=W$eV6oB@oTP$Vy6Jcc$#8Jn|6ZF5{v8!lt} zxNc;wae3W{2w0NZ+f4|`qH)?Za%n+?KmqiM5q|4ogzhy!<9@FIdeX>kfQDYg+ES4- zHbWN@U@wM0t_1u<1N@~$_$QC-&f!lac;^f87sDT40^W$9%lSSo=NfNRTUhP?^yw;o z&3qPq7E2NQ34%L?@F(Q^ulW=a>nwbbL22UmICl`?*wZdNiiJ1js&_CCeeJ^Q{Wb7K;TxR z6R=yv!nhqTx{WD@)?yhT0=)vdU~i$d!UpHKxt$B#d$gW}E5)gx+Sn694iuas^3d1* zRf7&eGovRJMrh3r0<^H3a=4iktr1p}A^$W+sahv_Xbm@PCJ{r6m#TbNVyd;Lvj`GqNgs(h@ zp&?VINXH(JKETA&UD^hxj2e|$+za75FO5TYaUT(f@THf=q4&e+CKtALaX*A_y)+KJ zAEj|{Jbw@W7xqhu_M;v3rQ3^>qSn4WV^^d(3($chdhSb(MVuc?;5vdg zy(BJisw{!)2sa8Paf!2L30z;JUx%vsd%)bCTqAFk=8^y<7~mN(q4bT^HDg2 zZC4UUsapVb-mV_W=6$MMZV*Mffy-X@Lsh3B0PCoF+}lf|U96=s2rp|%45OW{r7;M< zYYqc+iYy&H3w?koqPs^8N>|k>#p4k6VQCz?yYz@SgkQEa4!s|Sjl6U}g#B0=hu)9U zID~BoKeq&(!hNuXI8Ho8v14+9S2$1RPclv_6^?>Ubt`jOKqr*oacq!UkJ zh#KR*#$qS0ITgKPT$h)b2doy-fTJ}wJfYD)nrUuVzX{3`CJ)>}x z@+zx5TMhZhoin+7LE1NH`b$LcO*^I>Rg$F9htAUN#ksRY`_YHc((NZ1=nJhgZxQH2 z>*$9?!!cG}?ZqQdwT`;$7GThijz`2G&ZycL3NYw>Fdja|DlP7Vs&Nj}hte2?u7J(T z<)N4lXD(OyQ0g$7?}Gt@IL#VIp<^g@w9V<7+}YNsYY?DQlPP1;q^V7~>nuL#^0tRQ zfgBmzijyv=kY27PS@UUaf6Ce`j?3T+l6b2v*lYaeHwNK3x0Up;c{vX%T&K zE-ux6)FHWadvQ)aT>B#W+z!c|n~k~vyc6SJvQ!=as6(_$-%`|GoTH8Oi`(Z8)uO$2 zuJ-HaYU>95T%G*N$Q~Z^t)0T()}h-|;#^&DKGn`kIEx9}ypNwxso=CU{wQ%;8hwP< z`i8Ns;!)Ltn%>fm81arSG!$~Ho+0uyaPlmqF*H%o7=7?JjGsqKY9soUKBBR4F(SM* zFr4NEH62>&lK@>v?U>^Pwb6}LYCd>9p5?Dn)rcMb%2a)o%B10psJdsUvW631oQ#JK?B$tH_95v6QgDb29LUbd zGj5=oOE-I=FB7e+?+m(UB_e^D%7R(PEUI%ylF4Hl6TsRBE4k~?7Re=*?L-+ZyM;xa z$gcp5dk=DaKqFH4@LVo(S3lCLEJ-%`He-9i-2KRA~-c?Ey2-gPK5c4{wb*S{ZQLqaLJ8mlBId_9C@BANk@6r0o}J zU-f(!BBu=JF6VFQ{2lVvuTIyYoHZ&z2ckY(m6*KM^a4iNhF2}`XYSk2m6Ak0k_p`j|M8E=E%yHj+H5%c;nz(Bl|~u1IT>h*V4kgk38PUeZo_p zXgm|Sa=|iu@^8Nm^R(nAJiU|2@crSKT9IssBohq{$?OUGccwL?_?&&eA(4zUB$Ex= zC%>an&s5x(#m^zopRGdMk0@8?8+&7PUs@TMN{# zyso+XJ*T~`Yrp>$qXI7KS0YoX^~?S+GFz)%GWn~V1zj@sNK3vWa;jQN^@ufD8{;y1 z6f5kJa)sUbUU##_zrSmCQIA@|DOE2erHz?o%R(22z8{h|`S15X;g>b#yFuBiJf_Gu z%Uk3fvivN{57)(aS$Q40+pP436$-aG$j%I25L_pe%pZehYcQvGqw$8e#3&t;0Naa{ z3zAP^YkOnwVqLd*#Wwe~6w0Wb@Nl~1w*|9RN{u{aU=r>s{KDrC>rTBPux`+AHfltO zPEp(t>IujzxOJ!9CumtDQ2M)GL=BZ2Z6OiGxq@d1;LuphYKDM`hrX$22uP<T%T0v`3DREe zMB@TJQUDK4QV<(t&^()Ru|$U0pkjD~=E=jiYno^D`hB>TY6GF1YO%OO%v)=#5Gv&W zRLY*WwB@VXYq=zK&?r2auE<)&a~uX58+kfnqeek4o&K4DNMe>d*jaDTD4x1SGmo8} zXgnsFjPQ(KMVc<(BcW7OW#KzEu*wcODXNbGZ(JPsTZN-Rcl3*SvZWXSArvlG5>yBz@ZY_W#o4TPGNUd zZ|1mm5%+l34g9Q;!R=YcS4P4J?V{fLVMVCWZAlR~gR~R*HLBtk+6B;DyYO?JH1W`7 zx^|g1P2|Lq;$3JhPl8_1{mFUl@)cMN+U4k@ySlh`QL$u7WBIvwVb0^8A-J##di6MF zCdF#SZ79~Vq3^};E2MxPbJo~a;`UVVQD`rfGr#&wA!_H^l(749vH$GQk23boP6Ylj z(&70_HF-qdW9mW{&?;nno0o}&SBA=hRUUuP?}=6g164s!RnTANlvbKERUT)RzkIE` z*0xe^T#0;oI6Zh@3+?OX3EESk_YWcsFLs6hTxW`luiy6Wp-NOv%V*N##{r=g^<;iQ zJ)a)`7kN)-W2B24_8-JO6`xeaJQWA4vinp^zcHcAY)o`T8WM?V@xb0-8UGUC=YU8O z7n;Q*S&)hIk)Yeoih$Qu;qpcU6@fs7H&Een2E1jBD>JpOO5fUm4}uak%sqnUU0Y&U4CEQ>CfZ^pfdq(}yOr*Q!)1tqN*6IlK-w zmfO7+XGURb;T9hf2_BJBe$`1R8hFy;lW=S+w07A&dDGUg^+2LkFRd0Az|T_fMXC0; z@N`d^Aw1oqg9OxbhiENMQX;BA^LvogHwMkbIjR^xA_OCZct#n6 z|4EA4mO?3x(w#zURRL-2%D4gb!sG8a_V(%ZGPtBTI_@AR`uh2B=EsDgVs=F1v~DT#$X7!gppLqWFUQ7SNyhmnqrb z+({>9U%~fT|AMvj=R320$tx|F7AmJG$7
XBtKA@xf`$V@pCZ*xzU&XiV27f9cc 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�k2XSX6y6eJ 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

uw895a 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

Q}=hWIKKksA?Iue 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

-YWPo@6h(^ zZQJG!A2GS(7Y+`liJ$1}d}R8-=Xs|FbHvy3y<<--&R-}vM7 z3P>d8Q>@2S!1vMTd|zg6*q`=y`Z>R%M$xL^%EI;Tbk&jsX-trW*J5AydI#{TRd7Dy$;h3f2`fyj63kUeKnXO=2 zj!s9zIG3eVd*&ZuI|L70@V)7@Ww_s>Z$LdGLvBxm9AGl9Tq&Q?*;}I3%;_xQ;;Cea zzhAx}Gj&C0BC)iJnoe|Ly{dFoeCn#!+L|TRIq{o{+Qln5ZKC$VHQDh)rcD^lmSY&{ zzar65H4VE~k}Jkf9yj{L2r7RCPog^&%WQ|Q@EGXkLC@`1GgmxcL0!&tl-v=0G|CQ( z&X2OGC`p9Ljp6-awlzFE%%bM&CjWzeb`C7BpAZMlze57|GV-FCA(Ppr1EV5 zeO|(=9a4>rH!%@jmPrUej3-C{k*?F`#DiR-JE?!r!5a+_Ln1`eTSSw<`g@# z9e4ch?RT#I-9OLb)NK!){UCf(>4Q%YWmfIhI!ckB%>JR+7=8VBzkT(!OU``&vOgKT zxd1c{(vu3$nBOyhW9AfqX*_P1jDux20*L{>=fLT0HE(1#L&LEM^b|7kq3j148-k=L zRo+245jDTSbs)x38Y=h4k5WGj^_Qoi{CNiZCA&$gvqw{@E$x4px$eRx$z=bm(ew9D z*jHQo`NU*)eQB87-Z|!~P28p7=n47Ag%fA6E-Go5@dn%qT`?t#1YBgefCl~*95g}l z70|#G^XJSSf3haon&fUulC3DKi6`Uiuu{TB`3iYO)z%PM9wOsHa}ciiHy|_S;f*`! zag?Dso%Z4^=eGF@*@G;|AfOhN?KFOiSiy$yhB3 zB9<;;ZYn32m6L6Vu~WQUPQI6u59K5Td#O}0ye#L!3I-GG(MSjJEJbStfmd(=RHQkA z3LM==0S#uU#_@eA1rY_JQeG0m82A;UXIrhui7d)T$y`el2DH8^;yl2Hx1WYBCvB{nU~WybJp~&JSE1N(0VJK!iiIVlJg-?ULd8v%S_ej zLe2oXRQo-0-s?B$eNrPVixh=rKD}J;bMtZ(#LL@xqUY64ztjkI?}xtiBTL!tg+-ua z$-G80>r|s5m(j;7pcbSyC0ds;UjAgc88p36Z&o4Jnw?&4Mu)y?nWwfDU=%g2IHNYe z0!Lb`JByp?X;7-sf35Tk9UuM%U-ZkZh+xr5*Bp38eKI*6C$q)c)r*}Zv9zl!G$TUi{WIqldysQ0MD{+>%JwW%-^+i$SW(+!hr)Qssm3zpWo{v1o zJzU5`JU*3;=aojp*+sZF>cLTQ$|ETt?7&fB+7FHl3h^|C28(wm&`!YTe&H@qkM8(8 zl!WKdFlN@Mm+rU{xB+$1?>e&PGQ?#90Z&XBJLhrM5s9AoN{p^S(c_@#AD}TJ$TMtP zjf0z35>eHv*c~boDgm-cl*&>%Fl&`|o0gSQT}vNvTHYv3AhkHjM@}-=Nz%?vC%e{u zzMY+CCtY@8v6DyaFW6a>mFeK#k@w}~Mmd=y-zH~iogZtKld&@LpzIkLd!vkOqm5a7 zMZ8(&6MaA-RV!L=K}Dx4Xtoyr=riaX5gHaYl#&UPO$CbwP27OiWdRC|=iFRs)}_$O z0;(h)rsXzg<89-{JoDzF%hpfdlW-VyZ(V%DGpkqJx1=xPB7ZPiZQ1pm$(FP4J@DY< zkL zsNiE0mp08avG23w086@zL}jcqvL73NG_uc8fXPqDjfAYi(E&nQ{lw=d*ZGMTPyC!R z$nzGC*ZHA?Fd@^1#vuUUz$khoU?@0_B9S9Pt*b~B9c&q`I|G4`a*?9A*(CZlIrNfA z($-r-AYi1lFqyd*XJsp*n5c>c8wZ|f8%OSH|Kol0Y(Aqwzx_}1h<() z&;blaFOMWitTMMfgJV6d?v5w!3_%3V@)KdEW1;cBX?e1Ymf zOMnY_A;xN*QN<|p7UpM^!+GrGAtXe397=paL2gw%q+rj-oHDtaV@>L6 z9<7ro>%h|icjU$qid7GAc4+;TsBEZs;RhIzP3U~9)0qgPz^dWyB)~vUyeO54^=vvdFQexTzV)*~e-fvm zLNX`sm6q$}cAi+^6w>fP^lAhsMeu1*tA_F#8eYVg;tRkNQNEV)`9L{eTlF8HT#$%b zJ;_DcE`!~r)lHnVd0Eez#Z!QAex6KDMYY<#@jE75aZhhAsY_Clta*R)ij8fXa<0z9 zk?4l;t@mHP<-?U>bT?zppdL0i13G6s)j7;+aL_xjL~dZ(T^MWMuX|VbwT`p7E$ouw zjm3X2{-PL%BUKsz2p*N%?Uu*nyXDsc5;5^5jGQl$9)uRs^9q)H$o{~xAzEUs0!;)( zGl(mRPzef+1biPgjnssquHZCmmqr$+879ds*@3%`oO=n4P-l&P>5j|O>5uP0v`z-D zy7U~@85XSjD zHlirNkBnLj_v;E(gc?Jf8UUHrAC=e1hvO7w0bg1n^PBmIUF!AG6PO$d2($(j8q8== zZbtW;ej-tpdq5lfOrHEIa$`^)@N58`31Q??K=-G*u!FJrFa4X-kw?k4tGcUGbCWo@ zc4cfy{n&GtxonO_CIOfEfvtIWv>#C?NuD^i07?*vR#3sL@BR<0zgIkfT#Tqa0=^LWW>^ z5mv>5sWr_(MoZCI2 zv0JC0fwP(~mNJE6oQI`}a*Vtb+PsL)r|9a@Jf7fGu{s>cx9}%EgYWd*(`mbdm}%@q zvEE0*W+NzX#CwZq(uT}PzrV&W@+7R8JA$aa5gX&7>n2P>;(5x#=4 zBbxVym14Xr!yt@0FX@YAXlX%vqIIxLX}(on|-s{pu_l@;gp zv_B|wKt)&Dc}x+dYF#Nu&?drzw9-fLn5kaIW2%}_^Mfo4&AcII7eOJarYP=%h6W+yfnIRq}NPQki73(PA+U$i=Fk^y0f|(a+tTV415Ay!_j{ zzj(HG$B6nZy%)c{ZN{=EC-#}pQ&EgsNjZItoSf0L=E_T#Z@Q~UpZ$m|(&<*s?wdAc zJUIJeXuNuXvqyomIc5tent(o!K?gQ4Z)Ps>HIQQsq^6cUSWC9n-dxM3lB9#4v?KH5 zYvbp~xnLQQmJu1w*hI<724Q4?ZPLDf`rlyx(U=r6})%h0jx)EOY%im=uag$r)UZ)Rt4qH1q&4? zGAnypjnKO^t)Bgiex3Eiv3!-#JvTkQ>(xYR?Z;2O_v{T1UZ4FI)j}up>_jcQ{la{` z(1h@%%YSnV4tzGIp4xr&Q_AdD+-(C7D=%5K?D9S2?lot0FQC?y!S1{vSl4NpI*ExK zF~YvMkV5w}|d%t}^LQp9--?jo&?cS&iM;UG@`nt6oHKgb9L>l6T;#FY7I#`LeB zYM-I3i<%7KxH_U|s-7^1;NO{4o?A~ma2n3P?Kv@BIStF(7gdu|3F(uyTW{O+}I_B2|%Ns&7^7Hl#!~ zeol6W>`~c^XlX&GrQrOe5cSi3MpT{Rej!W};g|}Q7%C@;ICtEf{rY#m%l^xvwbkxl zd-emF684x$Uw6e7b$V0xgfYFSzmos-ndFG%PSk-8#e|IU%uHr6vyR!uVE&j;DTP0q zYvn6Qt4DOwgOnl&>vDa7Db$9yMfW4TH!yU#qd|d13}UN2dfhL?dS?1toN#|hswDM7 zhehG1ih;q1K_cEz{AsKL??CcmkN4&p)#~A!+SqWc$;!SoUQyth-P*NFrO~u+98SU& zxH#kDn6kh*yRBI&wbWFFgxpu@@_A*ULPfOh;W46C^Vj+Flu&-m+A4sLK1uwR>E4n44*qOWW=fyWw ztC!v&zUSnN6AJM?aVH&{h1)w(Dqq`(_rTj~9PD+?>mI*;)Yt>6HTAtqi}1dVfkln$ zpS)(o1a`<(?HBwpM&E8An|mjD_d(%?aBE`+-k~q0FB!YzMdp?ZL_mq zUUO(eql6o~sc`A2A*)q3SJ%CNx#7_@Ez$`a3zv*)SSPo+x*y2?)ICPp-ZpkbZL@jI zC3P)5C7RSrWJt%p2Kun#57}=TdhlY4adfw2G~2ehLwL`&+0Ft*;^N7|oseN0hY9aV z??f5fJ(J$a!0mXC#U9)WLrlO_2^=niPNB0A-UGwDnM(G50SL}}$ zh;N%M7w)3P*w@`4yk)boYivXAK9Vm&SJBfKk4qjvr|*NARjWPQJ#34f&;u7=>$w-S zA8C(kxpmr|S~jFfX*x7qRkWENk7Uy|6(M&Ks;P~d23G^yAZ3b*nt83oZHduy7;fPl zMxu$YFLv{`P!V6Qk-227tU}6@8iG;^oXSOWC||u&$NPkm>yy>ts9FD8C{c*pj~0L!CgPW!v}-ulJ$>GbvV6Mp!yWU`A4jYcL%BQIQV=*eB;>E#DL z{p#))BGJi_=w~!52AXQ2{~wYZ1HN-rW}2ke-P1j_dvQ1C>@M$a=;k!tq`OnmY0|l? zh75JPv}CGwv37%&8==K-YLUiBRN1OJ@i98$W&r#Js&q|!Ez{}Ydn3}0%F5PqUSYEp zI#qgxM~nPiP$CrZ0bUj&6GWw?;;(}#3GLChXmpMk1tsm6Y=I{d~4OU^B_84R}R$<<|(#?LD}`MA(-FxaP+Rm9dLbvA?6 zNy_X7txHi}h6_dXwds8j(&BZahMjc-cm0ot2cNL^VyNkX3ul}$Wh!?a9vh1h?Vgx2 zXY7=z;%hm2KMi_MXCBNfHYn9@OAj}dTg-6{9MNztu7cyZ=_pWcn$YX+a=8dS_rAf! zjc^ghrA6IZYg43Y_w;M0v(uZVH&u?AnRYXk1fbLezE?dRIB+=KD;?S7;yaOj%S;}^ zTOtu#nM%X+=I}4bPpi7nav*yk)<~T8Vxwce!(ecz{<|$AH`DFOP87C^ylOE3*TYA4G$*19XlacQ^Gr6E&sDsY2_8=)Z#dX%x6 zn#z*OUVKapyBRle`^WY1wL@f;8a~bNd{~M)pc02_WRs5Xv?|A+>T3!i(qOEFp$?b28QGD{dlS2T|+i;Nj|4}Nu5S%GvWmH0DpA?YnAk_<= z_>ZEIlpHJGvR5@DIRqYR74t26SJ3B(pl)LF66e`wnt`2U*=g!tF%fOnzu49}Xou zhmy5JNia>4@O=ukg)CRd6%J4Gt*zZdWW(KlyT;%$u!eFNmf=ypvN6o_L-+=Fw?$^@ z;ivM8d9Hyc6+EHGTsK;FTO_=Nx1hZM&{!>%G8$7;S;9Y|SWoyOcu%w^|KuvTQ^LV= zp)`{gxd?E*@D(|+TttoLhr$NsLF&PSO@j|kT7NpI3Fj#I;u^k+Li^=-%#AV`a42O8 zN?&P^ZKGe8o>y!z6rZP+)u7>Onq%d*T#B_Q0>{RwOGF_`K(!HE7 z`+8Ydq}E<-(HqR<6WTYneC)dJk?TfBuKvGAfiuDD#GsEQ+aMQ3c<9h-jQL!1L95Rck$!21NlYpRaMX}fG;zOrx`KaCgZ z1SNcfcZC8Dj6+Id%!U~`53OG+qp=PE3(T02;Tv=p9Y#sx$6yj8)eyD_|3v_aHi#E4 z4$h^)PePwix&vtn5JXKV7!hI`$xM}^Kqg^laU9EXgk+11c1O3N+!T?^i_bce)Ezx81$-_-g(KkF0ZG}H8yQejaoa^ z(-|DNzB^gg;Mb|N4x+!*+u<)#6%=R~Mh!FqC#1RMOaWrdB6J}z1EJuNH4UTgEQwxJ z8K#?%%#Ny5x;9==SzTj^XhM}Sb)ddM=58L|GOV?rv#W8a)X5n;+iU!ZWGE7f1sdE# zoksACbEvx^5DP_=g=HoFQk&OA3e8Aj+gh8GLkj)zl*-#ZtfL`Q9m|-?I=lR-7H`Hj z#GmqJ%E~g{lz)g#rmk=s!x5)GXpwSiyBy;Wz(){2VF-rs9pfJ`#GL*^JcIw3S1Pa; zevC4Z@C=WH_7B2u;g?VT4t@>40`N@uLGAB_=`O;r<*v{RR5Q~#5C!$e`x-tzR*WI}!Yz=*?#+4~P~ zt^e_xt@U{H^wTGvtFI?-AI47{uHOpv=Q_{cwy{lBUhz%C?uvO0jq{pXTUyxrw$|g9 zj~yoV`V+hAx3Vj@9>#a#I6UxPef{CB`zK5w%ig=P{8ZK5k`p5XURp2 zm(;O66$96|&6_knp$i7wN|UAxy|*`L4cfv5_@Xuz%k-|=ayzOsUXZ+ocj-cJedYZe zkp$HqyiO-q-*9rmBxXjZ>11n+s>x57Y&mtpB>w(+$3GSRJ|;|p77t{P zkap$`=sxBBDkwnA4vAGJsfH0X0|i8&P(JW!O=_8}P^TdLXXhjK#JQK z`~8?IfzbsAOqsf-HlV4P5LSh$C^#z-t0Xc&H{uLHsxIkJ8ECU#PNJrYF(JfZ) zty1aq>13ayZ~FYWp=$oj3B2StYu39f&|u7b`REyT+laEBkRLU6wRJQ57A%y?Iyy>6 zM#5^DloUt|`sk!@R%x|mBgc>5ROqir*eBR(Vj*>Iy+s<=FwyZDn5Kml=hqG%FZlIUVz4|=Fxna@XHl?35Q*9b5P^O{f{}u3xThQi*!IHg zj_K2K>n)p9an14@QptvQW62=}Dx1TnAHUdO~8MqtqS zDWoWh#a8DR-5UvE(NbBGKjXz{Ra&m&OKTENZB5I_(zCbC4)LQN?^C79Cz;Lbo?agg za|=%;2k3!+*#GUQZ;dmShZ!w)UtJa|kDs#p;@*qP61E+P50Ayuk+oR;;Ns1L+e}w* z^)(((tZdtfJIFOe{hJBn)kXhuY*s3SMQ(p+(kZKvY^OKs+jU{8=B&MbAG=N}Qz=~w z{#DN_fg3Rcc7FG0(a5RAsEvkDERHR`dIG z+D2g|s51eiKe$`xn?0U?#ugTxzBRKplt?4KVW@!qouht=zhgQ9z0+(Vb7>}qq9E$_9^5NXgGClsGQN+VP-I4yqJ!2q2h`ELb5EGNMJf5@HtU{ z<5leC=sb9V%iWY2KC09wb+)uLJ7n(G)@CQV-xgTR1!`4c0b5ikwcEmBmrHLLSuHK# z{DGRex8D5QReL4cVw-lO)>f?HTF;F7=cM5GC>{ElH@!0I%(-Lw>b(X7!?Ka=cuY{K zhR+aVO706=v4Hy}g>+)+eL5T(#v0xdR&d&#<)*m~u7@uM4s`lbxZx-7%6G~-(08Id z`wHeMow9&!gEzE%@c!4|x~_3@@RYlTF5R7-#63~qhjzRRA`##QreDp-RAbSpK7m(f zXD3RI3a{S%^H)(v_D80hJwXmICZ_NK#-vokfc@<#q$Y0~=vu&lbj%WsLv{+`uYxFnfC~NYG~&M^3x;05f&rr8OlU5 zCO*J0uBNI$t-KN~3GP&i{KBD4)$~xw4?3m-nDDDDCbTLcq%G3 z&zUq~1hXZue0m?-QCaTQZVrS@_3{iR1Og<6Mxy@)A7GzwDUEN~E$To)b`gFU#Dxf9 z3s=rzNx2I`4FP?I9%NW5dJ^*DH#!v-rIgrDipGm%5X&a=M2RD0#E+c(Rlg3di;UMv zRvT;>$Zl{toO)NtWjD-Jx3#H4$^xBimf7J9@oGhT`|P$h+5V!kq9XK<9D)NpD!n>A z)T7X}wUHU^?YjN4wzk>r?FzNg?Q|MUo=9y)t*Q`}tM|#xVK*U?CUxnkmLYvfURfAv z9FxlaITDd_1|x~Jol$Mfswi2>H(8ZZQT1U<(_jDE)be3*iAKgMhA-XK#SWt{XQz{E z#P6o~*rwrghdK+@rHfmeW)B<~zI9QLf%{0+lAMgr-c_iqxTd*r&z{ESYpUf1XiezMoY_Tg6r|%bq8GnAsyj++o7}R( z!iwefH4C$o&iRd*h1<%(fB%PM7W7v=Jk4QDb*7{}(ivzd9y+wGBkC_n1W=Ka)U*W( zc}!ks90W#kD=R5Ht-2d)~S^U87+q(8niCMzybv{3$W#MLuC+73aLmqP#?j|5YjhB?3=HiCUNpFB z!Cj+GKL%BSNCo%$e>yMnCM zm8;2>#Fd?n^%KSmF4zPvsAl*Kim3xJd70131)QwT6rj^w2412&Ux6=hZQ{`5RLMgN zVwbU&DuBB2D&1-OeNvqXiAc`9Bs*$k&$8<3xKe>`q@EX6w6$^GwzlyjOVw09zEAaW z9}SHDe8%)bOo57=JGAb+LNb*V*!+a4u(13?Y%x?kVdB`U<=89XUaP};zFg`K@Me{k z!O?nj9KlWI?w8&xKs-?q3%l^Ew~l*1jaRw9%yt_h(Qi_zDcPA_-K(o&F@>TmXb$Ti zISV%}Z)@x8vwCjK?qssJj&F-G1}*XMiV`tnmJ_SIDWWdI&n-SZJ$o7=Ip`zgy)vo-u_=N-S&YoD z=zE@aHTNgD`!5wx$$9kaT>~GV`s_M-?YiccajhdFCT)SPCzkeBu*E;SAp8bbG|--R z8rX+VeN0cOo^y8RFuTU3Hy2pLsnO^B?5S{$l@(}2>jF9EEL7CEXOA7-RMo;yuI*Bu z+1HHDEN8_^q|uPh$OE5q(RM==Po%~g4`{>clO`K91EfQQRnrJUSoi6~_{HTsNeAKk zK_dT$EBTiY!Jl{;WHE*`W{pX!^BF-XGVT{wE+0<4u`j3_)|-92m6G>6`ekzVwo{(; z(o4OP_wTze`yB`;Esz^9WK5Z-+^Nq`eD&)@|M>>wd63d~Ia8l;%|By&Te6d%(b%h8 zFrkBAUTTt-^9VwGMOxm5qzO%yS5?I;aEgXL8uW$$DE)V2&6DW=6Mb*^1tlqM)$T${ zZM9WLsol&`vW@#MD9rusSE$PtDD=)a&bVuGWf@dTzOV;|Ms-O7(q zHR>ktNo%>(ALgC$xRcQmULoct1pdttnD)E)HCfNo?^k7buz^xen32(=&Gz6$3e{W` z41gYh{Usg$t6Y=&kW{b;vBM8Vu6V##74!i5mT4_T6)QUzo^`r}|B6(9PwD?XePQ5b zUt@WR#^TV(3#>X#QLJI@7FOuRuMy~T7qgG)$OLz8;V)ImRs1qZXl8eF^SJJD7{ce| z=gySXE4%q*m1^I4{2JPj0UU_WM*6)%NAY0_6I10*jZnTspe6tbSJQK$W)tF3>i&t( zo$Me6hzKuFl3eKv#+Jd~7Be-$@&X)o0{!q8%rIy$&benoiHx8|@;TEyebsmqoC4Bu zm2~x`#kHljN}tJU*T}Tm60Z(W2iTj4PH&)o{#?LABHJ7+-Qi(+BsT*0I?s4nP!WLdy)mRaci~FJ| z3B>tmXSI_nqGW$tuGR8YeEsZ-5|2`$G3uPAB8|7M6bJ9MoWfo^eZ(-hqykJMT#Yy%IHQNO=f)3qLSfl47#$C*vPc2xJafq3<#V1c;^U{ zRNPp(QLC~fCk|zsk$V{T)73bu{613-Tx1BUriNn@uthekflt-fr#szEd?^XBb*?mT z(3ol8S=ud1{F)1~sM;17Su9$FJ18n{L{Ry%ft)nt_})O9vr$wxsN)ey)!;K%hv?-J z?8WM{+EHeUiKF z53ap(YQE#bT}u$A6nJpDogLa8i>4;&cE$+}21D(d*@8l2KdngRX^hz2r| z98E%sZAN;Dw<>+sm}+NYcv;&SHAeDQdTvjJ*WCekqF%Y~RV7BR)TQ(0f1&YKRW8y7Ai*Iz-RhVq`eNOP;#N;2}aUMTbEuwF?%JR;64w-n;TP5#7u%WXK635tsOJGxgpWy z=P{AZ{Qt1`9q>^VUEjBDNwy@r*%VSYy^yl$AtWK41VR#0Xi`jtK$ zhyg(n5dl$9Q4p+%h=_;{5mAbWNU>4!{b%mo%_gAFqwo8C&-eR&=4S8AoH^6ZoH;Xd zX6}rgE3YV}7gG_bg}(!2ky)B0nIg@sEJ_zkNvJ$=?kbnF$ogbO)LcR$-xOvCiiqlW zmR6=&1<57m&px?LgHbFOL#VUP+n(5R$7lJ=Ty+kPoT67mPMiyP*v?xQ6+kShB~b?7 zl6f`kd=i{s_xttbrrnFHT?Y_A0w-`Bz3epGY50t%DwM8H7?;eh&2zjtg7~wqaGc_1 z4z;dv8{M{gc-^-4fie;^Su1hHs>qw%dT8w4g?>ySzlW(|v0B2q1O7fY4ev#n zt0k}T8@Ww@W3wz-|M=ub5h`IH5TOYKy8Y$?;U!@Oa6ct+U@gezT0GzhfMfLl@Xthe z=Q0XsD10{H=!Pi1$_oAf;3f%Qb1feCsy}hFnfnPRPdnq>NRL#t(p`(avj!f0A(V&a zwM+XiphWa{#130YPGL)RY%J07LeonWxnzNw`)NUZ%CJCZqcKwN7pj<4pu4CG3Djv) z3j!mPUz31o#13ms7tK=EBVTkJq$!I zjhO`26rzZdgy@33*;A{CNSs_$v3};1prGQSvIx?sR#7?INf<(svn)Yd$UdE1j+-{a zdKc!;yLp%m9yQq065I;XGf?w%^-)mvTz!=1WA$+#^~dTX_3yU&D9^|0Bk>nk z9~%&!d^dvCNpbZN;TPNtq5fp`u@?TtqQAKMi13X!14;bg>JCf#0aybhJa0*z@Vq5; z_^zeC=CtAagkVk^zS&|}DP58$508LLg7!|oFUBMW^i)ZYc%}Pn=27t9NfFb_&~26 z!sFKQF?A$9O2=&L_;7}4Cv)@Wblj|+$l>e+8h!y;vEUrxCSS#f;hqpkIKqDRNju zvjNB?y37z07#~gM#k?Xg9-{>XcHtxhPo5MUY_N6OFc05YLrqdrP*8eN-T^qapFa-09yquoE-sG2cr+8*q1jwI#$n`0 zsRhg;W_W7vg^OH0=R7dKs%pMxq=Q`?A31+f6pU;TCkvdQ zIUtxaP=y&pF;N0WN3nXTvnRqCx0Ms6Aen;@f`|dJ?uoDjLZS%>j3X`wx}PC7K3YLG zJ2@Iy^gFRJzCJ7n$ax4V*8u1IggdheladB&J>1=NvX8c4NDwQJUk{wYrxUi-YLPo`}R!_^5JARf2<1)b@iQ?mv7@P*J^k{8Ego1 ziF6ALaq1hGomfB8-tO)hGsE0G108NUCbebd)cB+)m1M=|IW1!E(nUJC`QKa=FWx?W zsq=UK1@ZeAmwPLLj)lAVmRL2SBuppd?S z0j*I1BF~aOop36tB3zeC`$4SM;^B(;u&}~}tRO8eQ!^;lGJ`HRYmU2IBeT`pa=cDk z*)ZPTKEQY4gwR*w-8_SIItQ&@@m@t-f@5HuF|f#gfKukF3hZx8NS!_?rB}F9P=N_2 zI$z%s?%|=cPwv}0Bv_>~IO?FoVJCF{#5Zy)uwJWw(XY4M-UF9!qY%eYB(yFt4k-b8 zd&-LD)nu>@nmAdcB}0;UXHo_uL1n+I3XAOP6Bf_f;5a;okUr^2y+RBDLlpX$Qsd~a z+pCoRIXS5}FM9g0cN?>llTx*McP#z;2Kae7DQ&!E17xm-)RG1LRM9?uyJPw!LnyI0 z%8?(*J;x|84@_WuQ|*)yIEOhnn#a*)x@c!?Nqb-1xk0vhMbKpWpV0J~um1YX8nr!c$x=Ga27?Eo7E69k>x^1JjTi zKX1XpxeM2=UAuVc@lEE8RBrHvSkHwSviI2m9xJ+j>Mhgp=oy>>KH_VUBFU&QZ<(YK# z@-IK_j!1s@+>nOxUP9}zs`#4ZdrxI0-@EACx~i>rF>a|K2k+JCZOXztCUy+`!YgZ*zw2^L(^mTa1PBSnT>1oJDTl7Li$lwPH zU2i4w6GBGRh!GfY%ng__jJXeVa`fb#MI~iC;NSwY|f_*rRh^i`N@n z&~K%d`}w&zJG+FM?0gLJ@IbvAM5wF3V^E;p;HPtTviDTuUM+jKk<+4cX7sW1c6VT9 zDx4w`rphDMk!r%@&`egx{iHvY@*BH>Bd{-qZ!Q%+)QdyfXcXW33*4i0uG`1XP zE0;SsXmoa3C#^y0?BHr=&#PS=om{aWR=`)P27iaZ$D%Wp+5nGm7h`BpaiVvs!p6Z~ zDWGi|R8ir9adsZMB!gF=LG7TC+v`-gIa8;RsWnQ>5&94G_xH>Dw4pCHxoaHp!P;e+ zU=s-O%VIp^sI{?ID?A*$xGW43Z(PJ{0H#0T?hunHfho=q@dgLN4eb#g9zhOK5_j6U z1-Uo`csfLw+?-vV-F>wh8~Y-MaQ6gT4$aC<<>#)|aGan^?PDJu?xS;YSM@FGg@q7* zoxfUZQ0wG<_;ta(mqnTK?fs38;cg4SPYbfl!gr0qOY2}zxFu=!?z3oQ(be*ArK z66wJ=FnOu|t5&b*Xl`G=?#ZqiYMsWLc_(GBUZ zi72&V9x6PcE)r#^KVcPchB(?moyNs0#JPaTON0}!bHYmOb@747E_D1EZ=OtvVmMHg zxKtWLCS%GV0jM-ZINIM68B0>>>hIx#bT)U?@six*8XdgUe(7;Mr&gfa?iuTR_voOg zY%hB^m7~E?uMiYy{z{!vrqF1hzS1Z-r9El^`ocKx02_z|8DAGDZEZ?iO{rgv*3VB{ z!-tip3@R8nIAwH57~|OspO=u0=@_t4@e)B8!rbW+0fV6(?BKrGz+F1h)_w zL7<{i4_zcU1w%JUteAaJ;gB>A=5CD01v8Ju`BMj-4G8DU{YXC1~<5tZ>Cp00d^ho?K{jF_kO@^W@^aUL;DBF4?1oOF7<-oeJ8 z!gtw@-o4PLMH+5?gQ}AnY+xL1uSREoH|)%j*{3C7%c85RduyZ}bRdC7mBCf5aqQQ> zf4|gW83j5m_Am7^NB)BW*Td*>B9W^qsI0~Zr%SuB0@^Br&zSr$GI|!?~Vx}^4 zm}Sgb?7ttM8Z)xGI=#3pd`*30Q*D#`{I)es^XE6MX%qZcaP~`Q`#2f=(+6f}rYn`{ zE8?D9w{GI(mZ@ zzPDT0owu*!zSt=Ea40`g>!!)ZhHr2GAZL}TPyE1uoc>CCS2u^~tgQI!P)Uem>poJY zv7z82M}xhcjZILm8y`Di*6ZM4+l@W0p#$hKr0&i3O6%hrpMdMxnqz%$&lfnaN8ot9 zgIjcI@c{oJ(W7#6aVD%%F8B0IV{^>On}_x{M;gLiV?sjR^)|LUz(-Cx2VV%WkTi*p zT*$xyx~mk-TUWDs==^&#+U+{eKo@*w@Fl7p-MxYgav@NOz$W6_nTk+HM{j?s8&}Ak z$x>Vj&#%7keDX+lJ3U6hK~Z)=276b9QpVnUvqEO$;~$2D;d~=K1ew5vhT@_NC$-ky z!N0H3M$Xyk3~{anMLIhlP9EJ$XX9wlD4ks#$!^L0ot=Wf#xg;eO&fN2nS$MPHi6_A znJ*7SN7LM)on!nRNc8hWI+*2!^>~4Z0&A@W38LV}_j1?vHm;b=#^U5Cm0GW{v%yG? zD;Ng;3v)pDJRcCJr^^j?!(#G z=LdTmZDd+o8@&<~^$5RiK}uvxa~G?%w`GhsDLPX<1=*GsiW=CyYx7NG}>ZE_HC^fG}_G(vT7^ zv`=Js-uLX-j8*r&xM%&uAw#)6Y0H)mU6mLX;O{ePW&RW>Q1O?@L8FTv9)BF>^Y|ln zdbY%_UCEeuqhz;X-1$Pu zuF=Z*TBJz-SdFepva^gzKV7nOj6y$Gvh$2l|FC2itZ-zETEA6-%NecyRmrYk;`QVN z6Y{5ITpT#bj<3TU$oeJu(UFs`J%&2 zpI)$QL#|S|8^P(#Q@e*1j+d3)kKp%qpg1Aa?oI7s)E+_XI1RuOztSo#wG~`#F3Z!5 z5n4?XzN(3btpwl6SHT>FbD!$*Yr(g^jTDjrR}<{yT?Tj!#Rvy(8cx}*g;@mHScGrE zelX&yf>{OZiFj8+cW1;`AsQwJu5v)Dm`Q*X(Aevdt~s4N#6AUaw;~=R;%z{jH8_XL zNYA2bgkO^-9V27Ty$LJ)Mw~A$mW7X8>hIV0fa`p5;1j7%O)r3x5?wtZ>%DjKQ^-({D>R!PHF!bi-J8P`bR%}ABd zuMsheHE3kaa1`@)Ae)`b71JMNGMnDMlP6J^al1G9nJbcV+msAeAy&-a48~Qr`_I z=ilM)zuF>lkdj!Jqz(pBnzn#igod|LfYg60YNL_X7O6e4KI%~h(qe|wIxwPcNvj~d zLF!%P3$eVU_6RnCHQ-GsTm|eFyh$6Vq;w(ilNbnuv;&e(BQR^Eu;iRK5)0uL5?2|e zC29FhNV^6w;zvT2(|nluvL}xbEE0m$gxET|Lr5KnWgs~b>%<(_?WjZY*no6fQLYx6 zd$UX-yd;)TOs8iFNXd+-3DS-$@V-6GNKKKv66^}lh)4mmwCYKFLZMn(`XJy3BUD$L zyM63p9(v~N-=%F=?4%CsAqS1129c_Sze%agZTNO25X*GCd=aT(<^fU?u`HyX>cA7C zd?)dXWvv8c5-oWHLJusRBW=x5#6p_a(U)3p^61 zSns4Bs{s-FOHuX^$w2zCv49ePk(wk72`|b&aa2IKtQ`KNf2^lJ(jE!NllD!@L2MFPKk`wc2@AlG-)C)<&ET4&;(7tDA(gMZ4%DUX< zmO&(1*XUF%Lsw5^u0xVm9r8okW;N{2m)KT}o@!zLvR|;lsw(iBd^K_T|ApK+mO8)oi z(cBx5(IROZgfgP6H1i4>nGk*@xfAI!9vGwtGw0G=Pedy9l*eKZO6c6x<0W>J;$@(8 z1D$Dfwa2a+HzHT0k1+Q#W;sLBH1`v?lPTRpkx~(kuSK58NV_{%iscpCf*Gr4jf(Y6 zxPtWIqGTfNm&7Rcyj|t{`y62I-*T8N#9NFxRyKN*q3A7(C?pp!Bcx~%e1@Q>$pkbL zkU(G%AL1WKYicO%hjM^dN@pKp97Vv(hkH11N!+9#CTGu*(QYnmnKWz`PQN2*WFa;Z zYXR&e?m>X&!6a!CZXh8t04ar=*!u&PE~S@`P$h5^e6ddyb6Ns88Ow_$?4BzUvzQ*q z*&w)z5Py!8=QPBfOXDN?C+TOyU4nGY`OKDbng+i@gern>E@CJ}DB>c}QkaFnD@G`> z^n`vSxB0-$N1R2}><@pE141n_ULk%Wo)OR?k`JjPlD|AWU8PE+G$6DuvZ5b3!=w;7 zC-L`3C_){AlLzXNl9H0A!zR*Wa{wP?(gN z)WEH@8%q7Vu*C8aZXi_2pp+vtG4lz@J)s5RAmU5tPwJA;*vuhasS@rZ6ed`N^2BB4 z5JKSsDfedX6nW9iXCzfIJyN&Uc`ibw z_KX>A^Jyb=l<~%raaG1a4fPEzQyQy`84XR14NYY&H4XLQ#eZEYLc;_v8uj=gvl$L($LystZf)uQ(>%VXq?hS!Wc>Prf6dTG2%mw zMP;>(A@j;Fez$(UYKURzU9R%?_}1Wp4I zH8wZ2HdR!?sBW25)>LI|t*@+VGPaO%%SZil&-IQa~d~qq3@{tfsa(JOgpoAeQ{9Nkvs-TWiaj%rr@~@-hYus;OvdASnkA zscLE_vBZVB;#)_t@vX-h)V`WWqBWN6I zEUT|HHa6A3w*n|tFw2^aja5x`H7zZOu6zomrI}(a@BraKV9`=dQV1m_p%gdM12HyK zwpO%+g6>TdL2aNkSrVwJH%=N?Q!&meXOoap(BPr z%dJ?^HT7eSO;yb;O*IvyhPx6#N?mdFr4$INK`Jd(b%fuWYLIGW!=(D!hO){oL_)nX zkyKy}6sG}2#=Etp5e#2hMT$vq##PlecBd#BPyG}Lom2>_1N0eJQ(glKhif#XuB#hr zYa1q!EK8&gHI|n(qXNKGl(b-Gb0q|gYiVgrjEJbJ51&*sp{B8_vZgG&p=oRcaYcab z$K;6&9*pXxY|%_IMxwcWJH1`|I-DoAz&z5DKO#&qz5!f9NK-YjsupdJGDr88Oqi)# zTh?d_2`e?z#({E!VpU+Nu}x**waQRqbraepxTj)VS<_f>3867)1^$C5FgBE3^mp@RMu1z zvx*X=u@z#kc^qx9;NX8``l2D}qLYL-cd{qUNEu>6ce2fNKSwkCMqR8T90x}mAaw8RLEqO|;y;l_e& zV_N=jAxL&n0iq}5LB|cIZG#4X1`)-a#IP+ zCZ>{K!EfbX<#*%v68|#4$+Bqke`m?b786BV3{_pTSWD0Dp zq!y>ZJr$uuQS?`qoo=@b@XsQNSv_()>in}vLO748hyGb45mjYG;Y}34;dJW!cNa-S z$yq{`dH*bw{L6*@KUSvyR~Aad+WTj*HN#Q?HM@&E5) zNq1@f&w@$UmMgMgVy4bNizfdpn*6h9l8?Fm|5J-5XrEo$2eM#VV{v~CSC=2z;$W?R zpc;s7{um7loxc{Ot5mAW^DV99)~%PP)Kj7!gs3yaE(jS9npRb-^U$yY3p`)vzUEUx01+F2iK0<$uP zZ)fcoz-_s9mSr9r8J!q!$33!k-KG5fqc*Re{-xuqKRIw46e~VWt9rio=a0v@2Y)kV zz>-z_>+U@LYtF^@wQjjTDB_cX6J1u%xp6IY)pKJzTO3!}%$E6R-hSptpJ(ii`iSYT zu5h`r=k1JnZx4!hkM~^NEAaGpHebw8`@KH@it5apD+axG`RCTPUzhlN{o*T^k{0x; ztNd>6NKM+|zCrbi(_eQVYFGB_^y8_|zEwE&&IPIVKHRr&emb#N-i3GV@7_0cm-pVE z7ftmU6EJ7>kJl^b%wY36?>-uH|Jx6Y3Vm>I-6gvn4!$=A`Lykb3E1g(X#4W^Urx+^ zXvM1hZ7=p-6`?u()Qm5kHkKv?_e*<(|NYp*cfF3!of-CtcGdt zuRndIaOLP>{lf+v{N%(A-RmB|Q5N#>6VA7;Xw@aX^spXGjZZSEK{Q3)o1*If-r8T>t zJ%U|WX7Jntdse>1?rC$q``EA!AD5|prd+u4<;zzaPkuKgKdJWP6_2TxC?1}6<&%0B zChadXu7VU}|EtCIV>e{q><<3Wwx6NKS z9h0VMpTDEw?)*K=)0OF=$G(Zk2)LVnMt@^Y@zxXlzkT5G#D0B$d$c@j;dA#dnw~zi z`X0@PzKcSSwLkyOquZaXIuiYP;Jjyp&zjohXfpg6D=D^5yYi`H+rIcEluEIE)>KnL zicR~E$O>G3B{q653%6j+zp~0$Tr-xgx`AcLwtz?~%;HT6IQ__kCq@)zT~1TWenURt^R)K@f$zwTo|~!b-?x3 zZB4^od^2Zdbh+%qC5zYZ?&I_9eEp#8^3S4r9o*?HtPtT2>G%djIX%hn8Snqe` ztIQ*QFF!wCIp@(8??s+&T-j;x*rMn&{gkP%gU@m8J4?pCQa|n2dzP$Q*dG7LllOg; z%e}to+2KDvyyK~AM!Po8|Hv1oM=7}dK`~W*``q{Jl8^=aJI*K*-EXGcotnFN(1H?w z+i$nNZF}La__tP$j=TC)dgirV4{XuwiTyO-fiaz9e++8*Wv)rk%^iDSVCRoB*NhZY~Ww0zFx#~mMe zNB%}dQ5jb-G{^nwwO0N97k<04w`R;MYaY|o+!y%$eJLIjBKKX;{`AJoj0Y}6u97oR z_v|pveM#wiZpapwBimkeJRko<=8ESvUtb^MqQN~3?=wtrWs@5W5e z3)jZxY(JB}&u;GEVQaIwvVal2c8^?qc0+38={rn$_p}`;9J_Y?1?~6AFZ}fF6wj}( z4(rwM%AC5%Cym4WJ5S|2|J`#xZA%rLvkQ-?Yace;dtv{{p97A&^%cer4!2w9{7ZUg zzlY~U{`%Ce=f6!X`XVHH`hd!ZtBzIaUi^Igj_tKY*LOd7m(v@e2b))PoE@cnJu7Q{ z@T~J}WZmeNw}wDmw#yah1AY|y0NXOBaWPc%yIV608NiOAV^&+6MFDdjxfEK-_HyFU z;Yao|Im@kqHkR=KIK8(h*8RG~dQn3|i!lSNTT_iqR4rA;v{vj`XsT(MLS(xs-V|es zj*N zmwZ3F3m-o9VcxSXCZq0q#m6N}9CH`Dr7zmNe55JhGiJh>yI(y&M`8DiR#<*<&H=CY zqWvCt?9!F7?xEN3K0Vvx-0A!$*1Yapynp`hSs&OO8vWd%E$PDA-=3^}Wb7wFUt||= znRV#fpzQF#O|uG0i`1w1&}-utE;Q9YaCx}tvEQd1UH1GL?`6||J?wB!POgVW5C+qWE>%Xkr#vb$;Skn2MY~Nm^$}HZWfp~w)WM`2$ zG7~NU?X(i-w;f#Kz_3yeJ3+uqYL>}fZX?a!9Pynj#FJ^pa^mkR%vfleF~7~A-PC?( z>X5)?-}*aT5Bb`*c**cn>(*4PEBlYLXS@BBXPwpz=ve=3Uh}Xk3WxA2Qz6Njmym1f zZ_4V(=t!H@@82I5TUtpI8bk%!1MLt>%pCwagd7ukH?tcZLc*VQ2oWR-t06IIW~7xN z)_-$23|iYSo4ao$pBeY%+3n9x`uyOO!GqYX;VpOFQKxoz=HP30KeRLah<@$7y7HYv zx%cvo4uy|?IW_g<&{v)tw!-~u4|dk3S0-P2@X-0b?1huBJ!C6;XMWDfi^Yy#7Cf`) z)am)-KW=;dyTzB}5%=?F9}e;JX}tFH^;44{4cGjlIN7+%CI7Jn6KtE7>|E1l)!48% z2W!ujkL>5P{6S;ClM2_U-ws3$m>8MdyGixVxyIzq`)wV*+G|_3;NmAcoxjh2aQd6E zy+=Q>`}xd-yZM@~cTNRS$bUEaLQU_s=>oc*vQ@ z8W-1Y>XUcm=PA24x=bw({&DTf;28NN*YbChJ?p&MFRI=SedU9U=fC~!{Jk%Hvu;C6 z?9Ti*@AB0LOjIQm&AV$vc7|cs^UrS?H1?gx(>vRyc(<)~G*zET*N=96XSI*_p^US= z&%Sac=RoL@V^M8+0U!5q&94T(Gtc+k>Q^80ctBstC5JsX{GpwvyuW>6%l?Y( zlS^br(!vWjE#9(z@-xqOENylDbkPG2tv(S^8+r-4Q@diSsa;lX z?h3RE57VxIx9$qaEMUg$|Hv>KTXNB&pv(yVclwL22|*;fjf5yuY#*`Hh@;L(=s3`6 z{I@48?cA-33XUi$I4CO6=AOCudy~C;__N3AH@4dkih23ci^IGhPj?HMaCSuD#+~v6 zS0VT1>HE~4U&c>(OMgstF=6kc@-6T5`It3Crhha?Go|u@X^Zdlt9@>D?y9rnMj!ra zW$`xK(0$K+`gHHjQ*EC6Wa;qzce={XR!=+=RTQ9)IQ@*W@Pp?wcZ@prMmXR4%(%<% z)m=^;xyI>A_RA*{DmT?v#!h~+qrxuiqtr)!{pPqr^YO?j>vMxoYhLScnDpA> z96jvK9Vs`XK6;){-n#9%MG4amKh_p{HGjy%-m(7s`qWoWFMfHI-Lt)XXTEpkWq#KD zU&dTKRJ42E;sqj)s-x@zR^NkKtB{ZO|r=%LVu zQsWC=|N8#SId9nHy?JDPMnub!U+RCIY#bKqFzU`FD^d!gXMVP2w)64T`B#>1*_GW< zyZrEpqqFB(`pzHFcb>gX_t&Mmx$V59m!-cnaDv*?7Rp`n{Y(avX6n|j-qI-(wV_$( z(-fA-MJ~*E$so)B`rK1*M}Fu#C&n~F?A(X~wV-2A$G};+|9KyNG!D#Cfw zjQdRe%*k=AQ}mxDN2XcWsoM-~Rt+}FPpN2Z4juPYWk zn!fbj!&B4?U#}Vy9-8v&zNQcB?z{O~zcaS``|j@l^b?nBKCjsA6T5!dsH&L@?|m@4 zu=JRE(LIM<2fANQN`J8E(3Tq$zDZGp2e14t*=_xi7d$2{?sM{N<-3{5lc)M#cDVP+ zg)R5Zzw%xHmmRWquKg?Po|dUs{xI(Map6lkLi&YF7?xY%Wm8i>V)@cj_g&fZ(BuG6<(3H`zxa{Qjt&?5PpNoHVip#*xqtE+}YyIxI->*OTy{he8P2cCPn|=`T7JT(pYhA^| z$say8B)?#H+fbi1lXX$vQ-4ge-P-Tkh6C$Hy}oAl%At1+$GlF--AAH3lusEY^N!g`!hg+t6a(&0-~{BqE86b({__3n?)~zv>?f~Hw$J!Hd$G52-02zb zf9v;SV|K^tNv~wR>FnHl>PN-DRuyW`uDyEfu07|qrjZ>p`u59wb&~M)Bahe*-Sog} zcIR({-;=Kyf97hRz`N(=Oa_P!7AE~l96f8K>!gI1nJ1m05vjn||7v z``)g~8CQp1ioE&w*HNt>I{A-%;)Sh)Atj$lzw~W0J8gGu<=2a+oGbomO~u;P1(O!V z8-|W{Z~S=rnPZ(NUZ`1n=jQSy!$xdYoK^IC?|So#NAF#w+_Q3iz`IW*ejhS+;CgOy z>b66#51ch_+tVpW?HkgbX#TzFH}=X7ZNY)juRfXSG-lH`uMR&lYW%g`ieB;0M%??( zYfDz_Jhu8r-I_k>X*(7!Z`br4-I_6B{Mwho1M}~FZ~K9#zFK}^=Kh@%<7$^X-?8*J zmwP9btvVYnyF4=f)$E6Z0*8I$d-(MJ`VB|hV!uq?`UIIC;Cw|)^LegA;255(rte8I z^z8fwInM}uX=y4oN44&e^SFw>ZBMEK>%xL*pHd+(GGWAs5rs;gl>?ww3b=*_fDzO( z27hyWau)e*B!3a_UAn%TI_LPLQpm=Q9Ya69dheK_A74}ntc`pj{Zq>s8~Kp+5oHmt_hCo|_^y=3 zoxk1Qae}mY{OQs1$H8>LkM8Zjp~D2u@VH$C3(%H7wwZ0knTmk$Z2(&EajGQ65pF^r zh(W2F;L9LFfWO=tU&i60O#I1!FYAGibBzi97HfRDgf9m^IS1DKN8(pt*%|on0OpP# z>;y+f4CZ$DN+rcV1#b(!4KL!`++Y|RX|D?jPvW<+A^0@Emh#&0+mf{m! zOZ+NcLGe|F21AI*n ze0zI}->rV_Bz!yI+x5WL=_r1;`n8j(X#BUs*Xt?%DIi$#ua%4V+TR&QD^{H){|;DG zBbVOb&q9BDIc{{upFQyHd*B-k6u(>j>f{=VuLHiW2fm{tPLcnzxS824Q>%8$>&oD>er^CLlcuN=>7fT54fD?FkcppV8`2-Ko9OLFO zEH|Hf6eFk=xNU~zR&pz0U&XD0{V{Ge?2mI7VgHHy753jCcvxNz@xb#+UJ1JmZv(q6 zuZCU2>lmEZ%ew;N#=8OH&b!0z!NTI;_BQ?s>{t2g zu-^c~@dD2NC1;l6gi&6w6>u)5pb;ElcM_aocM*_^;3l}k?jiWX?k5Dm9w^|fO~E8Y z!X72Wz#c2a!5%N*#yufLNQFI3$c24?Fc9`U+~39v1wsMrg}51v6^04bu#XjRZmUoy z+zsD*1f10>vh_SXqz^r;y4* ze7Rx=!zy+vb~3!;CB>VtzomE=_WcT+|Ef5kI0XBLio>vfr1%*2ql!;pKc+Yd`!|Zy zu%A(U5Bqt=W!SGMuE2g(aTWHT6{uOoZ;ETMUsv3K{ibq1PAh#+d6wao=WKBvt?eS) zB@A!7RHb29l~(1%@G55&=%5Nxg}~lh6$yKkDw^R`F{*UfGgO&?XQ}$bo}&VNRJp1= z*axW!U@ue^!ai6v81^DnG3+I(;joWTdorxrOYOz*YNL7}?0M=z45!XlH^P3G`Yynm z)Hp*|-K@q*wCWc1bFgnwZvoC$^;ST(sb2(ShZ@gagr>l8Qa}4%RHJ<_JbIn;m&S}m8^1bE)>_2KQ!v2%CnqjqL zwPP7xJ5DUP#_QA7&9*T4%x_fN^nR#_={MOi4&@t>X~u$J(<2|)Aw@v z-awA)V0O~?Tl9T|zE9HkMf$!;-fVi^gt`gr0QxSX?-BG}PT%8^oE-U9B9FF^-6+@p z*iE`Z7LpBfKG^=Q%Lw|}qi4{g7cgM@<%AnSUC_6<;@&NH#sgIIf~@ssd~oNTAMRWX zz*$T|IC(7ur-+9#VfdtvNLLN15t!)9{-s&WY``r)?=Z($IqSp*uyJf5JD#1%LO;SD zW>2!0aL0n4^WmbnAzU@Ln4c@060XPuS+;DvY`^SRWu9`RvQ~MIa-MRPa+7kG@`UoD zjlpJ!%}krcHtTE-+nltyWXs`VG9TM0+jQF^+j83`+jg|%wYJ-A_u3w|J!yMM#i{fv zAGF+bw8L^$ld4^{NVQhAO|@5bSani$NzJMCs3}5U$a*}CstImlBW}<;DZIOTz%c3- zKnEw#EP!G%>Nh0w3(?e&bE+`})C5_DM$P5TvT}ohg9Ey|OD4ii=xd955@UdLr7^YN z;;@&Z zZ^3Ov$ssFxxPP{ClRTZGZXRvM0FI>jv_3WGF;a&OoW&vhHwN7_9CRe2=}P18(Z-xGekL?`+9;V)j-3ur?7qxB%uHq;vzS?hTLU*S+nHU= z8_WUb2=fJViaF0*VXos-5;bdJ-B~|2l#OAN*i1H$En!Epm255B!rp_PVjjDgUB#|r zH?iBFtKDapJfn$8j*IZJ%x z>?6TrBr{twM@VL^WKNUJMUpA;uk$X+eLylL3E(VI&_znm#Yyyc36V^x-MC2n>LST@ z7bzW=#S-2o$&}J@kXNL!4q- z<&s(7JIKV@qn8#8vq{mvx+$@+LQ@!V+TM!83cbm$SAm#rAu%Ske&SiNGbLZj~;eW#Th{k>P)-*AhvhK?s_ zcx$)y_=3bg5Aj?3FX-W3*u%ZFhkI2IHyI6B$Jf!ry|#yYT@SZ4H9-%rE$}yU72G~h zM|N``@9y?}vAf%kl*cN(-?{GYfT`Wxf#OJ1Yz0U!P~;7ZJ7`gN{Gbcn-NC!MyF*rV zclVy$-5qM(s=z&Av#tDz`&4&#c&e2f`3ooXw<=%6d5m+YC+8CoEsQ{s3BqDKt<6swGII`hmVw50FeX0O@q@pP?<%7Bi#i?EX$V zuP>uB`f|)HSvucvrR@RNy1~uybLG%_Krck^d7=J6lD`Qh;`urJ987Laa!4EX59$km z-5wj7Drgo0F&APqy)~iGK166tsQ2#JM8AzzjxiF)==fM@)EJ~N7y0;+zr+Z#I9WWS zl!qfvw(>Z6Jk-XC^1fK>IjcU$=xO=}^-t0`!-AsEntbjKjQFzK<#k6~g7&MmQY z$B832J>uao`|$+aAkibzMe(ta_Odq^&%~4ORM1plo zo}3sX-~^Za7~BBURrao2^~6f*jz#muBL*{`SmVjvu|P9&6H!mBlR?VL&`%8r~Ft6ou~2(Dh(i5Z+rP3wU}yMX2?p&JaVL7bKg;fP$YV6vAOj{TJr^Dl*F zk7E(`6vuF4{>{*LklXHIUj*JU%v|<%i?M?d*u8k3WXU+cE2Y_tjNM3|1uUUzmrp(7 zS%^6i869>(hasM+>}dR2y1`QcFUOP3j_d{xLi_{pgySc2i8<$5_?YNpUM6=0G=%XTEiDXm$)6za{SJ8 z^O+2v74(?~U5s^@(a=7&(Wesc?cMwczg0qyV~tPvtq@N)`eD8-P%ccwMp6;GJHL^3 zu?!kPqQ_SOgXO;YTUXsz{vO_zKA=_&*JBG^FbfR?d+ZtvL?p+aqGJ0 zgqw}HwY-*F&?6^}Xf+f05UhP!m4+LEZ3ic~J9z_7<|39-a_QJ!@D83F?m92>hg5zJ z<>$h=lf2LkALZwkb1vKg?t(R({T=bN;bFM#+|h16C(u^DgFZQ+8+1S7DP#|Eg`CL4 zQmX7W#FM}!usiYlwOfegXho|zPp*jTMtQakA>`~VPR=EAsog?Uqph6BQ_G&`j6KpH zfLxLE#j$}o^%$h_GIVP%V>^Wvl~{MQ$F+ET@H^kl2byjvxmC*9bgn}5wv%Q@t(zQX2ljGlsrz}i~; z$g(~emx}Tt19s9IKsQeNUPk%8@&ojbA1V){PdutT%E*<+l*br_@^j_qj8gfv@@vLM zc}n>$W2-!a{y|Oq1Puw#t>Iopue+Dq&vtq8EUg{_RLO(=uPI|CgCCdA>RNv6IC?nQOYNwT_35>=$88Nou z$KdE45rXw$=x9Y5JEYzV^M3B8|nd{|G#YG0lu6^uEMo0Gu& zYi0O*lwXC^S&WES==@o5Ajw%ag@wXS<{ML`oQY5}!o~Oiy~ub8SLD2|T>sBF==R(| zYWgiaEc#rLRT)a34vQ&p~4wLA0POU z8*d5ckddG$hyDuh{%@8PoFY$QrTy+6M$;*6I+a!!acG*GVrME3gWs) z9%B`zTwX4FQij~fP^0p4x!BXuP_nu56xl-fyau0a>@hUwOpu4l8s&bniSPr5%1&8) zWOBV+FB>Aam5l^^E`IwheuC_0S)%NMEEUjthJ$Of#ZQKOe4cF;a6b*{3gSXk;TXoyFy~+JV^LL2#4=Tr062^wD`${ckrl%J%S#- zso42*9i=hnM-Vph7lgI^75Mo;8?{k5E?CuqFi)7r9};HrN8vBPe;(pN{hR5@Z{c5r zKI;@>?GRwIz?bu@0Y3ovY+;=R&hu?T3_lA#+u_qFz-FckUoE)u;AegXe1-^379S3K zsfqw^L+VN)Nr2rF<^mtZC%}*FXYvtXlY9jJ2p$(6RN&F~AzT+dcz!3wo}d6mrm*wp z$u2BQxK;crj9b5huK~WR_(MGGk}ro5!#imEKf`Alzl}d=@!|POZUYA{~KY&|6X35-M_)SCk%<=JjIM>8YhR>6TF`O^wr&;_2>@w41Uj(?Hn+sn(pUszB ze0hvn&vPm8tHr4K3LnJ7ZY~4HGVa_V&Ii7QNKwthX7SsFLCAJa4nMR3?jjGH#jgW% z+T~!kI-3{UqKq?fCboqOVyD7)1AHqv*eoIS>=4eD%wRF=<*`pBo6y3X8#aMO ziOHyxLyM50JjTmMS;#+j2rZu(PFAuZ{}6&>-@?q_4CmR+Sn2*1J^{cNEO3EciX4B2 z9+zdc_?@@-@a#Rz9;uJ!utIs*;zMWL7zu3x1o98F@0}Juo|%iZi41`J!>oLj#YbR6 znMRC;Cjx?2!h*t5S!7sy*E2&f8YZQl3qME&Gi{ikF>k#LRs%+G9|#ZQLRKVv+x zlJ5r?7#v z9&T4kOYGc}FvysG5z*mMEdeAX!kcyJBrZ}jVq64s0k;tI4x;TN;}n*TInrU0`e$&f z7=fX!V6=s=<*Z<{VJ9i)OE7ay{&kI=g^qtgyGT;oi{Q*3Nah#%5NcsC1Ix%;WsgFA}k1_->&?MuyRnPtLD&; z{LTC>KrCJPeF!cVZQ##pv8x4%Qf)A>ZT@7&|2by-Ut=z*qH}!>o$K4txxW4XAS7vt zMDni1Zv%b|WGR8=;I{zr=14PK5gG+3MrBMC9ztI;Hfgg&AL2@%YRTt+Z@z<_%b@48 zc-tcNFFHxjLe}d<_tMVs-Q1O(FLZOacaq*;#8)$lYX+v0uBMn*y;z1oqi?EvK$SRC zc06d%g-0OW*PuwqFK!#(wSP0dA-AM(DdGR+obo-#@HaOElL6n%U_Llcw zDCwVZB-W%{^68k$tzOg@JmlQo^mSXoJ1wD zj;!%%U4Wx**TekPzGWxIiKP8FAwH%r^d|TfCT&l8IcZPQTQCnK9me}u(t*C)l8z^x zN;;SHf2w;Mz$mKgZT!y6&Lm`ZHX%fcA%x9tvaA>}vL6Xa#FVC#QlyB0DIy|9K#Y_| zN-3p?NGVdph)5BUB1MZ7ky@lk(b7n1N-3p?NRd*cNP$vHDWym;`9J5`uOw=J)%N|r zzc-un+;h*lbLYasVqU5VQ?>BuV0@I%>nsUyoiv;@Y`~IdhFLO zwp3ha8IQ!0iene}!;ox4TpRI|G#tL(Q+f9K9GoGRrc+39;$GlK>q$4NExcM8A*u37 zxYCmU-9M!B)kTP(P?LurB>4 zxvPffJ?qg%+~^_E^OyA|X>f;>U#h@je1*FryP``)ennwL&x(?YXhmg3zls5E^SxD0 zwa@iben}onj$Np@Tv3?FuZofJ94oHuU0GJKMyR45@d-&O3Q3tETxyEbCJrn2x@c)s+J)hg6QJ9922Cazf>#$|+3O^vYS4b1N5AE~;EwxuSA)#SB zcHX6stf*KmKh(>QbB6)DBC0aheA?~EYCOiXTDi-&M)#ICf||;AC;8pw8(N*^W7mJ& z^J--~BdGU%&h$B7UI{!C$8qJA<#pw5__NEqh^#z2T2r21ZozLM+$9Mc`ypJNaM7BC z1a7O?%2RQ5VSExxGLG{4@}A`-<Bp>6%A zcOgIi)wLO0$OjTYL(1ltHQ=`dZarvz+48bgWoydn%GQ@{3@#ZA2*f9ma1xehrYter;n*#)UW}9*HFtM?LsDNVXv+IkTjpuIw1Xox&MnX_6Ju z#5%}Ft2b?~ws$rj5X{Ea>SgKpdEn;2)ys0ryrpBx0%gTzz01lJURS6TXh`Xl(&_lkf;$&9rF22*qG)~T($W>Bt4r5L50`EzU0XUm+OKp| z^c2EvEp04qf@XpIqV)*50>9~y#eQvLOU1QT;*nTd#W5HBQb;x-E;+NLVQJ}ZoNph_ z5K9xSE!WFFYTt51%Rx@Lv7&_cBuntb=SQF+(e2Tl`0a^qkDLR)J-R=7D0(z{B6=oz zK6HvLu9i{9C*+|j(K?*o28sg?0nw2!`W z*uHPvh`w>7az`2?O|5>rXCER1aIUeD39WvU;{4eE@LU(Q*l2fzJZo|d z_QCis(2#IbX!$j(!cF0(7>0Ml-4{OCYhU;X`6jr>!>1uT0%{7M3tvqB_J#NL!Vmi9 zh>O%Vwp3iZapV!kl8hsg5y^^lj^ssr@%WI2@ImlLaE_)(FwzS@-2M3vR@FY51#dIL zDaLbn;r##IKh!6UPsDzt>vW%R<{?+zxT}PDQK%mX^)`ex`_Ql?snAHs+S3@w#)0ZU z^&qURhh~E2fUw>i!d-*V5|GH2gD}$ytpTkEp&f>{fVP2lfbfh@XfNmhNJc*59s`{M zokcn>z`d+g80&Z8bhvn*I}9rv&V>v65e|TgLA^m33y1r{tp*JQ;TeeV2oTmY!dTx9 zPXJ9qm?nKl@8iQOJ~UkGu!*=-7`=|f7han@j=C^L z<%#ozH?`Fz*8XjEuyXhLXGXbNb0XclR1 zXhCREXlZCgXfgLY`5RHV z#-qshDWG_{gpWq7P*cR6$p1)oq)Q|pR2bWbV4}{O7-kgtxj~ouqXr(^}{i(>=@JiB! z$mIwrsz)w>&c-O39$qO#8RSt9{5hap)VYZTIl?Edt(GFjX3=Xf03@Ggdx4bkQb|v(o zu`zjRUdmpDR+pAXPSFO!4whD-ji=fz_(+%c)s@-EQ=x>-O}Ghp+%4@D+9Z@{o2C6D z<4On7CXawk9?Lio7B;;)bh>nC=tyY|+|i}A(bc4ha0f+Kx2juZt?L%bri>J~ZPDt| z$>GhVQ^hVZpCzxQEr3dAAT2`D7p#knNw}fDrL##xLSsXt!c)=S!=&2Md9eE9dgwrRzX1Ci6bozR*sje?XgIyNS1_(#_#BB=jYv(x1fjasGYns(m|3w2M?b zK;B9I#oIw>E7}0tLFx9;zS5ngdm>R1(o%W|?Y2#S5SkQTS9-LxSLxAMK1J$FPoO@Y zLA^s?T6!LIDKel;rTp*fU*h9{L>)@if!Ot@>}31?n0EG5nHAnna))=8Wy9upVE;f^ zXNlQsvDHF}{v_^}<%f=!6^720^$d+DD~Z%6{OF5Dgtnr5SywUsi1%A%QN$@!8K-{H z)nx-fakqUslh?5a*8wUUjC96G_?>0LB39W**eTeuvN5nRiMBDM)Fotvbs=X zQXeaq4WZp-^`U)b)5>Nd{c}R+68VmDJpa6ex9Cee zU+|36mwBdp9?;i#=6IgQJu*$(rQ-=!%p7;fQ$j`QAk4~&Fe@v<6C`m`MVOtvk1$&+ z!fdSwv$di!5N2ydn5`9IwpN7MS`lVzMVPHoh8bHCW^6^1KvO`NtrcOmR)pDF(E`vS z5N2ydn28mwj=Pv$6>R`*LOQm>Z3H!e-wk&k=pgtbaF2sdgU*32f|`{Ua48kY0A+zX zgYrN=P!QA$6h@eGk_uG8-ybvxG!(KL&}gL!P>vui?zZO>e$l@#OrZ8dk8d3|aSj#0 z(=u|Nz~tm{)CKT#UgG?L8Eth5xtzb}@j`h!=*s^UZ~Ds)exungZfCm~BWoIXmr29Z z+>=??xJu!}6GOgLO8M5nU7sZ7!>Ypj2&)XfZJ-^XU7)?71E9m8W1v$Yqp!0qu%;a zZ~e1Cb3qG0SY_~|-uh8*{i{K!v;GaBO(4`+eXRi%t*yunAKL->ik~3jWY~y(@n-3N^|hs z*-|`@woYwQ+tg0A4||iH!1K$OvAbT5mahfzCSDcZ>>Y+Tf+yo0zq5Fk8E?1-M+8R& z#|9?^Ck3Yjrw3<2LN_=!xFEPFxHPyz=`lCB8r;g@!r-&Pb>P+n=LFXW@vL5O1&&)A zTncWn=z=eTn;#qpEuP{J&O-c4gA>3_4Gs-13!-)fmj?&n=waZN2K(YncqakJhJ%xX zRp1(eJ%jbZ0pJz{y*RoU+`M4t;OHP$C4(h6azL;PxB%iF81yP5I3qY4Ar=M~`*2@2 z=;?7P80c{UoU6x?V6aCsLQD&e3C;}G1?vmWE4|0*9!syn;4%Wod-UqzLQDSN-Wz8aSq5sjaX)s!jqiVJebJhVy$gEVy|HtL?10*d zdz@auy-YiE7t>tsQ<|?d)MDNr*TyN>gKlVl`Djb;BlI)*I7@zK5c-*X9|-+SKKhyb zFsK|<1rk|*&>+xIPz?zEOnxnBB4{#bDrg31HfUblT?ltEXc_2P&^pj&(5s-Gpgo}d zphKXepfjNJpi5}m3S@!YplnbVP$8%%s00+nX3DTh{}Xi|@Na|}jQEDN4cC2S%-?-X zTY0PV-CVSwXi?G9q7_A}i`EuxDB4uCwWzVEsc3i6zM_LgM~aRYoh~|8bg`&8;0j~} zvI3n0c>!M_80ZxUgL(zZ166_kfkB|5fttYRKy6@RU~*t;U`AkeU|wKhU~ynsU}fOh zz`DSTfz5$e1KR^T1A7Ad1BU`f11Ip?88{RFoex~r~$J13KS=UlMp(Bf zKlaYaRz-FWcF^g`9dwGhgU+?wLFYQ`opYt?ja_qoqN2`EokmsWYPJ%(j?$3*VIPQrc&Dt7^B5eR*0g1VyJbVXa~iZ;>}?V&5`JPCEZE9&|uru^G< zMd9wkeT4@Lj}#s+JY9IM@M2+ek*g@9D66P*QC^V`ZV>1z>Q#iE0NX#d-ZQC_fxV5b z&tnfH6T2S`SC&;{)u=SPlidmXr^}AW9h_Y3d~9>aBe%27*`^%lHRmhszTVLLf9!%7_JcPRUz`d5Vnf0_!D77F8+i}{6Y!6xT1rND@3^^<4WiyY(ftE z$72(5z!nw?p{xsG4;iPVPx#R)>|exRBd{sX$0RXq^6<Y3mUCs6XgGk_>m;f7*Wz zzKcmoGe&g(r}p&0TR5svU9S}O$+->B9LoFOu_wN=!K=&{Rc6j4zttm61~wGZx+N!^g}Z1I`;By@NM#K^)>pM ze7h5FW~FbR@1XBUQh(fc+IP-(G2u_RzGlD6pW)BS8RYLQdVikZmpRQJ^!M_IJJ$Hi z{Z;<{{z3ks{u=*if31I_f3kn7e};c{=8nu=nS1^7{0sey{mVK|O~{kyN4hdE_*eR$ z^{?~4=--^>$;!#f^}m|X`?qHvgJx$|Z~q?ue*dA&eE-qRdjE;Uc@pVr@A}X9&oh0O z;%*{+aW@fvBEAoGKW4rq((^y&S3IBE=a1xj>wHP1_kYZfc=;v6C(0+DzlnTKq%Tpv zNw-~nNR)4(k`RSfqWrSP7PG!y-zwQ7KZEbT$?h5->7IGp zryt#6HN?5>(LL!Nk0-~I>+w2WJONL!r?;of)7Mk&8R!|}8Q~e_8H>H?CxND59c7kh zu4jS!40Hn#t~bKRExauSQI3JsUimJX<}Do+i(3 z&px;ZnI_!TMmt{eQLoc=(9FTE@NVod@Cm%1g*Tf(D()uy3D=6tU2)fdtG5c<`Z%+d zT#mn~`=!hcUS&`7TKQYO?(RFi+1@Uho4TL(=I8JB7J7SnOER0iQE#QUpLYO44o1jf z-jUuh-f{5N+0*PX-Cy*3s?V=-twN zMpn>Um)U5K@ow|(@b2>V?06uv+1}>eYb)=8tX|&3nN8kf-c#MHyl1^`?}g0W-pk#$ z7w84)nHvf`1vv$|1>S-{L2*Ivg0jqg1$_&u^H&!PEErNSBJ*IusDiQiTMH&6;w+d{ zFvWcY$4$4Vfsz(aA|5qr>3cTwocFSCo$p0w zvTt*?o>h)|7V!4-y^6M?yq4FpNBXw6tp)Z0(V^6K`u23M@$Cn92z1n2*!__21Zvha zX`8+?IQMzTFWJ-l%D3Hb`SIxxe|F|>f0u%QKi`jX_xA*q_@f;!JF^RV`ztf|`TG?t z@DK10_V#p7$=vE6mcPh5&F@C2k%(oC9OpZOSjJ`UwpV%cozDKctQpx0vZ}n%?)&}q zPEA&Zf0}=0!3zHz@0f(o9s^%omzCiw7a#0k2kwff_=cv2_YHoH=l*_^{yKJJ+K+vh zI`G}hOun1h5xWkZz}Q>9G=i}_Mo|C8{zd$j${_AybR$O2^Rz}B86QDeE`_feeqCS$+F|zr#8Zdw#rUi)_@0ZhXLNJrE$G%c ze@-`Fg7PjRK9Iym!toNWHGOc}G7d6rACN9dQ!+jAw0uxH>@ecMHOuu#dh-S%50JKu z1>K%S-0Nfc(Ctv(sBY);H|D$ZSLNsDZ?O;MEy%BIolkO2EcN&AQMoUx0M`lWVPt(RMrCSCFD?LKu?}}Ng5Kql$vlkt)1x}p@AbvlAw}L<&uBfeQ9`*xk%bpdD*G`a9E zh0Y_Cd!Z}Vtv}Wi-XG`L>ls+}mv+Eslyfg)b;b*7M%_oL3Evg%LfrH+@VIWu&?Xp8 z^l`o`+DBKcjv`!k?%~`nxyN$rfMbA%b5G?C&Rx!57s#l?HU9tq_Py+O;p6p+t-*%= zBu#c=!Yo_9+7`c?g}oUSR+Z6uQHLHS782hjew~QiKp3oQA*iTTy&Z3BOt6<9? zD1VOlNkMHN`EQbEO4RF={DpWQ(Gpa@BT6o5EmsK|SgQf@EZCVzc+53$_ImPe@(n~k zC0`|vx}-GMbV`mA(}{m4zD<0Sc!u~_;-3UvJ;?Lwu;-IVIuJWi&U`RSD5;|4Jo&Li zSW=`M>mj)6Y(e!$@+-){Lu7iimnol5$y)Lo$ukD*i6h5eLu5)6OG?|!kTET5h^ABG zB{EftxrDEjOAM!ptS5?Btpb!hLHr5vO5$GP*NC4dGN08L;ag(mdpqTPrf_D zFJhRXlvj~|jl7rqb;Q>xxsCkWp#{%Bs^P+{vGmf5F?D?5cwuS z<0&Frw|;^0TH=euvx3?=@~@JowbcJ1yb-f?Z&5pvlFtgdm~w;pVDNg4Sor=7!)q~y zkarQi#L+}rY3%PN@iVuLdBWp+nIicS`QMY@L|jG5o#dHj;{^Gw#K}bFu))@C?4x8H zajBr|4&qCc5M8vo=I1E6kw|M`(B|MSsicJE!jC3v{8X`K#B4QVGwzWv+E)bi_Za?K zLG_BDE1x)s@-5_9`rza!UNvS>!ZT0wfbcr6NRQd}p&~I@`UWkVaW5qmMA~*EmM34J z7SegeG1=m{*rj!&9i!>pP9C;&CqI%%%w)x1>s}4Dq5|Pu~o;;&SM*Rt~oBL3E9kTukglXGY67` z)Xrxv1(=6hnUWeoZFI9+Q1T7ei?r$Usm+e%B(JxDXD?>%RrBgfn5(;(l5FP8Ktbd% z;zSxwAkOm=8)_FMY5}k4JY(y^cml4Y5{Bq$MmyE&8BZ~>fmdBD^#^$_b>O_&gqUk$ zdCM4TSmHJ2G{^&@MHukFLlTl0VA+jkPL7V15z}*t>1kwHH1eoMhCD(^7h_nNPfEei!_MCU*NW_OZ6lCvGs`gZwH%gl}MY!EBakHskNYv|VD(Wb+yu1d%_e z|5`E2x`DNHzO*T{#0`Rm8!5ab`K*ph-m10C^J0c67A;z8 zq=Y%pDDi6#G%@{9`@Pr9T8ZAY+1P&Kgzj+T_GOH6;K zSZPXmK|*BSUW$e1u>sdiNvCm65chC3z1o#4yr3Qsy9AWBTx_7$>08lfqW+83Ma@B~ zw9&*aJY$2{UagoGc&e1L9*C8=s~6-AhEALVT+KXBH#pxVJyZ5CdC8&8c0RtZWQH#$q(H@wyaBDBV2327`P?vvEIET*=O zsa?U;UXs)r``EJ|Grr8TBgb$qX{|dXufR(^e9eV@j_@h!XMuZJA3QDH$)haPYc1&C z5oQtaY|B@Xs%pyv%uXvO!UAZ`X~%?5A4im0S1mc9m%H`=M;gdmeWdGAV2w-K{uue5 zJ4Ox?eyHm#@OIZ_%28MKG3LYMn}K)9-r0~)YstOMT5CG-E5rstUUjYY0Qeef1|`#| zm9bVW?P@jcNiA(=EyIkL+Nj@ap&a%5Eqv8L|E%>3;8fyEjIGLg8IoG-PLZ1u^R1SQ zNp7|J0Xtc50f$;w0JEh&px2i4)L5&5pQR1_Y)qnBM2=Cdpu|(7*O4y<*6Hb#Or@lr z$au8<;HPST0gl&2J6^v5=wN>;;U%xe$9ZXe%J-}t}EeEc7 zFHaEr5F+OHq%7`zPp-N)&OZjerukaI_nrXOH7^9NcyEpHw2gIaM|IMR>Eqdc$G`LUEPJ5nwm0-*F$#XWR)eEm;sl813 zBSatN+XVI4n#?ZBZ>OAdEB#ZH>?ht$OcQMBMxN={IImRy6p7qRKx_=7an7z?L-{WS zoA0EyN>F3|=uDv=TLD`|Ip?8@Gfgd)X3lf9CwS~4h8ZCUyCdg{Y$1<6Tf#H7`u)PIxeUYkwc0@K*8~mDow0{Ic#ZRVtZvD%%yVN0d6tVdk6}2! z#(I~8=^<#0CEs08#mZ=?@EXske~H>y`MyRuQ?7rN@~bGhj`%w9HbEm+`fm%bUqLy` z)Od{iZ;6(mv6p<4AlAwx{ME$Sl)pfXl^T!Ixn7|?#V`i(c|n7S6?X92Od|6f>sF8; zS6_vkYiO90OPCXaI#FXz>QT=3v#D)XD-q@=!Yk&vULX?mSdeH;q4o}AxLM>_g%kM= zl>CkSTY_qaAjVig<1R{QCA5CzZ=|-4TIQSfNy_h_d>rMs2x`Lxu~H|o6;jSzZTSl& zOrgR01}l#+Siu7tU8rSg8lR%1h}zMD+F5EV1@#GX62lw2ggjkt>FC5DMT1@YZPV9N&LX-aa4vnkn5+(KL~h;g>WKbd@qASgo} zHx?-4j`};ss+64u@Gl&k+Ihk8}-8wY*Cs|MaYxZ1164j&4ft}u90 z>G&cHK6Q^BT?2S(w=3?&iL`^ldX37)Q(ay>s9ua%oVYw4cdk0&nd$<= z4$8p3=vOMAx(fTe=gSUtlxN`n>lL`~+~vOf8rqGP+|>n^u2f0-mTXXClV(UrxIt>BO-k^aUO9YaWQcjaV0WN-kvd# zvr?`fmCr#LUV*ys36$`aD7CIA`EDqa?x+U^C|f^DqzE;IJp<~8)V>cx+5^-~3G-oy z+6L{1VFzkI7!B0CEYw@Pg7a^38tSy1jjcU4nqgg(_9Jp}HPp#}g{ajC^I@2SEej`L z4RRjdXj`K;t3&vPg?wi+fOpvXYa_IA+Ejd}ZVA4Sd0BU3ukL|Hy)oNZWURthR~n7I z#!=&(OLt}Cn=idx{me3RfLUWsFsGUG%%$cUbF~DQg8@avgQ8pt^0Y7xZiAAKcC_b*)vY6)bP%NBsUlt^BAv{$=g_YuoyJ zw{BSoj~&w5#2?<#&VRa3yeIA+j=OPvL~;uHNIW+q`Eh@|G$Yk<|B$#lI_^%2yR+i% z!nnIU?#4?qvNi7C9e0n!-SaUw8n-3UoVec?cYC$U1*EUEq?I4JSlX`CN=HNA0msHm zy|i_y=m@{1?eS%O+xZ8!^KWSD?-Oq2N2&B_ZBfMEx|WH*T`lWV)#`Ypzt0HRO{CR5 z7-`nj6!<*KmF7-!(mZLI@agJZbqR&j9qm>}h;!(L@?e>&u+#4-l>W5%`_V_BwUpby z6M*_Z47}Tgd#EwVXDG>~1XjktbErnAxDH=@M`%28lnjmc`60P785+;6A+!nmpN)P$ zUlsBUe>Ei5bA}v$9`_S<{qOD{Af(tV7v>HUA2^ZW&UWjgq0=u)`t-lzeMX4`XGa`3 zqyG1Js*pncZwAhc`{(jJ<6m`*l?@AVrW>7*nhZz-D$AAY^1H4?kJue=LKfhi$e_Fv z=PGvf#M_WpyRJg0G#raLfPP-$*8hQcT#Uz(Z;c_g9OOm^<1@zRkgM_xong(g?$=x7 ztn!H;oHfJ1iY4y!$uorpuBj4KO}nBn%9ZE$`eF1c?^H<(ipdO=PcQT#nv7WEQuL43 zXYmDhl&Jo$ftrYz-MkXbz0JJ~;Uumg`kPezS5cOO9!Pc~jm0EaWwegLy5E|G5esUM zXXwAs-3%S_%{k%x5n*-1Wy=+bH`t2t4Y%G#6eE>6_|Eb?W4^J_XfPHVON?dsBJ(QaS!1oS4&Qj* zfKkjQV~g=B#xgsMoyKmAX!aWijl&q%95+rGr;RhlS&VRQat$}HF|ReRGec&?EH(R> z*PEX-KW%>2yve-L9BzKWyv@AByvw}Xyx07q`6cr{^ULN}%&(eXGrw-$Z$4l?Xnw=| zrumThE%RaX5%V$g+vbzzcg*ja-!oq@e`x;5{IU5H^QY!(=Fc!*`jz<`^9}R2=I_k6 z&3DX`=AX^KntwOnHQ%!|%d|RJj@8k+!s>1nSbnR>>S0}FU2R=sU29!uMXXY*!n)qN z!5V3e#&;hl*j?;gJI@|vkFjg*33i=5*`9*8DQ4KS>^b&ad%nHUUSuz^m)R@qRra&? zT6?|yqP@x9V!vuP+S~0N?tSh9?nCY)?xXJG?i21)?lbOl?hEdV?n~~=?q)}KEGNUs zbG%NW6LgB566bN}3Fj&2Y3CW|Ip=xj2hK~*%g&FTS3JW#Bk``#7*DNdoabwv`#s8si##Ir}=} zI%OFVBcjrS#QLr(v>GOkIPWaf($h6F+sWS%T;GO3dE4+i)GeI2l&G&8QhwA&j}pRM@OE zD^s7Tm#hju(ZB8|(s{R<=Pg9>Ur<>E& z0CNWJ6@1p5Y0gvw%~|Fw^*M94Ia>`f=a_TUjpkf)t{RNFz&!PNe0y`g8e%TM-GiIV zh2}yv)LdjPQa77R%q41=xy)RqhMOzQ6>5aJ%3P&x!G1u`sv7JEv|fF|e9?SSjWjoz zo7Ao57ITXlh3|j9s&2yzG4+x zg=(4=umb9wSnDp517uoYJKTT$FMn}wZ>%GCo_ zrB$hBTlhGUdJwxBeL>B!ZnJJv->~km?oe~B@z!|tP3&;=2{q5Y(!NqXWOuW>srlIL z=vMVD`*!*c5svo%j?*6-a(ftqiKhzK1@4DYr8{PkO|5Lr>e$V}$ z+T>`Crhep@j;S^~9h?s8W$gXbRc&#)JKfcf9lzsOTb&+G5A}+3wSy-Gook(I)laZ9 z)MB;GS?VlRKXsNn%T=SZ(pjlqb5=X6)plo%vqt^QS?8=%JDd&92K94iqq9*pIh&o$ z>KD!yXN%hDY<0G(Ut({mVQLrlmimJFmFHH^t!lUDcF*nV*Pc5)cd9*}yF7QP-{4)z z>1wZMre~&l9Xn6WQTsgeJoD5Wo&}x-YQLw!)1cnOTa$~_0nZZ867^fpGS4z~5N|}T zP;a59D^`ygJ|kfCG)j!Hao$*f`S?^A__~^LF!2bG&(v`KbB0`GonD`Ly|* z`2+JM^JViD#1SxmZvN8zwfVaFrumlnd-D(GAI(3Re=+}N{=@vI*z)TZ-}HRT^N8nh&l8@fJWr!vd5k@ZVvnM+N731r80<@2>`P4c85Vns zH1-qe>?b;~pU7Z8VY8obvp;ayA9&awWU@cVVt>$){XsVSgHG%Za@ZeS!Tz8#`-4xg zKj^~#;7axfx$FW!z>n?S2~H!a;n zTDp5^>FQ|d?xl^JM7#Dy+O^5FYhR)*tEVlykG5;c-c*|cR3(w5DkE&B#-*<4z#Z_;MXqs@AVc4|KD z)VFA-7SK*TOgpuZ7U~gNs0Lc7M`@uJ!9rE4CyfH5$hgY57Q6oa&G?q_sPS#%N#i@l zca85EKQw-1{Mh)3@tW~-78-FnVD6POX)cBigsB47rEqs-`ui4M+ zZw|!ww+G`}-XqP?=2&x_Init|7h{ESxw#Ufg*D~|b0gLox8j)BjUsc0xzpT@?~d=s z7sn5qN6q8rDSV^+9KKF|$!s?MXqHzpOdGG~Re%6ZmV>#TQPbT;9g_uD*ocxLdO z`T3rOp2c|MeYs~PEY_3%k6A1kyLO}9%BS7xPP^sh=(K>=%SY?wr}ZkN^(vzE3ebA> zp!EvUdR;~9)sxoiYFaNmxrfo|HMCy6XuYnb^(vwDx{lVXH?3EQKd`qGl!KucCdOZG`xvVOE=pQ0tJrX~9{Em?nBvd_?x z4WK3aEG^kUTC&g4k`3ax@kZLS!L(~XTDS*k;pWi7eS;QmE-lnTeNTsXyG2FgYm<@~|+Owdm)eiD^;7D+YR1ZXww8z0l+IY2^I;XImkQ(k-72iy3^K6tg!Pes0OuI*0_Pe3 z1TMtWV7ifS-K})<8tWe5wbs4B>m0l>>^|;b?azJULt@0L7-GB#oMT)9&NHw-9%7sg z%(o^o#yZA0i7|Q@BkrXlMy$$NUzE_~CMUTsCAs<}cVCjjx@7!_FDJRF3C=wz$=yf} zIVm}ayGv)xzaRzY%)coYdWC-|3q8X>Q3^k?x8d3}#Q(p04??-ZOuRWeN{z+-E0aM}!Oy@K z%O|S&xJxt&cMCKn&kV#u%9rZOSYNBuAn-$RU#Uus!Tp8ast%!KW%FuY`;Uo7fI8Ow z&WaClNUq#Z{3TIV^>yP^yxshnvL6zU{y&j-Im|V=voZ%XA34~79Gi(dEUVSpIJW^( zJh904StS>9SeyD`U495?1ZtM#{=j%lF>VH=v*Y<$%>4NH`S}2kmo}go|1afjT0Ebk zxPLhqd%bFEByvP@FfDF9<^G1)&se>?hFAC+U~a`(Y*z1x5;`zmB`&jFiz4!F7JfWtipJlu1j6Zag*;hqCmaL)nuh58c2 z^>NAV(FLw^=O+~vic8x41CB>ge@Lc^o)gADiI z^&?5SOP`A01-#9N_qae!NsYXxjwh2rV*6vU==uO1_dxZhyI^_9~uf(;1 zPad&F?+1+q%{+af@W~@)VYDH+(5scK4zdGC%}5O?NQN8%X(M8&)(2|Mt>n0uq^*U# zSnrKACBo}ke>|(KX^TL}&16bS^ejkbU{=|zm9&y~(NG3jtunOZ+G#CTpQJo=jC*kH z+CXS_X?u~bR9rhX=X7+YY69ew;<{KndIE#aC-KC$<67)mtUTNgC^Kzy+Gdr7 zHg!^UWZNlW+qsTyr?+#;Ii*6}4=9Ydv{-A$-a&G&^557Sh`Ry}!jZbZ6lazgq$OtP zPwTHBHI4dCd<)=LsM!J3%%iGAKL)E(VSUB=in_s?j`tj@xIg13xj$n+#x{_#NV#e{ z-dO-H6|@JFm%P&SmvIi1OghIx_KlE<6_B!WAx;;p)^pOL5E5^CVq_)H3w2gf#x5JS z306ip+`Ei(J;|ZGQRf>_Msj~sj_HE2VC)#Ngo&e4JYuH2)sa%8kdi3MW(uBLoQ2x4 z0M8;XjrY|X&_{2@XuSzfMC?-sF=9WiPU9~6MbuuGmVuJ*EM zRD(UmYqg2kSA42ALz|6Vm=ojn3E&ebM_qpsHAr_Ywx;1e@if#RJ#BOP zFR`!GFVlAcccuRd_^b5Yz}?($>euOe!0$=_4e&SVdx3kU7Nx%q%PL=?d;|DK`hMX4 z^f!TTro(QeA4vZ#@VD|UAy=q3_P6vd*JWWj{uLPzYTml z9iz7NqbPkHeFElP+}lb|e+RZ)$Bswn&$!Q(o_+$gUQa)X8lt1_e;)XG`zGK`sP#JP zK4t@~`#Sc+LT$nB{INbQ8@?_ee7sKNv@X(9{pT$Vwg$CBW)W_C2y(SqP(LYW(Kq0p z`FhxrY}keV+8Av*N_f52q#eaGc%AhUeV|^e&qOJ`sPEE`qhrd&U4X&H1kAmb<8JmI zssmB;@amrW2T$34l@FG_2!$au?}*;Jcsp&fK`RN#Z#<>)*7qP zI%Hi)%S!8+R-HCFZCcu*v~_7a(vGBEO3z8}l|CSSZ2FA!CFvW|cOsvgJ9O#LyThOk z<2uahu&l$z4!b*?$j~$LGNKtnGA3rs$ykxGIb(0eY1^{Bb~$!+o`kjkRaoWUZ=ZE% zxC`BV-8Jrd_X78`c*@|Q`@G}99prw_C}*nEfHku1&SB@GCmZ`s_Qzf0=^ojUC>>9r zepb^jzWr9n%8M%u$kVoHP70Syou!ITCq1{!HMCy6Ny);FO6 zLL->cpk+ZL?dv2lr9m5lM%vs-VoHM+2#vJElf;w;tr8k(n5Rt}A{^^?TZF)OJ7LL->cJWUM{8o`ui6*WL;1XG&tQUioW zFr`^d4G`5rYuXarN5HPis15lm^GqXr0#U`m5IHF5_C zjbKXieQJQv2&Odar~yJFn9@8?4GcY@h}RjbKXi18RWK z2&ObIQUioWFs1n+H9%+tQ<{y`0HF~~XLk$ob!Ib7V)BvFoOlkH~1B6B}rFoqiAT)w0 z%|2>?&PYnGGd0NP0Nz;Gmc@)BBqXE%aV~bj%m}fWSos-*s_SJW7x7}1de0cv@98q;~2Iq zV(J*SEE%cem^Lj-#_c#p+SEy6>KL{x8PP-2re(?a9>=g{5mU#oWy#1N$Fyl#G7rEp zKxhP0$FOC|3;~)pElcJLI0gufVCopQESX6_)23y~yaLCtWf4=yuw}`N1IM&!Su+2? zF>G1H)G=&XGBd$3ZCaMhQ*aDh7BO`UTb9gVa7>$)CG!~^!z z2gk5w5mU#oWu>!a5mOqrESV)Cwl*zG=1hoxk8Xz=+DNP|YKxhP0nj&g| z&#|_vL)oc4Gz0MVAW_a)(>PY$|Yqdgf*atp;Pu?$Ze+Hjg`ZZSaIr& z`zwR7>RpffHmPsNHL1OL-|jfp5HD$NtoL}ep4tGOB~t1M$!{o;(w5aY7spYue&*u1DaMISk8xtXW1QIR#F@oDFJ+$`i$kn(ER{5(P4Shv2 zHnEILSyOqPsA98Yna zydo})h4D|tqv>hFKU*T1Dykn+lXEoYctkYt|YQVx`Uv*klAFZmN>zuNhEqD2Jq$6gtZh{4qXHGQC`2@M5 z4yys4cLDx8tDYLh6b8;J&ok(JB1Pd0N^%V66x)qG9tAVLL|&|PtCdpDydUN)`*G@} z{zOsI9>gf`#fmk?PDqFw>#EW_rENy!wz3OX{IJ!`D}`Ko8CNLd7D<;^IarVU zsk_nrntQwZXYL*DpSzpfzi{t#{}S&)Np7`%M@qw;_e|UwNIbF8FMj8EBrN?nJfBdH z`lNeq*54&wBL0(jnfM;Dnb;x-b0UcJ0dY292GJ(E1+Dvuv*a3DrzZKnRcBlu?|?Yj zcFEcq#Lf5sDpH?E zT6#8ko-uYe20n=cC60#-G!1uPT~eash+i=^&1I~y43yyT;Z<~R`|>u+&`j5?ZB=RF zmb{jp=2E6>(m(sBo?PUHi*(mw!Ua1>D%K@ zR=RSh4`18%7ZbJ&Z}aPzraA2n_H|5G&ijrY9+S2`dU(scM}36@9?JGrrH&{t7gj&iu@zI5ouQnJwU3W{Zut9P2zA5n|NAX1 z?}M{B9kk4hR7zT>ttux&Wo8VY_{@m49|SS&2gZss&70HT*RjjI>ahhK+p}4TOZ)(L zNY9^KUfXi+`z)c zm;dunWGJ(Fk7oM{t3S-+{eWC~zo@F`bHnd%#_1lvrRAOBE$@D?=ZLg<{9zXoV*=bR zAn65R2Vx2XyUCyzNd9T}XGx^h^3Xbdc~&Z!-NI47`c=A>lJJ7+%6A(_`b+Z27Yhzuhi=+h%y#)hHRi?TUxL zjPS9n;_;Fmx0~SywGQugrBm-lcz3(-j>GV^t;0L<@D9Q|?ZSIJ3_k>?Ouu8wrZtEg;qmrc@=wBNWifo4^39Bg&qVmlcHujAWcW7a zn`z2cGYIuN@W$YofS8^QVLY3W4F1u*qX%5TLA;)cYJWbq;X;b3dG2J9N24&d6Y`&Dz#nLqwIvaZz^=Nm@^N>3p z={nzgxBW4)S64@jJxi0vFfL6pyc0%u*SC`ofIJ5y)vBbN>C)zjykiID?r`}Z?arZX zhb|Z6>!HbGcn-{Ar3}hdO;XOdbh*a799w1D|GbcjE2e9V>pX3Aj1N04DCNa7>2+=6 zGiE~`_=KZ6I+xCajkO85L6BZsH)(vF?|fg3?+d^0llAvbD)xTrtMzro-p|zEbx*N( W5Ox*&Bz74q_P$>?0Q-)`Li~RsI;G|S literal 0 HcmV?d00001 diff --git a/data/new_dialog.vns b/data/new_dialog.vns new file mode 100644 index 0000000..c10d74a --- /dev/null +++ b/data/new_dialog.vns @@ -0,0 +1,33 @@ +proc main + //call text_append("hello, line, paint, color, design, address, brightness") + //wait + //call text_clear() + + //call ctr_set("Arthur", 5) + //call ctr_set_talking("Arthur") + + //call text_append("hello, line, paint, color, design, address, iida") + //wait + //call text_clear() + + //call ctr_remove("Arthur") + + $ "There was something stange with the setting. Something hanging in the air that you couldn't quite explain." + $ "Your insticts told you to run away, burn it with fire, and assert that it would never see the light of day ever again." + $ "Still it beckoned you..." + $("Arthur", ArthurNormal) "WOAH! Easy there buddy!" + $("Arthur", ArthurHappy) "Wouldn't want you sticking your nose were it don't belong now do we?" + + $ "Arthur was his usual friendly self, but something about his tone startled me. It was almost as if he explicily wanted me to know he was hiding something, simply by his mannerisms alone." + + $("Arthur") "How about we just forget this ever happened, okay? Look, I'll get you a beer if you just head over to the bar. Tell the bartender I sent you, alright sport?" + + call ctr_remove("Arthur") + + $ "Without thinking, I started moving towards the bar." + $ "Not necissarily because I wanted what he offered. Or atleast not the beer." + $ "But the idea of just forgetting what I saw. That THING, whatever it was..." + $ "That alone was enticing enough." + + call proc_set("main") +end \ No newline at end of file diff --git a/data/proc_test.vns b/data/proc_test.vns new file mode 100644 index 0000000..d93ac0e --- /dev/null +++ b/data/proc_test.vns @@ -0,0 +1,10 @@ +proc main + $ "yooooooooooooo" + call proc_set("stuff") +end + +proc stuff + $("Arthur", ArthurNormal) "Hi! I'm Arthur!" + call ctr_remove("Arthur") + call proc_set("main") +end \ No newline at end of file diff --git a/data/scene.vnn b/data/scene.vnn deleted file mode 100644 index 8e63f8da51eec5cd9bcf369a9b6daab6782912f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184 zcmZQ(VB}$NEGo$;E%M7R%1z8+;<~PE!_2_IV9&tNV9#