From e98f64c4193cf6c95795513aa87fe31c784d681a Mon Sep 17 00:00:00 2001 From: Paul Date: Fri, 15 Dec 2000 20:29:33 +0000 Subject: [PATCH] --- Utils/Scripter/codegen.cpp | 21 +- Utils/Scripter/codegen.h | 24 +- Utils/Scripter/function.cpp | 61 ++- Utils/Scripter/function.h | 12 +- Utils/Scripter/lexer.cpp | 503 +++++++++++------- Utils/Scripter/lexer.h | 2 +- Utils/Scripter/lexer.l | 5 + Utils/Scripter/parser.cpp | 421 +++++++++------ Utils/Scripter/parser.h | 25 +- Utils/Scripter/parser.v | 403 ++++++++------ Utils/Scripter/parser.y | 28 +- Utils/Scripter/scripter.dsp | 8 + data/Scripts/test.scr | 41 +- makefile.gaz | 3 +- source/script/function.cpp | 46 +- source/script/function.h | 3 + source/script/script.cpp | 50 +- source/script/script.h | 25 +- tools/scripter.exe | Bin 221247 -> 229439 bytes .../spongebob project/spongebob project.dsp | 8 + 20 files changed, 1052 insertions(+), 637 deletions(-) diff --git a/Utils/Scripter/codegen.cpp b/Utils/Scripter/codegen.cpp index 246488a4e..bffe91dd9 100644 --- a/Utils/Scripter/codegen.cpp +++ b/Utils/Scripter/codegen.cpp @@ -26,6 +26,10 @@ #include "parser.h" #endif +#ifndef __FUNCTION_H__ +#include "function.h" +#endif + /* Std Lib ------- */ @@ -76,7 +80,7 @@ extern int parseFile(char *_filename,CTreeNode *_baseNode) { if(s_lexer.yycreate(&s_parser)) { - if(s_lexer.openInputFile(_filename)==true) + if(s_lexer.openInputFile(_filename)==(int)true) { s_parser.setCurrentLexer(&s_lexer); s_parser.setBaseNode(_baseNode); @@ -180,6 +184,9 @@ CTreeNode::CTreeNode(NodeType _type,int _data) case VALUE_EXPR: m_value=_data; break; + case FUNCTION_EXPR: + m_functionNumber=_data; + break; default: printf("ARSE\n"); break; @@ -240,7 +247,11 @@ int CTreeNode::generateCode(int _write) codeSize+=emit(OP_JMP,_write); codeSize+=m_children[2]->generateCode(_write); break; - + + case POP_STMT: // pop + codeSize+=emit(OP_POP,_write); + break; + case ASSIGN_EXPR: // assign [ variable, number ] codeSize+=m_children[1]->generateCode(_write); codeSize+=emit(OP_PUSHVALUE,_write); @@ -274,6 +285,12 @@ int CTreeNode::generateCode(int _write) codeSize+=emit(OP_ADD,_write); break; + case FUNCTION_EXPR: // function [functionNumber] + codeSize+=emit(OP_CALL_FUNCTION,_write); + codeSize+=emit(getFunctionNumber(),_write); + codeSize+=emit(getFunctionArgCount(getFunctionNumber()),_write); + break; + default: printf("UNHANDLED CASE %d\n",m_type); break; diff --git a/Utils/Scripter/codegen.h b/Utils/Scripter/codegen.h index 92c64d6a5..58faf9eab 100644 --- a/Utils/Scripter/codegen.h +++ b/Utils/Scripter/codegen.h @@ -35,6 +35,7 @@ typedef enum PAUSE_STMT, // pause IF_STMT, // if [expression, ifcode] IFELSE_STMT, // if [expression, ifcode, elsecode] + POP_STMT, // pop // Expressions ASSIGN_EXPR, // assignment [variable, value] @@ -43,6 +44,7 @@ typedef enum VARIABLE_EXPR, // variable VALUE_EXPR, // value PLUS_EXPR, // + [value, value] + FUNCTION_EXPR, // function [functionNumber] }NodeType; @@ -64,26 +66,29 @@ public: int getVariableIdx() {return m_variableIdx;} int getValue() {return m_value;} int getType() {return m_type;} + int getFunctionNumber() {return m_functionNumber;} private: // Nothing else needs to know these so we may as well protect them enum { - // args stack data result + // args stack data result OP_NOP=0x1100, // OP_STOP, // OP_PAUSE, // OP_PUSHVALUE, // value OP_PUSHVARVALUE, // varidx - OP_JMP, // jump - OP_JMPF, // jump, value - OP_JMPT, // jump, value - OP_IS_EQUAL_VALUE, // value, value pushes result ( 0 or 1 ) to stack - OP_IS_NOTEQUAL_VALUE, // value, value pushes result ( 0 or 1 ) to stack - OP_ASSIGN, // varidx, value - OP_ADD, // value, value pushes result to stack - OP_PRINT, // value + OP_POP, // value + OP_JMP, // jump + OP_JMPF, // jump, value + OP_JMPT, // jump, value + OP_IS_EQUAL_VALUE, // value, value pushes result ( 0 or 1 ) to stack + OP_IS_NOTEQUAL_VALUE, // value, value pushes result ( 0 or 1 ) to stack + OP_ASSIGN, // varidx, value + OP_ADD, // value, value pushes result to stack + OP_PRINT, // value + OP_CALL_FUNCTION, // functionNumber, argcount args pushes return value to stack }; enum{MAX_CHILD_NODES=3}; @@ -95,6 +100,7 @@ private: NodeType m_type; CTreeNode *m_children[MAX_CHILD_NODES]; int m_numChildren; + int m_functionNumber; signed short m_variableIdx; signed short m_value; diff --git a/Utils/Scripter/function.cpp b/Utils/Scripter/function.cpp index 5a0073f9e..69429487e 100644 --- a/Utils/Scripter/function.cpp +++ b/Utils/Scripter/function.cpp @@ -45,6 +45,13 @@ Structure defintions -------------------- */ +struct FunctionDef +{ + char *m_name; + int m_argCount; +}; + + /*---------------------------------------------------------------------- Function Prototypes ------------------- */ @@ -54,7 +61,8 @@ ---- */ static FunctionDef s_functionNames[]= { - { 0, "print", 1, }, + { "setCharacterExpression", 2, }, // character, expression + { "setText", 1, }, // textId }; static int s_functionCount=sizeof(s_functionNames)/sizeof(FunctionDef); @@ -68,7 +76,7 @@ extern myparser s_parser; Params: Returns: ---------------------------------------------------------------------- */ -extern FunctionDef *lookupFunctionName(char *_name) +extern int lookupFunctionName(char *_name) { int i; FunctionDef *fp; @@ -78,14 +86,14 @@ extern FunctionDef *lookupFunctionName(char *_name) { if(strcmp(fp->m_name,_name)==0) { - return fp; + return i; } fp++; } printf("Unknown function name _%s\n",_name); s_lexer.error(); - return NULL; + return -1; } @@ -107,38 +115,63 @@ extern int getFunctionArgCount(int _functionNumber) Params: Returns: A treenode that contains all of the functions arguments ---------------------------------------------------------------------- */ -extern CTreeNode *getFunctionArgs(int _argCount) +extern CTreeNode *getFunctionArgs(int _functionNumber) { - int i; + int argCount,i; int tokenType; - if(_argCount) + argCount=s_functionNames[_functionNumber].m_argCount; + if(argCount) { CTreeNode *base; -// base=new CTreeNode(STMT_LIST - for(i=0;i<_argCount;i++) + base=NULL; + for(i=0;i -#line 20 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 21 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" // repeated because of possible precompiled header #include @@ -28,11 +29,11 @@ Date: 07 December 2000 YYLEXNAME::YYLEXNAME() { yytables(); -#line 45 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 46 "C:\\spongebob\\Utils\\scripter\\lexer.l" // place any extra initialisation code here -#line 36 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 37 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } #ifndef YYTEXT_SIZE @@ -78,166 +79,180 @@ void YYLEXNAME::yyunput(int ch) int YYLEXNAME::yyaction(int action) { -#line 57 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 58 "C:\\spongebob\\Utils\\scripter\\lexer.l" // extract yylval for use later on in actions YYSTYPE& yylval = *(YYSTYPE*)yyparserptr->yylvalptr; -#line 87 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 88 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" yyreturnflg = 1; switch (action) { case 1: { -#line 64 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 65 "C:\\spongebob\\Utils\\scripter\\lexer.l" if(preprocessorCmd(yytext+1)!=(int)true)error(); -#line 94 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 95 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 2: { -#line 65 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 66 "C:\\spongebob\\Utils\\scripter\\lexer.l" printf("# commands must be at start of line!\n");error(); -#line 101 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 102 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 3: { -#line 67 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 68 "C:\\spongebob\\Utils\\scripter\\lexer.l" return STOP; -#line 108 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 109 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 4: { -#line 68 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 69 "C:\\spongebob\\Utils\\scripter\\lexer.l" return IF; -#line 115 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 116 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 5: { -#line 69 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 70 "C:\\spongebob\\Utils\\scripter\\lexer.l" return ELSE; -#line 122 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 123 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 6: { -#line 70 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 71 "C:\\spongebob\\Utils\\scripter\\lexer.l" return PAUSE; -#line 129 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 130 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 7: { -#line 71 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 72 "C:\\spongebob\\Utils\\scripter\\lexer.l" return PRINT; -#line 136 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 137 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 8: { -#line 72 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 73 "C:\\spongebob\\Utils\\scripter\\lexer.l" return ASSIGN; -#line 143 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 144 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 9: { -#line 73 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 74 "C:\\spongebob\\Utils\\scripter\\lexer.l" return EQUAL; -#line 150 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 151 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 10: { -#line 74 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 75 "C:\\spongebob\\Utils\\scripter\\lexer.l" return NOTEQUAL; -#line 157 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 158 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 11: { -#line 75 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 76 "C:\\spongebob\\Utils\\scripter\\lexer.l" return PLUS; -#line 164 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 165 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 12: { -#line 76 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 77 "C:\\spongebob\\Utils\\scripter\\lexer.l" return END_STMT; -#line 171 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 172 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 13: { -#line 77 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 78 "C:\\spongebob\\Utils\\scripter\\lexer.l" return OPEN_PAR; -#line 178 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 179 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 14: { -#line 78 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 79 "C:\\spongebob\\Utils\\scripter\\lexer.l" return CLOSE_PAR; -#line 185 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 186 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 15: { -#line 79 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 80 "C:\\spongebob\\Utils\\scripter\\lexer.l" return BEGIN_CS; -#line 192 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 193 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 16: { -#line 80 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 81 "C:\\spongebob\\Utils\\scripter\\lexer.l" return END_CS; -#line 199 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 200 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 17: { #line 82 "C:\\spongebob\\Utils\\scripter\\lexer.l" -yylval.variableIdx=lookupVarName(yytext+1);return VARIABLE; -#line 206 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +return COMMA; +#line 207 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 18: { -#line 83 "C:\\spongebob\\Utils\\scripter\\lexer.l" -yylval.value=atoi(yytext);return VALUE; -#line 213 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 85 "C:\\spongebob\\Utils\\scripter\\lexer.l" +yylval.variableIdx=lookupVarName(yytext+1);return VARIABLE; +#line 214 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 19: { #line 86 "C:\\spongebob\\Utils\\scripter\\lexer.l" - -#line 220 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +yylval.value=atoi(yytext);return VALUE; +#line 221 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 20: { -#line 87 "C:\\spongebob\\Utils\\scripter\\lexer.l" - -#line 227 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 89 "C:\\spongebob\\Utils\\scripter\\lexer.l" +yylval.functionNumber=lookupFunctionName(yytext+1);return FUNCTION; +#line 228 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 21: { -#line 88 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 91 "C:\\spongebob\\Utils\\scripter\\lexer.l" -#line 234 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 235 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 22: { -#line 90 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 92 "C:\\spongebob\\Utils\\scripter\\lexer.l" + +#line 242 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" + } + break; + case 23: + { +#line 93 "C:\\spongebob\\Utils\\scripter\\lexer.l" + +#line 249 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" + } + break; + case 24: + { +#line 95 "C:\\spongebob\\Utils\\scripter\\lexer.l" unexpectedChar(); -#line 241 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 256 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; default: @@ -253,7 +268,7 @@ unexpectedChar(); #pragma warn .rch // to the old state #endif #endif -#line 92 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 97 "C:\\spongebob\\Utils\\scripter\\lexer.l" @@ -261,7 +276,7 @@ unexpectedChar(); // programs section -#line 265 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 280 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" void YYLEXNAME::yytables() { @@ -273,7 +288,7 @@ void YYLEXNAME::yytables() }; yymatch = match; - yytransitionmax = 251; + yytransitionmax = 336; static const yytransition_t YYNEARFAR YYBASED_CODE transition[] = { { 0, 0 }, { 0, 0 }, @@ -285,9 +300,9 @@ void YYLEXNAME::yytables() { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 19, 19 }, - { 0, 30 }, - { 0, 41 }, + { 21, 21 }, + { 0, 33 }, + { 0, 44 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, @@ -308,7 +323,7 @@ void YYLEXNAME::yytables() { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 19, 19 }, + { 21, 21 }, { 0, 0 }, { 0, 0 }, { 3, 1 }, @@ -323,141 +338,226 @@ void YYLEXNAME::yytables() { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 30, 18 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, + { 33, 20 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 27, 8 }, - { 28, 9 }, + { 29, 8 }, + { 30, 9 }, { 0, 0 }, { 0, 0 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 29, 29 }, + { 31, 31 }, { 0, 0 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 29, 29 }, - { 0, 16 }, - { 0, 16 }, - { 0, 16 }, - { 0, 16 }, - { 0, 16 }, - { 0, 16 }, - { 0, 16 }, - { 0, 16 }, - { 0, 16 }, - { 0, 16 }, - { 19, 2 }, - { 20, 2 }, - { 33, 25 }, - { 40, 38 }, - { 22, 4 }, - { 25, 7 }, - { 32, 24 }, - { 37, 33 }, - { 35, 31 }, - { 31, 22 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 36, 27 }, + { 43, 41 }, + { 24, 4 }, + { 35, 26 }, + { 40, 36 }, { 38, 34 }, - { 24, 6 }, - { 17, 17 }, - { 17, 17 }, - { 17, 17 }, - { 17, 17 }, - { 17, 17 }, - { 17, 17 }, - { 17, 17 }, - { 17, 17 }, - { 17, 17 }, - { 17, 17 }, - { 26, 7 }, - { 19, 2 }, + { 34, 24 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 41, 37 }, + { 26, 6 }, + { 37, 28 }, + { 25, 5 }, + { 32, 32 }, + { 39, 35 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 32, 32 }, + { 0, 17 }, + { 0, 17 }, + { 0, 17 }, + { 0, 17 }, + { 0, 17 }, + { 0, 17 }, + { 0, 17 }, + { 0, 17 }, + { 0, 17 }, + { 0, 17 }, + { 0, 19 }, + { 0, 19 }, + { 0, 19 }, + { 0, 19 }, + { 0, 19 }, + { 0, 19 }, + { 0, 19 }, + { 0, 19 }, + { 0, 19 }, + { 0, 19 }, + { 21, 2 }, + { 22, 2 }, + { 27, 7 }, + { 18, 18 }, + { 18, 18 }, + { 18, 18 }, + { 18, 18 }, + { 18, 18 }, + { 18, 18 }, + { 18, 18 }, + { 18, 18 }, + { 18, 18 }, + { 18, 18 }, + { 42, 40 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 28, 7 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 21, 2 }, { 9, 2 }, - { 34, 26 }, - { 41, 2 }, - { 16, 2 }, - { 23, 5 }, - { 36, 32 }, - { 39, 37 }, + { 0, 0 }, + { 44, 2 }, + { 17, 2 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, { 12, 2 }, { 13, 2 }, { 0, 0 }, { 10, 2 }, + { 16, 2 }, { 0, 0 }, { 0, 0 }, - { 0, 0 }, + { 20, 2 }, + { 18, 2 }, + { 18, 2 }, + { 18, 2 }, + { 18, 2 }, + { 18, 2 }, + { 18, 2 }, + { 18, 2 }, + { 18, 2 }, + { 18, 2 }, { 18, 2 }, - { 17, 2 }, - { 17, 2 }, - { 17, 2 }, - { 17, 2 }, - { 17, 2 }, - { 17, 2 }, - { 17, 2 }, - { 17, 2 }, - { 17, 2 }, - { 17, 2 }, { 0, 0 }, { 11, 2 }, { 0, 0 }, @@ -495,7 +595,7 @@ void YYLEXNAME::yytables() { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 0, 0 }, + { 19, 2 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, @@ -532,46 +632,49 @@ void YYLEXNAME::yytables() static const yystate_t YYNEARFAR YYBASED_CODE state[] = { { 0, 0, 0 }, { 2, 1, 0 }, - { -21, 125, 0 }, + { -23, 210, 0 }, { 0, 0, 2 }, - { 38, 22, 22 }, - { 0, 60, 22 }, - { 0, 37, 22 }, - { 0, 42, 22 }, + { 41, 20, 24 }, + { 0, 68, 24 }, + { 0, 60, 24 }, + { 0, 124, 24 }, { 9, 1, 8 }, - { 0, 2, 22 }, + { 0, 2, 24 }, { 0, 0, 11 }, { 0, 0, 12 }, { 0, 0, 13 }, { 0, 0, 14 }, { 0, 0, 15 }, { 0, 0, 16 }, - { 29, 76, 22 }, - { 0, 98, 18 }, + { 0, 0, 17 }, + { 31, 151, 24 }, + { 0, 174, 19 }, + { 32, 161, 24 }, + { 0, 1, 24 }, { 0, 1, 22 }, - { 0, 1, 20 }, - { 0, 0, 21 }, - { 0, 0, 22 }, - { 0, 32, 0 }, + { 0, 0, 23 }, + { 0, 0, 24 }, + { 0, 29, 0 }, { 0, 0, 4 }, - { 33, 25, 0 }, - { 0, 19, 0 }, - { 0, 54, 0 }, + { 36, 22, 0 }, + { 0, 17, 0 }, + { 0, 64, 0 }, { 0, 0, 9 }, { 0, 0, 10 }, - { 38, 1, 17 }, - { -30, 1, 19 }, - { 0, 30, 0 }, - { 37, 62, 0 }, - { 0, 26, 0 }, - { 0, 34, 0 }, + { 41, 1, 18 }, + { 41, 76, 20 }, + { -33, 1, 21 }, + { 0, 27, 0 }, + { 40, 71, 0 }, + { 0, 23, 0 }, + { 0, 57, 0 }, { 0, 0, 3 }, { 0, 0, 5 }, - { 0, 63, 0 }, - { 0, 21, 0 }, + { 0, 131, 0 }, + { 0, 19, 0 }, { 0, 0, 6 }, { 0, 0, 7 }, - { -41, 2, 1 } + { -44, 2, 1 } }; yystate = state; @@ -598,6 +701,8 @@ void YYLEXNAME::yytables() 0, 0, 0, + 0, + 0, 0 }; yybackup = backup; diff --git a/Utils/Scripter/lexer.h b/Utils/Scripter/lexer.h index 4fb28b7fa..aebafc298 100644 --- a/Utils/Scripter/lexer.h +++ b/Utils/Scripter/lexer.h @@ -15,7 +15,7 @@ protected: virtual int yyaction(int action); public: -#line 24 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 25 "C:\\spongebob\\Utils\\scripter\\lexer.l" int openInputFile(char *_filename); int closeInputFile(); diff --git a/Utils/Scripter/lexer.l b/Utils/Scripter/lexer.l index 009a60c50..533b209ac 100644 --- a/Utils/Scripter/lexer.l +++ b/Utils/Scripter/lexer.l @@ -8,6 +8,7 @@ Date: 07 December 2000 #include "parser.h" #include "var.h" +#include "function.h" #include "prepro.h" #include @@ -78,11 +79,15 @@ print {return PRINT;} \) {return CLOSE_PAR;} \{ {return BEGIN_CS;} \} {return END_CS;} +, {return COMMA;} + \$[a-zA-Z_][a-zA-Z_0-9]* {yylval.variableIdx=lookupVarName(yytext+1);return VARIABLE;} [0-9]+ {yylval.value=atoi(yytext);return VALUE;} // \"[^\"]*\" {printf("s:%s\n",yytext);return STRING;} +_[a-zA-Z_][a-zA-Z_0-9]* {yylval.functionNumber=lookupFunctionName(yytext+1);return FUNCTION;} + \/\/.* {} [ \t]+ {} \n {} diff --git a/Utils/Scripter/parser.cpp b/Utils/Scripter/parser.cpp index 37a229a96..5dc6a322e 100644 --- a/Utils/Scripter/parser.cpp +++ b/Utils/Scripter/parser.cpp @@ -9,12 +9,13 @@ ParserWizard generated YACC file. Date: 07 December 2000 ****************************************************************************/ +#include "function.h" #include "lexer.h" #include "codegen.h" -#line 18 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 19 "C:\\spongebob\\Utils\\scripter\\parser.cpp" // repeated because of possible precompiled header #include @@ -26,11 +27,11 @@ Date: 07 December 2000 YYPARSENAME::YYPARSENAME() { yytables(); -#line 38 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 43 "C:\\spongebob\\Utils\\scripter\\parser.y" // place any extra initialisation code here -#line 34 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 35 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } #ifndef YYSTYPE @@ -75,9 +76,9 @@ void YYPARSENAME::yyaction(int action) yyinitdebug((void YYFAR**)yya, 2); #endif { -#line 92 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 102 "C:\\spongebob\\Utils\\scripter\\parser.y" s_baseTreeNode=yyattribute(1 - 1).treenode; -#line 81 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 82 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; @@ -88,17 +89,17 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 3); #endif { -#line 96 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 106 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(STMT_LIST,yyattribute(1 - 2).treenode,yyattribute(2 - 2).treenode); -#line 94 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 95 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; case 2: { -#line 97 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 107 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(EMPTY_STMT); -#line 102 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 103 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } break; case 3: @@ -108,9 +109,9 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 2); #endif { -#line 101 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 111 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(EMPTY_STMT); -#line 114 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 115 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; @@ -121,9 +122,9 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 3); #endif { -#line 102 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 112 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(STOP_STMT); -#line 127 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 128 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; @@ -134,9 +135,9 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 3); #endif { -#line 103 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 113 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(PAUSE_STMT); -#line 140 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 141 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; @@ -147,9 +148,9 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 6); #endif { -#line 104 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 114 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(PRINT_STMT,yyattribute(3 - 5).treenode); -#line 153 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 154 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; @@ -160,9 +161,9 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 3); #endif { -#line 105 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 115 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(1 - 2).treenode; -#line 166 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 167 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; @@ -173,9 +174,9 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 6); #endif { -#line 106 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 116 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(IF_STMT,yyattribute(3 - 5).treenode,yyattribute(5 - 5).treenode); -#line 179 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 180 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; @@ -186,9 +187,9 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 8); #endif { -#line 107 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 117 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(IFELSE_STMT,yyattribute(3 - 7).treenode,yyattribute(5 - 7).treenode,yyattribute(7 - 7).treenode); -#line 192 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 193 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; @@ -199,22 +200,22 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 4); #endif { -#line 108 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 118 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(STMT_LIST,yyattribute(2 - 3).treenode); -#line 205 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 206 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; case 11: { #ifdef YYDEBUG - YYSTYPE YYFAR* yya[4]; - yyinitdebug((void YYFAR**)yya, 4); + YYSTYPE YYFAR* yya[3]; + yyinitdebug((void YYFAR**)yya, 3); #endif { -#line 113 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(ASSIGN_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); -#line 218 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 119 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(STMT_LIST,yyattribute(1 - 2).treenode,new CTreeNode(POP_STMT)); +#line 219 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; @@ -225,22 +226,22 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 4); #endif { -#line 118 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(2 - 3).treenode; -#line 231 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 124 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(ASSIGN_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); +#line 232 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; case 13: { #ifdef YYDEBUG - YYSTYPE YYFAR* yya[2]; - yyinitdebug((void YYFAR**)yya, 2); + YYSTYPE YYFAR* yya[4]; + yyinitdebug((void YYFAR**)yya, 4); #endif { -#line 119 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(1 - 1).treenode; -#line 244 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 129 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(2 - 3).treenode; +#line 245 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; @@ -251,22 +252,22 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 2); #endif { -#line 120 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 130 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(1 - 1).treenode; -#line 257 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 258 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; case 15: { #ifdef YYDEBUG - YYSTYPE YYFAR* yya[4]; - yyinitdebug((void YYFAR**)yya, 4); + YYSTYPE YYFAR* yya[2]; + yyinitdebug((void YYFAR**)yya, 2); #endif { -#line 124 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(EQUAL_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); -#line 270 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 131 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(1 - 1).treenode; +#line 271 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; @@ -277,22 +278,22 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 4); #endif { -#line 128 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(NOTEQUAL_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); -#line 283 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 135 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(EQUAL_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); +#line 284 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; case 17: { #ifdef YYDEBUG - YYSTYPE YYFAR* yya[2]; - yyinitdebug((void YYFAR**)yya, 2); + YYSTYPE YYFAR* yya[4]; + yyinitdebug((void YYFAR**)yya, 4); #endif { -#line 133 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(VARIABLE_EXPR,yyattribute(1 - 1).variableIdx); -#line 296 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 139 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(NOTEQUAL_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); +#line 297 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; @@ -303,9 +304,9 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 2); #endif { -#line 137 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(VALUE_EXPR,yyattribute(1 - 1).value); -#line 309 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 144 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(VARIABLE_EXPR,yyattribute(1 - 1).variableIdx); +#line 310 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; @@ -316,22 +317,74 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 2); #endif { -#line 138 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(VARIABLE_EXPR,yyattribute(1 - 1).variableIdx); -#line 322 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 148 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(VALUE_EXPR,yyattribute(1 - 1).value); +#line 323 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; case 20: { +#ifdef YYDEBUG + YYSTYPE YYFAR* yya[2]; + yyinitdebug((void YYFAR**)yya, 2); +#endif + { +#line 149 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(VARIABLE_EXPR,yyattribute(1 - 1).variableIdx); +#line 336 "C:\\spongebob\\Utils\\scripter\\parser.cpp" + } + } + break; + case 21: + { #ifdef YYDEBUG YYSTYPE YYFAR* yya[4]; yyinitdebug((void YYFAR**)yya, 4); #endif { -#line 139 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 150 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(PLUS_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); -#line 335 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 349 "C:\\spongebob\\Utils\\scripter\\parser.cpp" + } + } + break; + case 22: + { +#ifdef YYDEBUG + YYSTYPE YYFAR* yya[2]; + yyinitdebug((void YYFAR**)yya, 2); +#endif + { +#line 151 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(1 - 1).treenode; +#line 362 "C:\\spongebob\\Utils\\scripter\\parser.cpp" + } + } + break; + case 23: + { +#ifdef YYDEBUG + YYSTYPE YYFAR* yya[3]; + yyinitdebug((void YYFAR**)yya, 3); +#endif + { +#line 156 "C:\\spongebob\\Utils\\scripter\\parser.y" +if(yyattribute(1 - 2).functionNumber!=-1){m_functionNumber=yyattribute(1 - 2).functionNumber;m_functionArgs=getFunctionArgs(yyattribute(1 - 2).functionNumber);} +#line 375 "C:\\spongebob\\Utils\\scripter\\parser.cpp" + } + } + break; + case 24: + { +#ifdef YYDEBUG + YYSTYPE YYFAR* yya[5]; + yyinitdebug((void YYFAR**)yya, 5); +#endif + { +#line 157 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(STMT_LIST,m_functionArgs,new CTreeNode(FUNCTION_EXPR,m_functionNumber)); +#line 388 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; @@ -340,14 +393,14 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; break; } } -#line 144 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 162 "C:\\spongebob\\Utils\\scripter\\parser.y" ///////////////////////////////////////////////////////////////////////////// // programs section -#line 351 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 404 "C:\\spongebob\\Utils\\scripter\\parser.cpp" void YYPARSENAME::yytables() { yyattribute_size = sizeof(YYSTYPE); @@ -371,8 +424,9 @@ void YYPARSENAME::yytables() { "CLOSE_PAR", 268 }, { "BEGIN_CS", 269 }, { "END_CS", 270 }, - { "VARIABLE", 271 }, - { "VALUE", 272 }, + { "VARIABLE", 272 }, + { "VALUE", 273 }, + { "FUNCTION", 274 }, { NULL, 0 } }; yysymbol = symbol; @@ -390,6 +444,7 @@ void YYPARSENAME::yytables() "statement: IF OPEN_PAR expression CLOSE_PAR statement", "statement: IF OPEN_PAR expression CLOSE_PAR statement ELSE statement", "statement: BEGIN_CS statement_list END_CS", + "statement: function END_STMT", "assign_expression: variable ASSIGN value", "expression: OPEN_PAR expression CLOSE_PAR", "expression: equal_expression", @@ -399,7 +454,10 @@ void YYPARSENAME::yytables() "variable: VARIABLE", "value: VALUE", "value: VARIABLE", - "value: value PLUS value" + "value: value PLUS value", + "value: function", + "$$1:", + "function: FUNCTION OPEN_PAR $$1 CLOSE_PAR" }; yyrule = rule; #endif @@ -417,155 +475,179 @@ void YYPARSENAME::yytables() { 3, 5, 8 }, { 3, 7, 9 }, { 3, 3, 10 }, - { 4, 3, 11 }, - { 5, 3, 12 }, - { 5, 1, 13 }, + { 3, 2, 11 }, + { 4, 3, 12 }, + { 5, 3, 13 }, { 5, 1, 14 }, - { 6, 3, 15 }, - { 7, 3, 16 }, - { 8, 1, 17 }, - { 9, 1, 18 }, + { 5, 1, 15 }, + { 6, 3, 16 }, + { 7, 3, 17 }, + { 8, 1, 18 }, { 9, 1, 19 }, - { 9, 3, 20 } + { 9, 1, 20 }, + { 9, 3, 21 }, + { 9, 1, 22 }, + { 11, 0, 23 }, + { 10, 4, 24 } }; yyreduction = reduction; static const yytokenaction_t YYNEARFAR YYBASED_CODE tokenaction[] = { - { 42, YYAT_SHIFT, 3 }, - { 42, YYAT_SHIFT, 4 }, - { 27, YYAT_SHIFT, 34 }, - { 42, YYAT_SHIFT, 5 }, - { 42, YYAT_SHIFT, 6 }, - { 27, YYAT_SHIFT, 35 }, - { 40, YYAT_SHIFT, 34 }, + { 49, YYAT_SHIFT, 3 }, + { 49, YYAT_SHIFT, 4 }, + { 32, YYAT_SHIFT, 40 }, + { 49, YYAT_SHIFT, 5 }, + { 49, YYAT_SHIFT, 6 }, + { 32, YYAT_SHIFT, 41 }, + { 47, YYAT_SHIFT, 40 }, { 2, YYAT_SHIFT, 3 }, { 2, YYAT_SHIFT, 4 }, - { 42, YYAT_SHIFT, 7 }, + { 49, YYAT_SHIFT, 7 }, { 2, YYAT_SHIFT, 5 }, { 2, YYAT_SHIFT, 6 }, - { 42, YYAT_SHIFT, 8 }, - { 39, YYAT_SHIFT, 34 }, - { 42, YYAT_SHIFT, 9 }, - { 38, YYAT_SHIFT, 34 }, + { 49, YYAT_SHIFT, 8 }, + { 30, YYAT_SHIFT, 38 }, + { 30, YYAT_SHIFT, 39 }, + { 49, YYAT_SHIFT, 9 }, { 2, YYAT_SHIFT, 7 }, - { 26, YYAT_SHIFT, 32 }, - { 26, YYAT_SHIFT, 33 }, + { 49, YYAT_SHIFT, 10 }, + { 30, YYAT_ERROR, 0 }, { 2, YYAT_SHIFT, 8 }, - { 37, YYAT_SHIFT, 42 }, + { 46, YYAT_SHIFT, 40 }, + { 45, YYAT_SHIFT, 40 }, { 2, YYAT_SHIFT, 9 }, - { 26, YYAT_ERROR, 0 }, - { 34, YYAT_SHIFT, 21 }, - { 34, YYAT_SHIFT, 22 }, - { 35, YYAT_SHIFT, 41 }, - { 30, YYAT_SHIFT, 36 }, - { 29, YYAT_SHIFT, 34 }, - { 23, YYAT_SHIFT, 31 }, - { 20, YYAT_SHIFT, 20 }, - { 17, YYAT_SHIFT, 28 }, - { 12, YYAT_SHIFT, 19 }, - { 11, YYAT_SHIFT, 18 }, - { 6, YYAT_SHIFT, 16 }, - { 5, YYAT_SHIFT, 15 }, - { 4, YYAT_SHIFT, 14 }, - { 3, YYAT_SHIFT, 13 }, + { 44, YYAT_SHIFT, 49 }, + { 2, YYAT_SHIFT, 10 }, + { 40, YYAT_SHIFT, 25 }, + { 40, YYAT_SHIFT, 26 }, + { 40, YYAT_SHIFT, 10 }, + { 41, YYAT_SHIFT, 48 }, + { 36, YYAT_SHIFT, 43 }, + { 35, YYAT_SHIFT, 40 }, + { 34, YYAT_SHIFT, 42 }, + { 27, YYAT_SHIFT, 37 }, + { 24, YYAT_SHIFT, 24 }, + { 19, YYAT_SHIFT, 33 }, + { 14, YYAT_SHIFT, 23 }, + { 13, YYAT_SHIFT, 22 }, + { 12, YYAT_SHIFT, 21 }, + { 10, YYAT_SHIFT, 20 }, + { 6, YYAT_SHIFT, 18 }, + { 5, YYAT_SHIFT, 17 }, + { 4, YYAT_SHIFT, 16 }, + { 3, YYAT_SHIFT, 15 }, { 1, YYAT_ACCEPT, 0 } }; yytokenaction = tokenaction; - yytokenaction_size = 38; + yytokenaction_size = 44; static const yystateaction_t YYNEARFAR YYBASED_CODE stateaction[] = { { 0, 0, YYAT_REDUCE, 3 }, - { 37, 1, YYAT_ERROR, 0 }, + { 43, 1, YYAT_ERROR, 0 }, { -250, 1, YYAT_REDUCE, 1 }, - { -230, 1, YYAT_DEFAULT, 35 }, - { -232, 1, YYAT_DEFAULT, 6 }, - { -232, 1, YYAT_DEFAULT, 35 }, - { -234, 1, YYAT_ERROR, 0 }, + { -224, 1, YYAT_DEFAULT, 41 }, + { -226, 1, YYAT_DEFAULT, 10 }, + { -226, 1, YYAT_DEFAULT, 41 }, + { -228, 1, YYAT_DEFAULT, 10 }, { 0, 0, YYAT_REDUCE, 4 }, { 0, 0, YYAT_REDUCE, 3 }, - { 0, 0, YYAT_REDUCE, 18 }, - { 0, 0, YYAT_REDUCE, 2 }, - { -234, 1, YYAT_DEFAULT, 35 }, - { -231, 1, YYAT_ERROR, 0 }, - { 0, 0, YYAT_REDUCE, 5 }, - { 0, 0, YYAT_DEFAULT, 20 }, - { 0, 0, YYAT_REDUCE, 6 }, - { 0, 0, YYAT_DEFAULT, 34 }, - { -240, 1, YYAT_DEFAULT, 42 }, - { 0, 0, YYAT_REDUCE, 8 }, - { 0, 0, YYAT_DEFAULT, 34 }, - { -238, 1, YYAT_DEFAULT, 34 }, - { 0, 0, YYAT_REDUCE, 20 }, { 0, 0, YYAT_REDUCE, 19 }, - { -240, 1, YYAT_DEFAULT, 30 }, - { 0, 0, YYAT_REDUCE, 14 }, + { -229, 1, YYAT_ERROR, 0 }, + { 0, 0, YYAT_REDUCE, 2 }, + { -229, 1, YYAT_DEFAULT, 41 }, + { -226, 1, YYAT_ERROR, 0 }, + { -231, 1, YYAT_DEFAULT, 41 }, + { 0, 0, YYAT_REDUCE, 5 }, + { 0, 0, YYAT_DEFAULT, 24 }, + { 0, 0, YYAT_REDUCE, 6 }, + { 0, 0, YYAT_DEFAULT, 40 }, + { -236, 1, YYAT_DEFAULT, 49 }, + { 0, 0, YYAT_REDUCE, 24 }, + { 0, 0, YYAT_REDUCE, 8 }, + { 0, 0, YYAT_DEFAULT, 40 }, + { 0, 0, YYAT_REDUCE, 12 }, + { -234, 1, YYAT_DEFAULT, 40 }, + { 0, 0, YYAT_REDUCE, 21 }, + { 0, 0, YYAT_REDUCE, 20 }, + { -236, 1, YYAT_DEFAULT, 36 }, { 0, 0, YYAT_REDUCE, 15 }, - { -246, 1, YYAT_DEFAULT, 27 }, - { -263, 1, YYAT_DEFAULT, 30 }, + { 0, 0, YYAT_REDUCE, 16 }, + { -250, 1, YYAT_DEFAULT, 32 }, + { 0, 0, YYAT_REDUCE, 23 }, + { -263, 1, YYAT_DEFAULT, 36 }, { 0, 0, YYAT_REDUCE, 11 }, - { -238, 1, YYAT_REDUCE, 12 }, - { -242, 1, YYAT_ERROR, 0 }, - { 0, 0, YYAT_DEFAULT, 42 }, - { 0, 0, YYAT_DEFAULT, 34 }, - { 0, 0, YYAT_DEFAULT, 34 }, - { -248, 1, YYAT_ERROR, 0 }, - { -241, 1, YYAT_ERROR, 0 }, - { 0, 0, YYAT_REDUCE, 13 }, - { -239, 1, YYAT_REDUCE, 9 }, - { -250, 1, YYAT_REDUCE, 16 }, - { -252, 1, YYAT_REDUCE, 17 }, - { -259, 1, YYAT_REDUCE, 21 }, + { -237, 1, YYAT_DEFAULT, 36 }, + { -235, 1, YYAT_REDUCE, 13 }, + { -239, 1, YYAT_ERROR, 0 }, + { 0, 0, YYAT_DEFAULT, 49 }, + { 0, 0, YYAT_DEFAULT, 40 }, + { 0, 0, YYAT_DEFAULT, 40 }, + { -247, 1, YYAT_ERROR, 0 }, + { -238, 1, YYAT_ERROR, 0 }, + { 0, 0, YYAT_REDUCE, 25 }, + { 0, 0, YYAT_REDUCE, 14 }, + { -236, 1, YYAT_REDUCE, 9 }, + { -244, 1, YYAT_REDUCE, 17 }, + { -245, 1, YYAT_REDUCE, 18 }, + { -259, 1, YYAT_REDUCE, 22 }, { 0, 0, YYAT_REDUCE, 7 }, - { -257, 1, YYAT_DEFAULT, 35 }, + { -257, 1, YYAT_DEFAULT, 41 }, { 0, 0, YYAT_REDUCE, 10 } }; yystateaction = stateaction; static const yynontermgoto_t YYNEARFAR YYBASED_CODE nontermgoto[] = { - { 20, 30 }, - { 20, 24 }, - { 20, 25 }, - { 34, 40 }, - { 20, 26 }, - { 42, 43 }, - { 42, 11 }, + { 49, 50 }, + { 49, 12 }, + { 24, 36 }, + { 24, 28 }, + { 24, 29 }, + { 49, 13 }, + { 24, 30 }, + { 49, 14 }, + { 40, 47 }, + { 40, 31 }, { 0, 1 }, { 0, 2 }, - { 33, 39 }, - { 42, 12 }, - { 32, 38 }, - { 31, 37 }, - { 19, 29 }, - { 17, 10 }, + { 39, 46 }, + { 38, 45 }, + { 37, 44 }, + { 22, 35 }, + { 20, 34 }, + { 19, 11 }, + { 18, 32 }, { 16, 27 }, - { 14, 23 }, - { 8, 17 } + { 8, 19 } }; yynontermgoto = nontermgoto; - yynontermgoto_size = 18; + yynontermgoto_size = 21; static const yystategoto_t YYNEARFAR YYBASED_CODE stategoto[] = { - { 6, -1 }, + { 9, -1 }, { 0, -1 }, - { 0, 17 }, + { 0, 19 }, { 0, -1 }, { 0, -1 }, { 0, -1 }, { 0, -1 }, { 0, -1 }, - { 15, -1 }, + { 18, -1 }, { 0, -1 }, { 0, -1 }, { 0, -1 }, { 0, -1 }, { 0, -1 }, - { 11, 20 }, { 0, -1 }, - { 6, -1 }, - { 11, 42 }, { 0, -1 }, - { 4, -1 }, - { -5, -1 }, + { 14, 24 }, + { 0, -1 }, + { 9, 40 }, + { 14, 49 }, + { 5, -1 }, + { 0, -1 }, + { 6, 40 }, + { 0, -1 }, + { -3, 40 }, { 0, -1 }, { 0, -1 }, { 0, -1 }, @@ -576,10 +658,12 @@ void YYPARSENAME::yytables() { 0, -1 }, { 0, -1 }, { 0, -1 }, - { 9, 42 }, - { 2, -1 }, { 0, -1 }, - { -6, -1 }, + { 0, -1 }, + { 11, 49 }, + { 4, 40 }, + { 3, 40 }, + { -1, -1 }, { 0, -1 }, { 0, -1 }, { 0, -1 }, @@ -587,7 +671,8 @@ void YYPARSENAME::yytables() { 0, -1 }, { 0, -1 }, { 0, -1 }, - { 2, -1 }, + { 0, -1 }, + { -3, -1 }, { 0, -1 } }; yystategoto = stategoto; diff --git a/Utils/Scripter/parser.h b/Utils/Scripter/parser.h index 20b9f36ca..e54ddf7bd 100644 --- a/Utils/Scripter/parser.h +++ b/Utils/Scripter/parser.h @@ -19,7 +19,7 @@ protected: #endif public: -#line 22 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 23 "C:\\spongebob\\Utils\\scripter\\parser.y" public: void setCurrentLexer(class mylexer *_lexer); @@ -33,8 +33,12 @@ private: class mylexer *m_currentLexer; class CTreeNode *m_baseNode; + // Ugh! (pkg) + class CTreeNode *m_functionArgs; + int m_functionNumber; -#line 38 "C:\\spongebob\\Utils\\scripter\\parser.h" + +#line 42 "C:\\spongebob\\Utils\\scripter\\parser.h" }; #ifndef YYPARSENAME @@ -43,13 +47,14 @@ private: #ifndef YYSTYPE union tagYYSTYPE { -#line 49 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 54 "C:\\spongebob\\Utils\\scripter\\parser.y" - int variableIdx; - signed short value; - class CTreeNode *treenode; + int variableIdx; + signed short value; + int functionNumber; + class CTreeNode *treenode; -#line 53 "C:\\spongebob\\Utils\\scripter\\parser.h" +#line 58 "C:\\spongebob\\Utils\\scripter\\parser.h" }; #define YYSTYPE union tagYYSTYPE @@ -69,6 +74,8 @@ union tagYYSTYPE { #define CLOSE_PAR 268 #define BEGIN_CS 269 #define END_CS 270 -#define VARIABLE 271 -#define VALUE 272 +#define COMMA 271 +#define VARIABLE 272 +#define VALUE 273 +#define FUNCTION 274 #endif diff --git a/Utils/Scripter/parser.v b/Utils/Scripter/parser.v index d1e9bc5c8..95f2ce3e3 100644 --- a/Utils/Scripter/parser.v +++ b/Utils/Scripter/parser.v @@ -13,22 +13,28 @@ 9 | IF OPEN_PAR expression CLOSE_PAR statement 10 | IF OPEN_PAR expression CLOSE_PAR statement ELSE statement 11 | BEGIN_CS statement_list END_CS + 12 | function END_STMT - 12 assign_expression : variable ASSIGN value + 13 assign_expression : variable ASSIGN value - 13 expression : OPEN_PAR expression CLOSE_PAR - 14 | equal_expression - 15 | notequal_expression + 14 expression : OPEN_PAR expression CLOSE_PAR + 15 | equal_expression + 16 | notequal_expression - 16 equal_expression : value EQUAL value + 17 equal_expression : value EQUAL value - 17 notequal_expression : value NOTEQUAL value + 18 notequal_expression : value NOTEQUAL value - 18 variable : VARIABLE + 19 variable : VARIABLE - 19 value : VALUE - 20 | VARIABLE - 21 | value PLUS value + 20 value : VALUE + 21 | VARIABLE + 22 | value PLUS value + 23 | function + + 24 $$1 : + + 25 function : FUNCTION OPEN_PAR $$1 CLOSE_PAR state 0 @@ -58,36 +64,38 @@ state 2 END_STMT shift 7 BEGIN_CS shift 8 VARIABLE shift 9 + FUNCTION shift 10 . reduce 1 - statement goto 10 - assign_expression goto 11 - variable goto 12 + statement goto 11 + assign_expression goto 12 + variable goto 13 + function goto 14 state 3 statement : STOP . END_STMT - END_STMT shift 13 + END_STMT shift 15 state 4 statement : IF . OPEN_PAR expression CLOSE_PAR statement statement : IF . OPEN_PAR expression CLOSE_PAR statement ELSE statement - OPEN_PAR shift 14 + OPEN_PAR shift 16 state 5 statement : PAUSE . END_STMT - END_STMT shift 15 + END_STMT shift 17 state 6 statement : PRINT . OPEN_PAR value CLOSE_PAR END_STMT - OPEN_PAR shift 16 + OPEN_PAR shift 18 state 7 @@ -102,69 +110,85 @@ state 8 . reduce 3 - statement_list goto 17 + statement_list goto 19 state 9 - variable : VARIABLE . (18) + variable : VARIABLE . (19) - . reduce 18 + . reduce 19 state 10 + function : FUNCTION . OPEN_PAR $$1 CLOSE_PAR + + OPEN_PAR shift 20 + + +state 11 statement_list : statement_list statement . (2) . reduce 2 -state 11 +state 12 statement : assign_expression . END_STMT - END_STMT shift 18 - - -state 12 - assign_expression : variable . ASSIGN value - - ASSIGN shift 19 + END_STMT shift 21 state 13 + assign_expression : variable . ASSIGN value + + ASSIGN shift 22 + + +state 14 + statement : function . END_STMT + + END_STMT shift 23 + + +state 15 statement : STOP END_STMT . (5) . reduce 5 -state 14 +state 16 statement : IF OPEN_PAR . expression CLOSE_PAR statement statement : IF OPEN_PAR . expression CLOSE_PAR statement ELSE statement - OPEN_PAR shift 20 - VARIABLE shift 21 - VALUE shift 22 + OPEN_PAR shift 24 + VARIABLE shift 25 + VALUE shift 26 + FUNCTION shift 10 - expression goto 23 - equal_expression goto 24 - notequal_expression goto 25 - value goto 26 + expression goto 27 + equal_expression goto 28 + notequal_expression goto 29 + value goto 30 + function goto 31 -state 15 +state 17 statement : PAUSE END_STMT . (6) . reduce 6 -state 16 +state 18 statement : PRINT OPEN_PAR . value CLOSE_PAR END_STMT - VARIABLE shift 21 - VALUE shift 22 + VARIABLE shift 25 + VALUE shift 26 + FUNCTION shift 10 - value goto 27 + value goto 32 + function goto 31 -state 17 +state 19 statement_list : statement_list . statement statement : BEGIN_CS statement_list . END_CS @@ -174,112 +198,145 @@ state 17 PRINT shift 6 END_STMT shift 7 BEGIN_CS shift 8 - END_CS shift 28 + END_CS shift 33 VARIABLE shift 9 + FUNCTION shift 10 - statement goto 10 - assign_expression goto 11 - variable goto 12 + statement goto 11 + assign_expression goto 12 + variable goto 13 + function goto 14 -state 18 +state 20 + function : FUNCTION OPEN_PAR . $$1 CLOSE_PAR + $$1 : . (24) + + . reduce 24 + + $$1 goto 34 + + +state 21 statement : assign_expression END_STMT . (8) . reduce 8 -state 19 +state 22 assign_expression : variable ASSIGN . value - VARIABLE shift 21 - VALUE shift 22 + VARIABLE shift 25 + VALUE shift 26 + FUNCTION shift 10 - value goto 29 + value goto 35 + function goto 31 -state 20 +state 23 + statement : function END_STMT . (12) + + . reduce 12 + + +state 24 expression : OPEN_PAR . expression CLOSE_PAR - OPEN_PAR shift 20 - VARIABLE shift 21 - VALUE shift 22 + OPEN_PAR shift 24 + VARIABLE shift 25 + VALUE shift 26 + FUNCTION shift 10 - expression goto 30 - equal_expression goto 24 - notequal_expression goto 25 - value goto 26 + expression goto 36 + equal_expression goto 28 + notequal_expression goto 29 + value goto 30 + function goto 31 -state 21 - value : VARIABLE . (20) +state 25 + value : VARIABLE . (21) + + . reduce 21 + + +state 26 + value : VALUE . (20) . reduce 20 -state 22 - value : VALUE . (19) - - . reduce 19 - - -state 23 +state 27 statement : IF OPEN_PAR expression . CLOSE_PAR statement statement : IF OPEN_PAR expression . CLOSE_PAR statement ELSE statement - CLOSE_PAR shift 31 + CLOSE_PAR shift 37 -state 24 - expression : equal_expression . (14) - - . reduce 14 - - -state 25 - expression : notequal_expression . (15) +state 28 + expression : equal_expression . (15) . reduce 15 -state 26 +state 29 + expression : notequal_expression . (16) + + . reduce 16 + + +state 30 equal_expression : value . EQUAL value notequal_expression : value . NOTEQUAL value value : value . PLUS value - EQUAL shift 32 - NOTEQUAL shift 33 - PLUS shift 34 + EQUAL shift 38 + NOTEQUAL shift 39 + PLUS shift 40 -state 27 +state 31 + value : function . (23) + + . reduce 23 + + +state 32 statement : PRINT OPEN_PAR value . CLOSE_PAR END_STMT value : value . PLUS value - PLUS shift 34 - CLOSE_PAR shift 35 + PLUS shift 40 + CLOSE_PAR shift 41 -state 28 +state 33 statement : BEGIN_CS statement_list END_CS . (11) . reduce 11 -state 29 - assign_expression : variable ASSIGN value . (12) +state 34 + function : FUNCTION OPEN_PAR $$1 . CLOSE_PAR + + CLOSE_PAR shift 42 + + +state 35 + assign_expression : variable ASSIGN value . (13) value : value . PLUS value - PLUS shift 34 - . reduce 12 + PLUS shift 40 + . reduce 13 -state 30 +state 36 expression : OPEN_PAR expression . CLOSE_PAR - CLOSE_PAR shift 36 + CLOSE_PAR shift 43 -state 31 +state 37 statement : IF OPEN_PAR expression CLOSE_PAR . statement statement : IF OPEN_PAR expression CLOSE_PAR . statement ELSE statement @@ -290,92 +347,106 @@ state 31 END_STMT shift 7 BEGIN_CS shift 8 VARIABLE shift 9 + FUNCTION shift 10 - statement goto 37 - assign_expression goto 11 - variable goto 12 - - -state 32 - equal_expression : value EQUAL . value - - VARIABLE shift 21 - VALUE shift 22 - - value goto 38 - - -state 33 - notequal_expression : value NOTEQUAL . value - - VARIABLE shift 21 - VALUE shift 22 - - value goto 39 - - -state 34 - value : value PLUS . value - - VARIABLE shift 21 - VALUE shift 22 - - value goto 40 - - -state 35 - statement : PRINT OPEN_PAR value CLOSE_PAR . END_STMT - - END_STMT shift 41 - - -state 36 - expression : OPEN_PAR expression CLOSE_PAR . (13) - - . reduce 13 - - -37: shift-reduce conflict (shift 42, reduce 9) on ELSE -state 37 - statement : IF OPEN_PAR expression CLOSE_PAR statement . (9) - statement : IF OPEN_PAR expression CLOSE_PAR statement . ELSE statement - - ELSE shift 42 - . reduce 9 + statement goto 44 + assign_expression goto 12 + variable goto 13 + function goto 14 state 38 - equal_expression : value EQUAL value . (16) - value : value . PLUS value + equal_expression : value EQUAL . value - PLUS shift 34 - . reduce 16 + VARIABLE shift 25 + VALUE shift 26 + FUNCTION shift 10 + + value goto 45 + function goto 31 state 39 - notequal_expression : value NOTEQUAL value . (17) - value : value . PLUS value + notequal_expression : value NOTEQUAL . value - PLUS shift 34 - . reduce 17 + VARIABLE shift 25 + VALUE shift 26 + FUNCTION shift 10 + + value goto 46 + function goto 31 -40: shift-reduce conflict (shift 34, reduce 21) on PLUS state 40 - value : value PLUS value . (21) - value : value . PLUS value + value : value PLUS . value - PLUS shift 34 - . reduce 21 + VARIABLE shift 25 + VALUE shift 26 + FUNCTION shift 10 + + value goto 47 + function goto 31 state 41 + statement : PRINT OPEN_PAR value CLOSE_PAR . END_STMT + + END_STMT shift 48 + + +state 42 + function : FUNCTION OPEN_PAR $$1 CLOSE_PAR . (25) + + . reduce 25 + + +state 43 + expression : OPEN_PAR expression CLOSE_PAR . (14) + + . reduce 14 + + +44: shift-reduce conflict (shift 49, reduce 9) on ELSE +state 44 + statement : IF OPEN_PAR expression CLOSE_PAR statement . (9) + statement : IF OPEN_PAR expression CLOSE_PAR statement . ELSE statement + + ELSE shift 49 + . reduce 9 + + +state 45 + equal_expression : value EQUAL value . (17) + value : value . PLUS value + + PLUS shift 40 + . reduce 17 + + +state 46 + notequal_expression : value NOTEQUAL value . (18) + value : value . PLUS value + + PLUS shift 40 + . reduce 18 + + +47: shift-reduce conflict (shift 40, reduce 22) on PLUS +state 47 + value : value PLUS value . (22) + value : value . PLUS value + + PLUS shift 40 + . reduce 22 + + +state 48 statement : PRINT OPEN_PAR value CLOSE_PAR END_STMT . (7) . reduce 7 -state 42 +state 49 statement : IF OPEN_PAR expression CLOSE_PAR statement ELSE . statement STOP shift 3 @@ -385,21 +456,23 @@ state 42 END_STMT shift 7 BEGIN_CS shift 8 VARIABLE shift 9 + FUNCTION shift 10 - statement goto 43 - assign_expression goto 11 - variable goto 12 + statement goto 50 + assign_expression goto 12 + variable goto 13 + function goto 14 -state 43 +state 50 statement : IF OPEN_PAR expression CLOSE_PAR statement ELSE statement . (10) . reduce 10 -State 37 contains 1 shift-reduce conflict -State 40 contains 1 shift-reduce conflict +State 44 contains 1 shift-reduce conflict +State 47 contains 1 shift-reduce conflict -18 tokens, 10 nonterminals -22 grammar rules, 44 states +19 tokens, 12 nonterminals +26 grammar rules, 51 states diff --git a/Utils/Scripter/parser.y b/Utils/Scripter/parser.y index a56339f81..95d327029 100644 --- a/Utils/Scripter/parser.y +++ b/Utils/Scripter/parser.y @@ -6,6 +6,7 @@ ParserWizard generated YACC file. Date: 07 December 2000 ****************************************************************************/ +#include "function.h" #include "lexer.h" #include "codegen.h" @@ -32,6 +33,10 @@ private: class mylexer *m_currentLexer; class CTreeNode *m_baseNode; + // Ugh! (pkg) + class CTreeNode *m_functionArgs; + int m_functionNumber; + } // constructor @@ -47,9 +52,10 @@ private: //} %union { - int variableIdx; - signed short value; - class CTreeNode *treenode; + int variableIdx; + signed short value; + int functionNumber; + class CTreeNode *treenode; } @@ -71,14 +77,18 @@ private: %token CLOSE_PAR %token BEGIN_CS %token END_CS -%token VARIABLE -%token VALUE +%token COMMA +%token VARIABLE +%token VALUE +%token FUNCTION + %type program statement_list statement %type assign_expression %type expression equal_expression notequal_expression %type variable %type value +%type function %% @@ -106,6 +116,7 @@ statement |IF OPEN_PAR expression CLOSE_PAR statement {$$=new CTreeNode(IF_STMT,$3,$5);} |IF OPEN_PAR expression CLOSE_PAR statement ELSE statement {$$=new CTreeNode(IFELSE_STMT,$3,$5,$7);} |BEGIN_CS statement_list END_CS {$$=new CTreeNode(STMT_LIST,$2);} + |function END_STMT {$$=new CTreeNode(STMT_LIST,$1,new CTreeNode(POP_STMT));} ; @@ -137,9 +148,16 @@ value :VALUE {$$=new CTreeNode(VALUE_EXPR,$1);} |VARIABLE {$$=new CTreeNode(VARIABLE_EXPR,$1);} // variable value |value PLUS value {$$=new CTreeNode(PLUS_EXPR,$1,$3);} + |function {$$=$1;} ; +function + :FUNCTION OPEN_PAR {if($1!=-1){m_functionNumber=$1;m_functionArgs=getFunctionArgs($1);}} + CLOSE_PAR {$$=new CTreeNode(STMT_LIST,m_functionArgs,new CTreeNode(FUNCTION_EXPR,m_functionNumber));} + ; + + %% diff --git a/Utils/Scripter/scripter.dsp b/Utils/Scripter/scripter.dsp index da5894317..cbdbfe3e5 100644 --- a/Utils/Scripter/scripter.dsp +++ b/Utils/Scripter/scripter.dsp @@ -132,6 +132,14 @@ SOURCE=.\codegen.h # End Source File # Begin Source File +SOURCE=.\function.cpp +# End Source File +# Begin Source File + +SOURCE=.\function.h +# End Source File +# Begin Source File + SOURCE=.\main.cpp # End Source File # Begin Source File diff --git a/data/Scripts/test.scr b/data/Scripts/test.scr index 6ba2803e4..62587eea4 100644 --- a/data/Scripts/test.scr +++ b/data/Scripts/test.scr @@ -1,37 +1,10 @@ -// Crappy test program -// Prints a number based upon another one ( eh? ) - -//#print something.. #include data/scripts/defs.scr - -// No switch statements here.. -if($tmp1==ONE) -{ - $tmp2=11; -} -else if($tmp1==TWO) -{ - $tmp2=22; -} -else if($tmp1==THREE) -{ - $tmp2=30+3; -} -else if($tmp1==FOUR) -{ - // Stop here! - stop; -} - -// Have a rest.. -pause; - -// Show result and stop -if($tmp2!=0) - print($tmp2); -else - print(5432); -stop; - +//$tmp1=11; +//$tmp2=22; +//$tmp3=_setCharacterExpression(1,2); +//$tmp3=_setCharacterExpression($tmp1,$tmp2); +print($tmp3); +$tmp3=_setText(123); +stop; \ No newline at end of file diff --git a/makefile.gaz b/makefile.gaz index 5e37edf82..90b233228 100644 --- a/makefile.gaz +++ b/makefile.gaz @@ -97,7 +97,8 @@ pad_src := pads paul_src := paul -script_src := script +script_src := script \ + function sound_src := sound \ spu \ diff --git a/source/script/function.cpp b/source/script/function.cpp index 27e3f4fa2..ff05abe99 100644 --- a/source/script/function.cpp +++ b/source/script/function.cpp @@ -39,7 +39,7 @@ typedef struct { - signed short (*m_func)(signed short *_args); + signed short (*m_func)(unsigned short *_args); int m_argCount; } FunctionDef; @@ -48,14 +48,20 @@ typedef struct Function Prototypes ------------------- */ +static signed short func_setCharacterExpression(unsigned short *_args); +static signed short func_setText(unsigned short *_args); + + /*---------------------------------------------------------------------- Vars ---- */ static FunctionDef s_functionDefs[]= { + { func_setCharacterExpression, 2 }, // character, expression + { func_setText, 1 }, // textId }; -static int s_numFunctionDefs=sizeof(s_functionDefs)/sizeof(FunctionDef); +static const int s_numFunctionDefs=sizeof(s_functionDefs)/sizeof(FunctionDef); /*---------------------------------------------------------------------- @@ -64,6 +70,42 @@ static int s_numFunctionDefs=sizeof(s_functionDefs)/sizeof(FunctionDef); Params: Returns: ---------------------------------------------------------------------- */ +signed short callFunction(int _functionNumber,int _argCount,unsigned short *_args) +{ + FunctionDef *fd; + + ASSERT(_functionNumberm_argCount); + return fd->m_func(_args); +} + + + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +static signed short func_setCharacterExpression(unsigned short *_args) +{ + return _args[0]; +} + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +static signed short func_setText(unsigned short *_args) +{ + return _args[0]; +} + /*=========================================================================== end */ diff --git a/source/script/function.h b/source/script/function.h index 700fb2375..e6c6bdc76 100644 --- a/source/script/function.h +++ b/source/script/function.h @@ -37,6 +37,9 @@ Functions --------- */ +signed short callFunction(int _functionNumber,int _argCount,unsigned short *_args); + + /*---------------------------------------------------------------------- */ #endif /* __SCRIPT_FUNCTION_H__ */ diff --git a/source/script/script.cpp b/source/script/script.cpp index 28291d0d2..f288493e2 100644 --- a/source/script/script.cpp +++ b/source/script/script.cpp @@ -18,6 +18,10 @@ #include "script\script.h" +#ifndef __SCRIPT_FUNCTION_H__ +#include "script\function.h" +#endif + #ifndef __SYSTEM_DBG_H__ #include "system\dbg.h" #endif @@ -59,6 +63,10 @@ signed short CScript::s_globalVars[NUM_GLOBAL_VARS]= }; +// Buffer for passing arguments to functions +unsigned short CScript::s_argBuffer[MAX_FUNCTION_ARGS]; + + /*---------------------------------------------------------------------- Function: Purpose: @@ -149,6 +157,7 @@ void CScript::executeNextInstruction() { unsigned short instruction; signed short val1,val2,val3; + int i; #ifdef FULL_CODE_OUTPUT PAUL_DBGMSG("pc:0x%04d sp:%03d",m_pc*2,m_sp); @@ -199,7 +208,14 @@ PAUL_DBGMSG("pc:0x%04d sp:%03d",m_pc*2,m_sp); push(val2); break; - case OP_JMP: // jump + case OP_POP: // value + val1=pop(); +#ifdef FULL_CODE_OUTPUT + PAUL_DBGMSG("POP %d",val1); +#endif + break; + + case OP_JMP: // jump val1=pop(); #ifdef FULL_CODE_OUTPUT PAUL_DBGMSG("JMP %d",val1); @@ -207,7 +223,7 @@ PAUL_DBGMSG("pc:0x%04d sp:%03d",m_pc*2,m_sp); jump(val1); break; - case OP_JMPF: // jump, value + case OP_JMPF: // jump, value val1=pop(); val2=pop(); #ifdef FULL_CODE_OUTPUT @@ -216,7 +232,7 @@ PAUL_DBGMSG("pc:0x%04d sp:%03d",m_pc*2,m_sp); if(val2==0)jump(val1); break; - case OP_JMPT: // jump, value + case OP_JMPT: // jump, value val1=pop(); val2=pop(); #ifdef FULL_CODE_OUTPUT @@ -225,7 +241,7 @@ PAUL_DBGMSG("pc:0x%04d sp:%03d",m_pc*2,m_sp); if(val2!=0)jump(val1); break; - case OP_IS_EQUAL_VALUE: // value, value pushes result ( 0 or 1 ) to stack + case OP_IS_EQUAL_VALUE: // value, value pushes result ( 0 or 1 ) to stack val1=pop(); val2=pop(); #ifdef FULL_CODE_OUTPUT @@ -234,7 +250,7 @@ PAUL_DBGMSG("pc:0x%04d sp:%03d",m_pc*2,m_sp); push(val1==val2); break; - case OP_IS_NOTEQUAL_VALUE: // value, value pushes result ( 0 or 1 ) to stack + case OP_IS_NOTEQUAL_VALUE: // value, value pushes result ( 0 or 1 ) to stack val1=pop(); val2=pop(); #ifdef FULL_CODE_OUTPUT @@ -243,7 +259,7 @@ PAUL_DBGMSG("pc:0x%04d sp:%03d",m_pc*2,m_sp); push(val1!=val2); break; - case OP_ASSIGN: // varidx, value + case OP_ASSIGN: // varidx, value val1=pop(); val2=pop(); #ifdef FULL_CODE_OUTPUT @@ -252,7 +268,7 @@ PAUL_DBGMSG("pc:0x%04d sp:%03d",m_pc*2,m_sp); setVar(val1,val2); break; - case OP_ADD: // value, value pushes result to stack + case OP_ADD: // value, value pushes result to stack val1=pop(); val2=pop(); #ifdef FULL_CODE_OUTPUT @@ -261,11 +277,29 @@ PAUL_DBGMSG("pc:0x%04d sp:%03d",m_pc*2,m_sp); push(val1+val2); break; - case OP_PRINT: // value + case OP_PRINT: // value val1=pop(); PAUL_DBGMSG("PRINT %d",val1); break; + case OP_CALL_FUNCTION: // functionnumber, argcount args pushes return value to stack + val1=readNextInstruction(); + val2=readNextInstruction(); +#ifdef FULL_CODE_OUTPUT + PAUL_DBGMSG("CALL_FUNCTION %d ( %d args )",val1,val2); +#endif + ASSERT(val2$1qN0st|LG1R0f`$k6$|pSAbEnCJ8QobUIq-|Gjjb$iyc zp7pF}J?mMQz4o5hTLNCM3v8^L@&5DYBkk{RD|I{dM_WrDL3&w7U1=-Au8xOF8(6-* z^fd+V5X;|E`VhkMmCH<2c4u_>&QA3hdwO;@r~GwtfxJIIgyT8{j%$&DEpLi`{CIw! zn9NU6t@h&L#GQPErp}9N2nIr@z(t5n!o(rQHOS(3Mvoje*}QzC8CjKYfe7Jrh~M*( z=?^E$=$u{&5xD>K9H*aLwZyyxfJIZ`>AX0O@O5Io5S4^l86hJ=k3T(loV<4Vsymi( zTzDulz!axLSb2Ddura`ruHv|^p-J!#Wy1Td0A6wmyi$n`sD}5HAG|H`@D`1ScXTqmpR?dyrVQI|n;^Nag+wML9bV)lc%Km|#^C#e_b?AH zb_zT$1D>52Opk!Kh01OQ<-)F8h{Iu2()za>%V zs1aX4JV)0o=W}?`ILwD{6BiDfJVJHFprtSYK;-s&v za)rp*NjWjdImT1}jHQ@Bu@MyWqF4~cR21{37^N z!m(frFuL!Qv&*E{x5zE3=v#rzp_F%%N6`+?qQfY+pgXlYxjT`BQ~SHi)jckyrM{&` z7xa37aZ)k2rS)&9yUdgcg)pVUlg@6Y3N)bkmOh29dkOAMxOd?`g*yk=4fiXY3(gmv7XmjLZaka;ZV8+PZVQ|ht{(2B z=b!jq>`}2MEG52^>1?~+Y(%@zp7z4kI)YX7w-+s{{8q`WT>UTcgRpdYSd84lvZCk>fMaebyG|@Z{b#?R{oMYkvx>Q{d=#kma+IDavk+1hAw@`*MbVF9BFaaxm_*@$)iq6D0Na)I`T8M?4nX9 zg{)2o#cYm7k2;l>5eNAjzbc8^jgg{;oq6tnHF^QcpiErB50UodA@4{;a{Fxiff>uiPH!W?0%H_PR` zS)G*N%wwvr5O=eFvOpWuWz~Y+K^f9f#(<>6$S_d2G$V+UJk<^ z#=t|MBCF{4y`V44hl6ZNWIjvlm~7Sp%|c4xW^|QIAFDkGhY|yNzn|zp?-|z*Qi3y9 zd)pm^B&8#5t3R(WO(A32K{1*Tt!M{%eVu->6V`vB^AjN)?>F+T>6Iba7N*Q zLYap%mo3CxrA)|^2LgeI$I%z)SI1O04{v}HBvkF@VZK}xIu9Nw!I^82Kg*q80?=EA zen0E06r=IwV|P$g`tAZ%Z8@zlMImEqH^pqbjdDR>dp*UBa=Z4S3<(iRau0z_M%it*=SD%%4};Ct5ww1dXXRJkndG}=Xp0aYBW z@W6ULm=e%SwcSBTQu7bgs1Ai83K>HTVymAa6ZMp{g{&7PVDKJ9n1Z7|0+@{TWWr=qjFm74N87isGQf0%x@oEhFt2yhw8%tXAyf!NlJzA%B*XcJSZ_Bk02t2K4J0@C;@r++8u->J<&t*IH|~kLRlUZv(@X#{<(Wd zQGUQk9usAT92b#f%0EYD=--&YSqG&e14RQELzEa`$bvctY{gniz*hL#9fTweV+@^8 z7&<}v&p2`r$mYnDsX__^lO%y)EFQru0b%a$L6X^u*FXspTH$6WK`t7|7@`D?M%FDq zcFR2Y+Z_a#T9LNZw=o_p?JOemKp>kVQ6}Wc1A)LpxWdDEBpDAmG7sOF6`{n)MS~a* zl;F%`Wgb?c&Y;&J2#wuA8B!i&qQ#;}q6MMM1jTHQIGK_s69fViyD&wQAkHAkm^cbb z5X53P6A^Mz+Gkr|rNn?Br0)j=L2&8i?`i!}e_Y{#LYW7O*&I5VkS7lW0uMup2bE*@ zNhBE$sWJ~|)+vGrm5UB#JWyglJC-XvFm+w{y#*XWc?0YY!jk&BK)?Q&!Vrawq1_a- z?GBfzGKLg`LLdyvEm$kjplm~u4ax(kMwa}qAn7qE7Z4^a>M>wKu`RvQCPHN+{hvU! zX1dHNa`HHp#K7ll_Z$KnGVo~vs>`H_D20K5eA_(-k=sR_R(m_@54c$vLv$mgch)L0 z(I5jOW*G3SuTp|DZ?3jPNYAuj@EOjWAt1b+y%Jsv3jlu?nAhxF?#M> zxRtSbt_N=OI6e0i+!Z)Fq_FU!J}zTPvwYytuHR_vq8%7EZ;Osm44b!m>Nt*D_&wWs zwbyM$A_0!!Y_9B9aJB=qt4G0UL_(|JY-vD5>Jd-J?H9JJz~(4KY>Xcf8a%U@lkWId z*@EfO_(D0eBYs3!=R`dxUAdj<1KXle{*~oyXQi8<6#o3YN8uMJGeoSMFi}_|N2!uV zs^q{_6p4kTUj^~1|&+6m@%?D9I9eB zXlzBH-2tXuwA;PG#ANGk$PAEvx>8nf+SVqEbyKDU1qR)BuL{5l93JgXOBY|8GF%Y8 z5%@ z+TkvPB8-@iLaavImpnXjfFw~Yy_(|NUowjEjN)}pBGg;WnY!QiFiHBzew zMpryc6{GL1@DSmd>#yW8d8wuQ&al>f_XSZZQb`(jrR`t*iCce#+VdV6U5~!*|*?va7xMR7vP$lSdiFw$?v2$R`8 z9ywia&=4Eo5_4t0wDb$HHf4lmx(6DoO{3Ii`FybX-D_A@ppsSPk;SNj+!4T7z0?0g zrjs(I?eHRkrle%w)K{1+C ziewUiVeciAX)jevHz37Yt3|}C*H+WlT@1riJ}`7Hf5Ol~fzW5V(fz_Lb4eK zn`CVh8`DF57cP`#Lgp!jHEN{0QMwF+_+(+2FsWEl)c~V_Obsaaeu8`-2Ixu5BAs<7MeGFLu>pVr&4;>=v zCWQN|3X4%{TbbvX`LBk+J>bg&eHyn&2pDii!jH%+|RGg9HoW?3XY|OVe zv5v~473kWLrb>{L)+}H!vK3?BcR6iUeDvsKnOgTqQ!1gP45EAsqU}|Dr0N!sa&}em zGm=Nm#j}GqyCal(O`%lesq2_-5!Hq7G2w1$TZq91k#)~e+Bb*hey`25NT))@;3M9m zA#5Uz*9UT*NN5BVd%*EzD30{nA|j@tCU4sZ)}@C}dh}OfDf)Sg*qakKeJYlNP^~1g z(!utNsNGer&bcU^EMf2w1aDvzI{!(Mr*%mm2x2Oi%@K9!<0Xv0Im6UK&RgQ1+_=$; z<}(r543e^pvDQkQ8GS5CmH!mK%#9y$#g@FsET>2mw6gk^@j*|oY&?Wv&E{%Gvf+G?L>`7m z6Bt@bi@Hl;Ys#dhup^*Mr~lIW8{}Fl`fWw1OJ2N`smi5S84_%AzdZom!P#ce63V8f zc)KB_kBp?7Hwxu z4w7M=0n23y4e$Jdls;KnSbFw0`exgn|K^(m`n+YhTrAs0OCxc2Xcehq+qzUdJ4|zg$ z|6t|iVH6~1p{H#EtqP>G1DTmd>1RdBOZ#kvIBKAUS|82G+4AV5bpb(UsLG`A3P@Ww zOVk@i3qKmg#fGdX)`l`#A?>H=ppK9Vk1s}BX>n-E9nG^kMB zOUz_~0W?Zwl%7?R)TNIt5-X=o8qq@{cy^{D0wzqVps!G=U=&pls0fq^;l8=z)8it; z*H96Syg=e)TZ;|V`nIpbCW2MhtDs^hIm^ZV)zmMXH zQ$S&eSU7XI_~^{*r%_Nk++V@Zb}xzU^VX`@7c(&48UC98bY zn1W6EWU;d{#;1hhTa!iqCI1o{eiMILa*Aqudub{KuBGt+9-gpF!wXNPh?!NBh4m?- zsY)m8$`iL$O%UQz#22e{L#O3Y4`2f7wd;e8QbwNmUDeNmSF-rU@)+UEB#~dC6aL5% z$F3+7OiAMU6}s{F<|rjDvJxBQB*twe>vceNMkzW;e07CRS8z3MqDRsQq#W_`ilZd{ z7jKCcT9U=jZdomKB#X06MLwsgalt9#E|Wu8lp>B@nZ&OVD^{jhB2tPuhoRFbJ%{B5 zENWLAww5NH8@gM84kKuc8){LY{V-OhI5%{q0{s_36Wq{w3bccuiEe0~0=2wM;8Ztw zyaGNz&`dXUr~=(V&|Ek4kBKtF8wsj+L%&s^O9?vF4SipMmJoD?8~V~jZX|1SI>1|M z)pd|~kQM7e9PJz`5cgG&7xv|eZ&xP?B`IQm^`zVy+~0_Cq#(F&ot}#}>$$HG9)^1q z?rk`Kz857*7(GwB3_v)cHZ`=usB|{+#V?u#EXyL9ww|v5s%&egz!ePc;%ib zp($Ccy<@J7cRON8cB@%h!0qFM;l2TyuB zoG54p4UaVs3Uzr+j2O8lRHI4*UM@Vz7%mpB4HJxM;(|39LS>rRxMoh2iL&=m_JOef zOeWLk5aFCp6LZ%_2z_bd4Qn$5O}Z$qof8$Bj+_#BQq%DNR2r5ia0LyD`pwvI7)=Y) z#j)%1gjMO{QUuI2MGNM1v29(BJJpab#+V0EyVAw2=4n3rsGig5;s@s8ghy=)s0r1a zCvZdts$UYy+Lo9hPOHffre=tinqrxvRxDT_ERjShU`w?g8rnXFR{+&5dCx|MS1**RU{U@r=-pNH7@;{! z^t(GpIF=<&zuPdSaV&8NBPwh07LO#%+**$$lzQ1%@s+zD5#AajF0@P(9vUOoBUm*? z{F`Ni&vCF|x|k&<*2Vj9*@$OmAFizP<$X#hu{B#qOzsNbyN)Dmw9V>vn#Jc+1vz`TNDR z`oHpx;zhRTUxdCuy(L^i(f_ae^0 zu1a7Hry(r0UE6_z*m|FbK4F@Xp{5=W%m9s8xNW$0O)=FPYC1((^=JAC{R45;wvi*! z{h4&FE&kTN-1X`1%qV~H@onM4iEQzuZPA%)8Isx_a1!;EId)Th<0*<&mxJj?jX`Q0J3hIKdRB5oY9<`DUT=A4zGrZ$h}yd%S^{oFjnGl0sm z)tl9CFAXk}zGWLrjUt^Kw|MSX=pFH(cb5!vQ#<3!gn>gg+Gf4yEB4wWgl1ncaQpbH zo8c#yqh_cFn(-?u{pVi!N`{)IdQ|(*|A_f_1ykjL*`&aR4bkzKhx){qx8E#a3LNQ( zr75t`Q5k)x0Qz-zNHs0H%ca}c(gQn+o^CCT(*R(-;n+ZBa(1vXOLyEtsekSmO%%T0 zvE4uX5>w@Lljf4R<^B;9GD#EvawC%k?WQU&V)uZ@3k?2ucAA5gcpuVY+x_E&BDL6a z|0qjt6+KQVU^4_%B@@Ys0R*(Rs&ZP_Evhz|;;144mzcB!FPDbN$kvu%W0PDwk?C-# zvYV<=rL=VGJ!!T6E})qX)wcaapO&Dk3cEH_OKIHr6J&H$Y6B1ABaQh>%Y(~Mxk*xWPGVLMKMAwNr(o#Y8CzGbAidw5jnA(k)XV?4D^W#Rch` z0x^1TNZ@&(<7^l;=6FllqGnH&!0E+Fd%`nHSQ%CoCv7Sq{vwptQX4+)9%qUJiYdku zue?CqyeCfR%od;8GcJf5%;KeA^2IOq=tECJe4b@^>G6DV%0p4Y^S6q|hr&XLAza$F zX<4N9B4?f{ewjB`eDtBX8yaBEy(-i;Ek&9dDP>Uar_dfieonwH`0HVGC}q=9%9^(w zK91~~C?s8-q3ZU9lx^Cr1fbEmeU=#Yu)drSs#Pf;ZqxRV2}G8)CBi5@wUYG>a^Bt+ zKsmIPMW&-9SXU-B$how;O=;P80ogbt>bJHc>$a7LUwC*Le^r-s!Ss4|Nfym2N|*d4 zhq}ZfcL}UtFLg;V2mP{_hNIF@u+$6c!HCmQg4$RuxU`%ejckhm(VMNcIEI_(MmA|K zQ?DyMSj0?{y9Zluxc;|D(BYVdN9Yc;%n3td#|Js}LANua0Y%%T8G1^@W z*|fx?F-x<>RgX^7mdH7`dgSmL}#tMgS5z8MNYxxbUSxiXo z(*_@G`XYgB4`7`*-oP#9tp9J5lLT8kb&W!R69L_IO1DZD`p?%0RshLS@nyRbuhuQ?+N9 z&YKQ;G%Gn%-21pbiqtK~&}WV|wa7R}J#aqC5a;gG78I%WGp#JWXuVU#nS;PM4smc$ zY#(Y1?#^L4EYmn3(|E&!hJ|Q^O(!*WYkeRoH^fnK(N?DFhSpwm)3<9W!!{J4cD;(3 z+R}?Q8Jj)y$5XTrv1Q-JtJL@4kgL`AoY$cG(oUl(Q8%cM6HN(M{;XaR>Ehp-#=8~f z7mwndY2t;Z(p-5(XZqbE=k7F81h=Urf@w zpuRzA;_FXn1t5I#M7Dx(YH)Dy(le=I?EXaUE(S9NLLBZfS(PeQ?~e-q0YowCFtyt% znKi)pH%gPL#HRfT*=D)eD34-2DV{9T?C>5+|49d7C4CNzm-V8wA9}G!CN#l=(3TXj z^uP#V>nzc9Ai_djmcvk|%BZOxs1vWMlf?8MSvR%PsdO9|Y;B1#k{KIpk74m(d%BiV zT!m+bboC~bDFrL0lnIc9V0}YZE(IV^C2z$uCiCdpa*%RxZ5SRO82vV7o%0jgohzIO1TYrSL^P zXWHxfvtn0GA=!m{tOq{tdJGaYZM+6G>nc?0sL#9Co917GH}onzGTEPZ&&e|-UW3>* z`I@?6+f~=#wN4fTo*5xvx{G^e85;+-iXM7K+0#!_P{E*y`<{sp@)$gv^zTXH>1QHn z@cjFk#2}Ah!$}WK64RcYApDRmE_pUGsKZl|`bpxBXS0KvJz>8kh@U?1D;yHm9)3)_{9ZmH{=|`5Q?oO}=9GN9< zJ2cw2%?SJM(pIezn-ASDoX-{u|1y7(5i3!*4pE%On6f&%dTlzg$EdKPDTEEuUT!+$i8ptgXn8@ObI=pUv9dak)#Dr1Jdzz}X3u43(2Ay?%!*5E ztP(H1kQh|wS$=n{nDw_gK_#BB%vkZkzl{w|1?=kP^ReQ)e_J<2-jGF@=mx31w0X-p zdhlH){T)_~Eh-LnkG5AdZ~2rK?&suw$GiR6*uMvOESn>KJ zw@hTy6zL9ne*P8}sh}K%K(~96{$`BWePmRI$rJX{7|#JuYIK?kmnD{)W_aT593$ra zeXQ8~H*fLVzdtOzsu8!mxKY@Dhxo^fCgBCro z^i=KEYqsmEcA1)~G24s9cVCJq!#LZ21Vx(2Yn9ZoB*^_OL{XNQv1m$4@1yQ=u4ABVH=mzZYoIdNXWq^g4JasVf6Ih(f?A z_&8gDU*2>AzR@1ghM-J}DG{H3d5&;kmiXJtqeFtRiN=gJuye$LkU0L8NE}H`du5#F zgePrldpgS|TE*gmLgf$AT$(-4beK3LXOp-g4f2 z{9#Kk>gQ{)pi;wTY(z^Cm=Uyl_fQVRv#m6^AwWWc?G&e5<(;oN0UKwKw_&QqmO~=z zgrSwgcD`$|1f-|^X1dJd3hw^Wlo^jI6UT#zKO2W z(F}~n6NpQ2!ANYI<~8<%hUs2&TDyd~*5B1@U%dRwll{0C+uR|3^N)DGLkxH;DMqGS zgo5FR5`U1x30cwZjP+S= zBNw!_jv(0Zkmz@uh!7AQIuRdE2=>q|_994CfF?(~aeg>4n~u=3-;P0Wxbp2zKD?hP zzjxONsE=JsDO-iQiJN_R;Xic(9XM}#cQMbuC4T5h7=Xt!XI`6F(j9v&W-I8_OFk z(pDgD`LqIN?9)#tOgf27tXfJn)^mNBdc1L$k0v+V+S^T8@?r%`AzP^9WPv#ObeiQf zm7oiZ_D~1KVR~Sa`fEa~e|2f=V6%{AQ?ab>@yPiDITw{2h(WcR5eT3u0()ppJtb)Z zW9uNSg36jY&|U6T62%8{X)Y1JK5a3cKpB^I7b>f73EJU+B&>NFl1xpJsmhD;8j*+h zSaDI#`YQRHS!Y^^9J_;3uu|KBu%F6MN%4ixhEIq=HtxlJ#j;sWTd-p{rLnX)26U5L zZNnPzr_ZtseGsvup6jKP_#wy1df?KhTBu33*5a0uroH|&Dmo7&dPSJxbpCI5P^=7O z5tK{siFbUiwVZfmuyod-?Bx$6gqk|3A_o;HlOB~(O{ehe!cD~HF0SFsMUHwx960DP zogzh`4`?6*EipJcn# zFpMHtd;JH*0_oQG{fLhs&~z><2ua;s?GO86j)lMdX%A!;dlnn}*Q?lGR?tV)|FlP1do| zJh_@T>ANx4X!oLPXb(V>JF>|5bqBk&djQ^lXqFh%88e^oVs`r>um=PKhrP<6v1uvZ zo!JyhAiC#h+cwgs&{6>8-ck73mEpG%P zl2y^aR_GSG|7pk7ynuG^gD~TG2*SZ|k_pTE9v`lND}$?ovwbf{oJ$dcXNzU$h6|yy z#g*r(i+*67rXpxJ^b&jY`qxle^eg~?n8RT$4qr-px~Bm^tkDZz0zDH-0|0z!zrJa) zo>;{ZoHs@24{ENi39$$40-rV7lcrD&j5@Z`{WexXN(;63ONcwV2eUui1?mB~ydH7Z zHRz_i3EL1N+vuHCtMP^Z1E|N$K3spk$lJX@O*fr{A^E85uW<;m zy0n*umPvQ~h15IPW}vTTaJcZP?Ssm&#}s|D#Am;M(OtUGbQ+~sb!Vs1O1Z|@eIs|o zmfHS>ZU|F+I?nzO-D(eDr06&sq`v5moRUav*W6HjGtmME%=Ak?JjYl->oNTj3Uz;O zed25}t|v!8u)Jq+(0MArnVLYC3LpNcN5y-c0Y{(z5bxEGaL9%6!@UZjvgd&UQJx;$ z02g1F8noG)mA{wl>1yv{@xcrGeSwbE;t{XH!$m)i;FaW;UWH;+?+#xTWjb`KLh+B@ zmjZiX9&8nzcDgXtzh8Xgr#9hYf!Of#a-p~2@Q*(y@svVAsB94t?opxq!x8-y9@3kxUbCcGH}5U~3Ep1b-m29=egNEGjwdXTJ<*DQh!W38aN4oWACIdX!|BA0K6Z<6J!oxRQuI2qbmE`LyCF6Vw zxqH=xoB=KdZUx+Kz|O#Nh`)qzzq(MI?^->I7TUF&F?0tO+4PJ^-rIcT8eYU!)|y7z zhZ(x_t1CT=~(USD7(r* z8>XPwN;*{5b36{gBV=3ai>_|>J~V6hyL?3`o3G6nDgA(Q-5AGv);QC7UWZMWb0N>C zX8%jg%>|Lj%BFcfdQcv3>Hko@J0tQYIjI~U@cMFt8kp8;ztD0L_&?D=PlYpvz*tf z_!z3gqT-`8lo^3cYPs`S6+baK*KLzOFt?f))9Uk}4EP$;bx`kkvChT}NSIspk{2h{k*49wc>L$Ck1tkBRKUh5| z44&XNk)R&*<0BWUF`cpVe{=%mZ_@Krv%8K1)Hk}<&^@pKNBqgsmWWwmCiLFMtkoAqwaz+go*OO?Mqrsa%z_oT^f~1JOVx~HWHFG_^ znP!!6O$DdngHmVvbk<5k|9)z{(zobAYft8NO&)T0zB!aP3P+4i?Jzz+kdZJ*c(o@7 z-RE2~4E6zG<1l{8pYz@w#z#@!g<=M{=cGwHC5I;;-0_zMz-O<{BF!oL#`7`x9`oxA>>O7?`CBjH zs2E>njIwKX%h~f=y{(u0%yR*5?eoSAZ9Nxd53L6cA&yTYT3K;?Ow!;S*uvUTGfOt_ z@~q%pGjee9hDFAX&A9^)OsM!raeV3=D!y&%J1PyXD|oB{G;9sfF!cjfchZ00Zrl7; zRo&NrT*aD-SgVNVbE0MbLDbr*$CQzD6=hmoIA4h8!-<7|#`DL9U(*74G4ap@K9z9Z zpTJL}Fl-`!06lShBCofw{Z~Z~?H(zLLq%M?PzTjtf^l>2wJ^nFFUR&;y;twGdTFoK ztL(L81K)kBiEZ6zmwIta)((8*v<9c{1hax>R|65QxVR;|k#fAT7v80J)+O*-3!!X9 zZubqWq)7QJ8%jlByjYB4I4Bzc-$P(L4ZOG|^L`I7opa;fAyp3>jfdEB_1gfpYpE7| zfyo8Cz+T1PPk`<)d#N*Y5^w4^PFCldJKT z4o$+`C%eaWQ$LB zB@U}8demdhBcHAc`bw{FXJm+M#$-M!ZiP%%>7|PPpw|RzU!Hk-^__0orM+cR-Ad=( zllk%4PKJ%s%ZqeHvGij1eRLmkFQ}JGcdaAJ>UM8R(jQ%sVUc$4m@4O2llc)v?glPO zz#OQ8F)&Sq_Eh7LVcnV)mVRZ_B=*Af(B&a->_B8mxnS&MAq;UM>O>nTwb&qjrPq8eCz0s;<;lP~h zrmg8KK(gjB?4bJJ03`x7!-<}AO)9@KnU(Fe*7kDd$m%MSBsYX)tX`&c9HWeNUPTXP zrju)&nlwJffN~hgTH07kWzv;ZvaAgf3D}K^rW>TLqf{$nK?tfp$XJjV3#ZmNYts1g zu}Ym4z2(w`rAnRj>ONP4_e&+L4Nt6bexJriW2|e^d0k*HW;kN4J>oJiw3i;i%+$HY z`BWyq-j{fSV9sFepT$p#p~~o^S9F~hPYWn%ls-1GKEVKOXC`)i7VkCQ z$4-=$PB{~H^x_b>OuC1a#PN{PZ9iZz4L<{*y2yFXJlb<9aDvWzy`6SU^>;s zE8EW;qD+mcL5)Lw_UXNHDORRNMDPtlR>2q5Q`TUih(xdwUiu7t|UB?6l+l_A$C<_y7j|LNI4pZm<%dNOGFprO&?B2i9 z6QoUe&PD5Y`qBmNp1ZUXQ!Dx+f~&@#?b4Uz@u?A{G~2MluRC}7s`)(>>g0SOj~_i# zd5S#QbN~XwvB;H&Nq+8QkrtSPPp&!z!|=yLCLF)#C?(_*u71nJN3Aq6Yd+UuIB&#hdNYZUcWL_=U9#$wkKu&HfTQ$$8Bn(46?}Z~ z1oP3wtB?ll`vjol4i3r*HIuEi5jd-~YfUB27f^Q;igf)#Bbp)bLG|Y;fk$G5w6Vn5 zqi0LmkV4)L>-cyfKgJJ5ND&>&Pl&5O)H*v0`NZh?%oap8QD~H2BN}ZgtdBM5H`t{4 zCC;QGK2$RsCtccp5ZDh$SrH%N%L)+8d0P=5k1Cu+{1gQ3Mf^m5t@D>6{<^d|g#%Bu zJs-8NE@dZ@CS=p2_8ue~>);)N>nL^JUChVvbDU2X^RWotE#^nW025Eh=OW03ONC2- zBX9&xO(1#AF zfcyA<2>b4eT(W;A|2Lto#MwNHpUn=@=ur(jMDv-=PgGw|V%`16LTC1DKJM!L+h_An zT@BHdV47^6CE?_fFMZd$Gqeq!)iHwUhoFlOPhOZkx_8DH|k0=Ew6nZZ7QSpMy$ z{Pnb@c)Jv9FYJg$&*A^hHf3yI^N!AL=wVx~9@=uL*yP?Y{{-IM>mie!TY(c?xH)hO z;40xbk-rq;96Ohf^@2eV7yos*ZqmB3WbR?vRUgm5$$8B%aDmyb1aX@d24l-yJ~V+0 zQ2<)g9fw)cSm=J6AReX!^AurWSXB9qYC{T=aTt+yl|q(xqUug zR!AETzn#rRsM2tzp^=i^?{+`lwI1AqKU=^)4BvL|gi?75!kHD)Mu!-Q$5s~O8BM@1)lqs67wtaYxd;3tOYQ4!buHTr44 zTmvY*P{A(_Bo6A{#*21m8n$7(6L}p!E}g;N!36H+@KcXDbxWL!7Vxn{ky;M73T_?TrX|h?7Vt$;O3T~5sRi^W zOIMCT3csMNpeuEbT*$}yvQ{#w&0fei`%a}LJhk1ax*pFS5Kg$B9}`00GU;XPtgUT2 zIs-(;Vq^#)XT6@Um>>%^*uMMxC6|ljitetbINn``zin3lJ?>~|)R#Ji8~CvqgrL#M znGIVQIx8v{+P2+WVs!M>+W|7wx9&mVMK|!}7FO9i!7{F_QZglMi`*Qrl4aIcsrDsn zbL7aT4arIc4UERy1L%wc#;{cyVC&DdLz-PMVa`c6^5K4@u$9BOqG!dm(I$y3C}-M& z{xhAyR2jaAAH)08YR{XFW?+pCH}R_zpg6ys9@X;O=^6MsJ8s~h#qeDDy}bKZ9|Kf#aig&NF05#m=TwKy^$l&*0!wDTCPp!zUM)au+z!=Gkv%^0L_!ydTO^-NR zm+*0;*p38;hB20_>?fT>I#o+~9eb!JPtbKRFN0^IgA;VOy!0qp%8#YTEw0#w%%=lh zS8OHotC(+M{wn6LX1_8Q=GXRSvRpP*0c?Y4>zU}6gGz)=OZXjuN7lGZW22EuEQ@fvIur%@MVfuC18Z8Mzj zy2m0j(=&k?C7YoQ`CuA@u8lL#0WTlAbB?11FKg{_4_=N-MXZjkRL54ij;*$e7GUB7 zRxNCQ-zL4paOw!Bj^UKn*-B3+d|2!iCu|kxyH-P7O(dulcJ&Hd=^0s6^okRBnCs@@ z2ufj=0e43@^J3(rxpNMoPH$`NARukX77b~MR*60jh8yW z-T}^hBiM7gbM~StA8YMiPxkgoL-t*wB=~uk!e2_$lDw(_tw(mkTe9PNC0( z9w>KKzRat9OG>V|-aIA+6gzKwnGXwkcQz%%12KV&e&>qoaMI8K{x&;);6_^T?iJVd zZ`$!L66P z|HKuSm^5^(v*Q)s+tM!Q%%GfGk>g>j?Ckf1jM4#yVrReZW0W3LQrodqHA)RiYAZ`^ zQc{~)YL${Qv((K>Y86Wvm6WB5C5x2gB9=;3QuA4AoRTVGscQquOEcKz1iYQ>oHYFL#QZFhg4NDzVQYw~un5B-*puWp*zv80r?Oq7H z_auL~SvcSu#s|y4KuA`pfb@p`>b&r?f|LBU>=W$K03;w?=7qHL=?)>w63vBjQUB#X zBdBcL{3Oi-M1+~FYBe;Z5sZxILZoK2&>MmU>Cd-;(! zWK;|{ikryAbK#td8;dV>#c?rs&u$F>kV`2VvP7SF|^_z?IJ+z8H_)8T(SH}?OE zh=t>ZLKy#z3jyB$?zEhME4c#N=)(>B-~ZJNWdawsGg@njKpD?JqU8%me+dYODseZC z2I&9==7%uYBR>@JVgIEgdj6c?^!i9}@FC7~9|>X3gC7a2r*ygKrYHRg=&(?98OKd! zelGJj!}rC)oUF2d?wfu}h=oK+o>82Wp*#9{5q=M|sM!8k6A`9yLwi*eA07mkQ%&BVUKG0&bq3>nzuEk$~4B z)WNMo+)y&l0Ceus|A1e2(;$BD1J3oI2-1&yGioz0# zFT11WcC#)&Plr25o`1bR7qO&7AEO5`^KwiWKoPet4bI1}QH2vZRzA}s31uU;O3Th&{{Wx}c8I({tT4#91OTL>2e zr-AFgfVBnONw{Nh&2XD9I4^uE%(8evTm3l|G(-da@WLSShEM{T9|ZmI!cg*oKNOlx zDn~jV!u(M9UQj%O3VH&HNz@Lem8Y%Sirs29a%n4~zQ&PNm7IxykV3I9ys#DEqP>8A)Qfet>Z>kmQrK zMg26C=yz^o;7^1Rreb5@Pk`CtU{9$v;mp`YLn_op+QkotwCI;f{NRVOQ8Ww^qrplG z=U_AkyA#Mo9(Nq?1=>9L8{*=jYC0FMisvHX`&n2J&qYuIg*cuFPyzBoxKS=DMse6t zcQHUlusFe~T294;PQMzAcpMjsT&DHB3@4*RaQyKaZa8w~xR!qNl;cBL0g?d62QfdG zI92IbJdFGO3a^rL{kagpV{nt2=L5K*Zsz35WTNnW8GM*Kmmk6C1X3-$FQgE~^ za~2y5%XKj^NxI^ax$_K^0yFMEz_Tg7e#xqu<=HwniK97Zgw4D+OFA8Ag|M9o0nS5T z3aR2Dp^+l~PRmO6xz_2XGV>)dx%P>Fl_P#HAkE5SEt!1ga*wQ`*~8;ih|k=GTL zR50`FW&$Bu;^KJ(aK87IFplXSrHmyN3`%kOa|U+`F-+TMPGjl(PGO|@q!2T<7t_FO zI8S*6LWUml!cSjE4_U2?&eJ7=kqOSePNBrIZn=5B{EOEdhj_7R$=W5$%*)prHm+W~ zeBC<8lU2-B+Wkk;|48QXf(_(o;hc_ZhXRcT~Wn+-L$zC zbEfLX$F3W%pl}s)2&;I$VXAKa+}VaX$Q-_IJP^xuh2_&LN)2=7>td@2+nIMx*zer@ zF?6N#V+eTL;PKjG{G-*>M7vPAp9DR z@F@N4IXwm3c7zYW6|P&id@X6MZrYNgnjZyzh&P@HSI>41`&Gypwz8001V@ESsta** zt?+P@@R`bA=PlAtGIQ#{Vl4SaQGO-eg;oCC*_ngcb$`kZ1*(Zj_oDG3|vqR&k;N$XCJ=gu_7S zhW0|}YT-bOO+nP+5aKlvG^wRjUn2wKblc_H_YYYR&mpAriwFgvv?}S72x+GHR7ro0 zkgWd?O1keKg-7|5{G_2i!4vhIE_b_R(IK z`2eUb{WW&N26Z|gjPi<%JSh}&ZE($SCR{&T2Je^4n27LB zggS(q5C$W}EtIjG1`!&X{a~(fIj$#M|KXQs$;@Oxu%wApM#257IwQ z|1AB>^mFOorgx?Pkp5Hpuj#+1Ury&Uyfb_=0y2hXXfsA+jLwM8h|P%4n3OR-GbhuK zIXCm(%(pUUWv$P#x=Ls!n_oRzt?xngct?&aK-c{}qW^Ec*O^L+~z7W}0EL@h>{ zczj|(((I)BlEkDVNv%n_$%V;_llLY!CBL4Wo|2QYIb}=A*3_p{&!mQ?Wu&c0Ye;jX zZ9!Lkmi}PIBN;Pu=j86qYs!nxKb8Mk{&)G~3(5;l7JN{^RnlIB~3{;=ev?D z=O*q*{CncX#IU4ANlTJ?lg2=1RmqPgKau=$a(8laN_ootDZ5e*rF5mlrY5IVq&=VZ zNm@+$tn?exH>BT}{!aRejIT2+YN%d(_T+5haAnTzIj8fM=cg2WLw(aIOC>UKQR4ea zr;@%%QY9ObpHDuK{6TVQ%5{*=(<#j<$5KwFe4Fxp%5N$Er>8RyuBy7@_=AKJmSPY= z3K@wKDFqtOx#!$__H$zej7UogvJ^#vtU@ZFK!ZXbm8A?ujT#^#V5-3)!)Sz5qNETt z7ATZPniNpbP*D~`4G4uPQTq+d^shIW$-FtsclrG8dzp0Lw{XVC@QHi}|D0dpQ8+1F z5LSdAhGCQ+&5u?^FGp2TPZ5hhh#H|}zT78IC*=Z_RO{3>^}cGad*}>3Kyy7*Kcr{q z1v;sh>tg+)KB~{@Z*)7;)!b}|QRYE2-K;dvnYYbuQ()&?EVe9>xPq6VbOfD47t*sd z9n1VOxDa$=bqjv%;T-v%`hq z3*ok~y~q&##bA*q9urTC3h^g#N>CZe>CpN6@}TUmxZ0@xsQ#q>tUgc&RJ}T;{-wTB z=hbEPol4RD^27MbN{wb^L4n_N2~X&<()*f;EU803<@ z*Nt_Ly5;U&SL05)OyAE>^>h7;{ zcO~P=Z1Mzojcg-n^d|Z%I+bpsZ_#c+pI~$_Dflqx$|kXCY!-Wttzqx5UF-z=k|jIv zEWVnBVniihs9LLWi`x}it{KHJH#$ALT-|8$vW8}zn4xOQY|V? z-=%Z)B|XVZ!`{9&KZc~2*uUHJHqB|b*6ni#U7la;Yy3HXS3Ei%AJ@fA*Zg0TNL<9~ zdk{}j*sJU>Y(G2A&an&Zd)AJ3# z`Qe)I<#2TLU^F?J0iit}^$>l<06~Nk_lS{Vx>zip6with@rtMx{}3kxLF#hl)KZmv zR&~<7bcKFLpEj4x3j3^m$(Gw~cBkEk^&f#Ln_|QLrUwfSVWczY1qJ@^AToa0rra zLilL76#m{3z85xxpM^uC;nBosYP2jWj&?VworwZ;E}QL7WknM7qqBgXGGC$1T%RY*V7fmS+3-;G2hP1AGrLZrZ_`joz^JDM)$M$^Oe zG9!=xhs;sah!k&YyV*zW6ZR=vf~%{tyKr$$wznIAOOwvJ95>kIy5G2BT;3-4hWpH& za_8Jt*UoqJ$#isGKR?hDuYK%?_+R)5ekK|!(TuShr@4pKu_qz7%{)JRID9Rv3hTn7 z$oG^eBkBji)kbyEVUdD;-6?-BUyxG8YP_DL&m-w8p{H}UkH6DT_N~lai}x#GrEEPb z!x?WzG*={%NmZYSHD!X>YzHVE}@ot>wY@a>-3xYJ-uJw zYB<8^X_H)Ivh7`Vw4Dgu|JA3o_I^hNEoDycWSjpebi2$}-6fW6IjviI0w_9@z-JJ04n!}7<18|EN@ z7xQJjgjXi{etw7_=EwP2-pv2Q6Jf{j$00$j4g-!%1Wc^ZPwP@$reB9e_vnAN_nJV+1>1Ib^W6#*#c0UvmIIKLg&9yn8 zihMx!lS?Fdm88&g+LQL7l6rbK9ZpBn>GTo0nr^4>(nflkz8-w3E~u;OW__Ff3ChXp zA$qi)3>aIYp8_wH>CL)Q@6nCSu9({-w z(2cZ~eohm~Km-$l>A_t1u?RM7&oY?;d=$fg``A+cG;H@b-aULbYzf;(y`t=hgW>X` zDba5c%3GrkqK|>6SEJ4%Tih)sBJ1WM?KUIlS^%1TWeA4cDgP>u%PX>@x>5C18R}M* zt)!Z)cBmSabdbVL0LUJ`kI#k&?(q-!*}$kXzGHj`Kq^0eEZ!5JZVi^4HVKJf=|~2V zF^HAeY8%gg+?S4Z$1|x#!po9$87x*!W&13WVZ~5=}2L2j9hs*sD`Xvr? zK}oYg+sSZK5>)bEluZ!bi|E({K&XvAiJGIfqO)MA-icy00_31LEWW{xI>=HK&q?`j zq(*m@qeiQR>KRq0s?{gz3)NPqLE{5aL}QQ~Gmslgp`9`){(wHL&+4wwMU6?fJ?$NK zupMSc*eNzS%dWN`qNj2JUen!dH_sKiMTm+0?hDuCn%zZr#kIJEPxWbjq#uXV$@f!$ zWevXBU-m6N5vRtt#`glwmc=XMqPQ3?DUH|1W%1d#IldTQiCf}CUYkTc4zPgCCu?wO z(-6kR^hLUyZAilPpThJ1WpD7SfDjtW@F8^CP0=j~mv1n1{6t7G3K&@+_K4o{kZh7y zQM)Osz3QZL)vs{^Nwr#SSG(2ssy<2xMx0!4+)=V{zp)1yyGV=~n z^E{wD%MxpG0?B+k)2_4|Y_;8EKeE|qxgYZ@sah1lOV(m=i-Un3pb)9&;ZI*N{`OXxDXk``g#_4GJB zMbFco!OwzwlEKxWE$h#Qvk74QBkUAQ@Y{ir!})js$)Ax87kHbn2f%Dd`15coM6*9^ z3@?NoqVACvcZo_-Cq5RRi5{}IlyayXh3V-L`Gi~!og9Mdo8`^wc__WTUZr?rnDlNH@aI zj}vpQe|ou>988i=NHb|m({NBwNKG3&cE^{A_$rx*5jpK91+Jvqc|x} zV~lJT7sVBkD$`_VnJ#aVJ!J;UHB0uF6|zd!$i2X`Bj|+FIDsoNq0&@3yq~H1D+2H5 zs62I_8mAsm$$T|M%}@nuj+&%BqTs6?N z*6no%T%D_TiDvw#1S~ECv6Y2u9K;CYOft*z#S}3EqMd_4Din*v60pEZQ3M_+0Y$DC zWuhE0g^y2CS_c}8UR9X-a)P{IT<`#I#mpfFe&6bB_iS+F_S8dPIfE!TF^Sv9-P zKrrj`Frv=$i~KTQU zMy!w9B{EYI9Dh8J(mgo?msJExC;=y|$Ay(+yVp0Hz?begR#_eFMV8d*W_=MI)S?q6 z9X*t3uKn&cygP}gY`SLrL{3VgbudYgax) zI7S|Atn8*~W##QsTAG@nS!!unSy@?OSslWPif&}&Jnyy742*g|&-e2@e?6}UUu*wZ zd+oK?UVH7ef1Gp1*Bc^VZ;5DXD9?G}%q{ir?T_%oe?Ht3F%S92Pd7)DAdWx%Y{U{) zejvi^qpM`)FGkEoTzUH(8`XU%HQ}Mw(7{#31qROd*UClm;d~#CYY{lESw^c+?4M*_E zKmP8SVFXEeoW$BqB=_+Mo~1UY zj70D{NwhWz!91#VnwYi^LolD(SV{bp5Me}HJXI+r8aGwxB01)ea6eJ@UJ`g!CC{}@ zR&m^JYrhm;Z0H}t?-$qfADNhb+3P)4)(vfPuCk6}ociNZ&Q;MNtrXwuuNMBU6MyM% z8Ss~xO1qD77Ah_4o^{L3j-z9Z7o`nUo+dWLq-JRT_Ih1qp^jF*v87Jws_3>#OY1q# zaa0jlA-zs)zHS&*h?+5)<9ZmqyBLhrjFH%V4WoUqv#S`*TinBlLxmnjk&Mv>RjFMS zwR!*)>MHB>rZp~!GoxGGF6%_c5x!E&{mbhGLq`{17Yej=1o^fYP}_7Lm2y(lGPymJ z?4*)Ep`Cp^jZPP(1WNrxsUS*Spp=4ApHV89Ql~kX#lAk2e2b7FlsZVMP)fZ-slJrj zNvSYO{gYDRl-fusC8gFE{a)zPRX)*in72yBmsmesRb5VDUlf(zESFlP zvhI82PE>WxM`1J-mb7czbK5o4h%aq#29Yn;T>qiYFmXtwlyG- z^iXnK{H>O|p~i1#9#L>ZRA%lvz-+)BfO>!(-~@<(#{tg(UIZKfya{*@@G0OMzz={> z3`H7XC?Ern1rV+M7H!aJ#Ey7f=4obP$INwqK^lm9Y;>)fa8=#MN@pm~_)4ooKN778 z1+o<!XE!%Np=}IoS{FeiiWx zu=_;|{dOO9;6DM@H;C|Ru~w5RzMo{t7=W^?=ES~**EBfqPS&7hz_3D$f}@4E*p8z; zTMGi|Lq@N3tWfeR21dQEnnEN;gi4vDnMj%!iZ2YfA;h&FX&b3}*7HYk=H$5`Vuvf1|Ua1HEuI zPJyp*yhdSc)M^zRjLS_KZ<_n|bTd~YxT~Z}()!PxUT+Q4|Mf_@xb4cUFPE>-`Vf=o${H_K`|~&AXhDgah@^ia?`*Un z*&cR`#nc^_n=nrI8HDg|kkRX^>Ts2&xd>(VIz!u5z)Pb22!H#>Wl~HN&hZ*$xH?r0 z?{ZU8+RR#+h$OW_F>7TLrJS2iBJ{UX*5N8ob1{^&Ut0n-BDl-WSV;Cy!39k|YG35* zbBkONnn#BLJDX04=LVugSo)HQidkRh;dagRo#$vwQ<}iPg z`#@wzMXWbylXBE%kjqU;>7`%6qH!#e)F#EOO_p*t9z@>XCQQPb=3*$P(3UH=S#i)x z{rnAF(9b<^8*sAD#%8%5R!=mEjGeWqaJi{KDq(G!k)$>$W^HbwlylP_g#I>tx+N5J z`+6VrvyZ!M2h(kX+~#P1n>*!t!K_WnaCL)gE|YWzezC(ELajA|%S{E+5GFtok|Y4d zvH+BFZrX+LDgg)u0ZK@KAa~hjCICkQFcZD`7x0($!$CI*vYZtSOgEpR&`w4mJ054_ zR+&GDpd8Bd*nKSVf!#ByLns5g4|chUNZQo_85(s+lF$@0q1}{nx_2P-3+=NGLcuy* z(1^Vz)V--1bAnmOcyNY5VSa%&%XKlL5Qs8dU6DKySD{UkfeCaEWuV1w(rFE4AZj0% zn`%gZ{Y=tnktFFTX40{gv(df<2)}qfLn0KE^%IPwM&Wi_ARW^e^%K(Fd6&$dqOH zL3Z8F#x-(P_%p~rnVun=>yv?LXc}dpt`L`-h@|eHsNHO`f076Z-0XD>FOYA{ z2!%2G9FrAF*`)Cg*(2aAce)ci18nU@q7>Zj48Q1i5hZiQZxbc>UZ3W&N5gto%cPBJ zkTL@<>ml8GCDWO5^X_Or(*Z=8Af3C@Hzp0T?(g)GzMUtk1* z4q{1W9Gy+L0r(W#dxdlOfFICMu~vlR=Fn$w09z1Erjs>JVNf1ECpnWGxuOPf|xWj_b>o^#W%!`Nr{mb?9rS!SyY5t zrM>ILLd&3pCMK4%tkbcgldI36lLZP_t{3mLOct7|v7Hg6LssEz?i1g>eCcLN z(XM?)2c@uUzrO)pT6$I{Xjp~JPynM@Uj3<$W*tzr&wMm!nCtJOSxGz5=Fh~$Y8ex?Uft6>=l{F*O zb`t+pMsY;XaX2wsY?OPIb?d!ChB9H(ZILlsE@0=~#n)%qdMjFib5$s3MW5vh4y>|7ISk#@6wgl-Ro6*x>3a`hoFXXyTlgOBlM z^lzY8Ju)$gh%C~bvI6p2di30W6Ort09vLT;ht-8TR&<5eMYShkyyv^Bl=Gd|SY*nO zsX(SYu06umO{bXQ)l8FqvCA=HOQ*}G&rUSCq9tcklrm~{2$pA86%O^AzRMHW=fnwb zw2DvX46<);g+8jff=)ZDy4v0e!kPIk1f)YW?HaF;?hha!v`yI$GS?l6;-bC71LBHS4jO@#Z+y)u;eT8?%epauRuz& zNK^cEP=z(s$H&b0mH41mHR$Pp^0s&328hVVa_v`)<X`N^qQ+H`kBXn zDW1+#4Z1&|yzM!-x*q96rTL8Mw0FL^vTa}Aeg~R0@%&ZgwlJUk8v+X2iUN5nq^>VW z?!xl{B&=VdzPjTA3felzu6wn*i`BJn3Ls&1`}*o$I@c?3+YVN@+p#Q~s~hOIFRKEZ z>27IB0EhMjUkj{HGXhKI_O^{(ZnsoIg;nCBe3d;dfR4!!?vr7DfDG+1aI7xDVpE*Q z)Dbbg9Y;f5WnF9%PQ=t{y#f7WS2iu9%v`VrD+HhfFca_(fRKYLm|Qcr5zq?A&SMbF zEkI(owck))Y$+Tf4%Q76&APO7Hrs1>>@aA7xM?P}7`+c8(0hmXyH#}R%I)UQ$p6rq z!DfGFcwJ8WEv_;pg!T30>rc_!4)R@CZ6p=wnTFm0I;g{0-_p9kso?{-3&&B>qK^$ru*%){c@A_$5eMCfsbz^`tG-P9-ISENnd+RK#=MSg zDP`XAWo(o=G)>eLr(5aj!V0%iDMg|^Xc-q~H#kg$=IXA;<)TGeeU@Fq!HMVK!XSc* zq{o1BmUT!;Bzr~2`{%8;vBb4}n)q~amau#>d?YQNDWbY$aQ_II0~W4hQf=E>|<5V;~Y_J=N|`)(waE6IS@ZiW3wqrtnU>m3u& z^})D78z`O{8-ASvm*dbl+j~U2Ix$zgm7&H?Y25^dPbAN=hH+VUh6JKTi|%OQ_vOhz zJ)JdyiFIH9P~r0f;`FkNfytO2v@tJ}d~2Lzg~ZjN>yo5ABR*c1nfTm?G;jeMGRM&w zVD-fHj8){g0l80pKsv&Psau)_VkjHJ!0=JaDlLJ0XuvN8P01ltHC=2N_fLD;*R;{W zvilU1gRY>RJQU(EaP?Rlu{3p&RzI;2lTcre+AG-J?8p+vnXUvFB@s--EwGsv285mk~$|-1JS7KSQ^XK z#X>ljHMY{0L4}{NLdF8^x2?F zjlhndui@QQot08^z4%jkjcz$L^!g;mx;H^r?Lq!7ka~X_ z=i}N>JUzZ3e4}5*U)&(}yMCZBX`HCJenL=n#2E3#*JC`d_vM4{YQT1UML8xnJgIc= zV%8vhOqZ)4R$GkDEA07&5>}N!rWZQZ!FUtXze*StHl8M!=%mMz|VI(p`fY>c@0JI!Mu7DTx?Dw87>L zvHx%^v#!$<5{r6R@2_Jt0jziSU@)pyX~8Mxxq2qwjl^WQ2qxotm>7Dh_~py!!4MN$ z=r`!{DrWBiT_!j7-Wae;C3dAf?DjJ?2X=R74~EHfFYB11S0K;rGzvrhM=i^; zN%fUngt2xCv}{SY^c3nW(h*;2MVE6lCLZm}y69B2U!JS9a1o|lVU?cop;VSEQ9Ws( z@ZMsvWRgCG^}$N3^>#}3S_xTkNGVj7NCz?jwZbQ-3hKq;$jMn5L`u^OO`W)j3ClX9 zut@uTSsKt6ZW0?Nk4P+{?!R5`>poK@F;5r`=H#A-Z?KjmY$WR+Ogxp1O-RG8LMx?D z?iQz6H3>Tc3ODx@K6tnIgjE&WMC`X;$Joo~6T=DdxV0{47btBP5J=-jQ>n5o7@BV* z7eMWpGc2|al(KZWMLIlDyt8stPIM${l_QY8Gyk_*2^QNFl=^GUo+zHGygj6jYVC>? zO*fQ;pQdzZ6gcz|N8b=9K7PaZLUxS!z?4*>C`x>GN}ez=O8jz40U@`oP>I8aV#oN_={19v-WSpHDpya*zl*qjo<&ZI>b>AsQJ= z^lrvRYqa>`tf?U#l+NfUYN|&F+J54!>XE|Oe!Cy64h{~P-Va4h{dPY#FPIP6LYXuD zc0V&eR}s=mnS}mgYfV~68dg`^jQ(Qy9p4FOzY%}C;|#TSVu6+-?}AJqcW2$HziGtJ?@AL+ zX+*wOEwmfNA+=Uvx<*`5s~)z*;H%NeYTPDgG3lz=r~|9ENc}Y8Yqe_is4HpJ0a*)( z4C3FldrAGT+?^_H?k|3Ncdf9qzc^u0X-G45PU#Aen(h^AN$*IneS=BhWfEz z_^@`mcC#t{=wm+g4#GzJu`l|t>j@j{$3Eu6E+uS&AKU1|-b&bHKlUykb|PWbe(a6I zxg^$Sx^`Q+BD4V-k8)t?#}R&cinz6Im{2=VJW-b;q{WEcbt8)IFmrfVmxpNe?Pe~u z#>{<%csJm2zzIM&aK9tI7x5fG1)vb{V2wDheq)FZP1|Z?HY`~tRA!0Gmn;$nX~m8u z<3pBH!JZh=d{1h~K}vVVh_-v~4&h>v*2Rjg_dG64&JgWO2MMDx#3z=<3sZB&eM_Gd zUdjQ@!~jpp^zLe+U;Xxjw-RFAzDa_7u)T=7G+FPyl8E> z0#h3=?)76*g>~^_;>s~0yW-Krg?Mq!N;V6BT}iVr?S5lO2Nk3xi1Y6+OwlADJr{xW zZS?=32J!v-lZ4s?@yGki2Co98yQ~4zzm!o^+T|t4MSiQ=@zX)R$YQ;BB@<(fPn=p*B%G`M{&X(nQg=dYRCW zC|+2dCag&m!`2vurbO|&HD#k329tzvqOuj=9gu~ayEPySqrPFVcwo(A!Yirbbmwrv znJP9Snvp8L&pNUU1-j1WDDO|+i}iYe}C!ovf_rS9Rv?E}T9+*%CcXYO_U zD)F}Ur}#!O|G|Ir4~XABXh5iLDiY3Q?Y^byZay;l0$xf`BB;r-b$=s%@lXc8M(ne} zjPSY*HiXR^62fhetUc@o>j7Jm_~C|S;ax<})r_)TydX{&(}d=D@jg+lsl#@Luj}tH zQG%<#$zi&HihR9wn|8n$E}dR}!DcQ7H5Its$`~NNE5^@QO1;iNxnv5b&c@1_XcOys z+a&?cvHZJI&h5Sc%dtww7*(iCwG$O9-Hn9Bu0zJ!iUKJA6)uk67^kw1p;lvUX;jpB zuA9j378h(xO8hvBwc%(9cXSmkDexD*o+Uo9F+tdxB)+;aRoCCwUc?TxXLWC)_9~@r zJQu^lWJ_jDWf>$HM^_-y#4NG@rZoH3z&g*$<+$d-2Grl3jlN1MV&Bu9`+V$U1G-Zq z<7&eEGMva{;=5M`v-VvT(N^hOc6e0!v}5$EXOxehB7olj8RzG=T;_%=96BW}%oIB| zB@32JG4kPIS9asMzO3uijnJNMY?6^zjf!2y+BSaMJAQZkSIR0M<&*%*(LP-NK5Cw` zWq&K~fA|&wOJI^GotD7Sp6b-)DX_2mVruBLTq)gYWRf|{F1D*^o<@M`i02-vW8BQ@ z+`9QT%DuCBAaVF%^SW>wGy;Pxu+8{RT=__1Rw!BGzu4UyZW6k2CylK?&h8BVGP@yD zVmcx(9(`n}kQ*Xid}M&VdkkHhk5aMrT@hW#4v!$D{Y$O*qdk4pHH?6KR&cyo%R@C}~c zPdVcX$`2YpsQ;MMf?;Ims48*mwzzb5i-IxiB%8s3%_3cxDvw)PCr(v#EIoNrG;Zzc zOE>N{{I<~H;>B%g0;2v;E*4hbDXxC<`mAP5S4XP?*B2To1xq4aOscK*dom{5Xxh-7 zp|l|VW)^dviHY0;ay-I7bH?C(Nn-N$6ybD=Xxg4oxP{eWO>xp%Gf9%{>ne5NllGyu zr694@1=8JW7T0ah5So+3SGEt0vh)`5Qjl3}-)@dgzN!u{{kudg*^wd~S|C>Mh>szG z@YbYL#S(ZFST|mLeB2Q6Upq2xnhy6JR2Aw}QDR#)<;p_0Q|yYM&=@fn;SzWm$~je( zbC_lz#C6*?ipe<3743bYVy9{fA!s_z$P!0AWv(QG8b#g*YgGry=b^~al8lR)8tS_e zB`4NKPzjw~QRto+t+q;=G z81T-28kvhOV8fiNChgxa`uj({h4Tc6xZ*i=^720q= zv28{hjk<3HE7@7gKY}eFrxDbFQ1YTdG(9^+IA{}ZeRhaF#Kx@O z|3o+hr@TQRc11ADILtfc#EOet{ZzQaZDbU~OQW|_?22HvQlWIR1QnA>P;sxh1W_@| zGJ7#Hds!03D7Vk$v&7)%h79+OC{4;BYjmZgU=Mo98d|oJG0QZgdGR@uqns0RCtmjoFrHbv$Dl0l2_bRx$Cl;eyfip{TP+YW2qwclG;kM;JTy0+2h2oK2 z!~6#GTR`=W0`c;$iXwRnXZtgtWIf)U@Ab3fe4g3XVM^_S}-V; zHVazz**-6&6o~KrOC^BdyMGyc1ZjZ;ujY&SFKAR3n9bWFp$`9?tjiady^xad8kl0% zVJ&}THuDCU{}#zKPkix(Y{OBx+JJy+-P%Br>5YtcQTr+zgqMu}_b}NmD!O48yJSXL z0gN8fiZlP6C``!`m;O81PD5s7q#I>YZ2+n9iZ)42?~->5^$jZBNJcwa(k$f0dizsV z-P@l(=TKVFo(Y>iHX2)e7zL~5t0P~{bvurzE2TlzqPp2|g>gI#TMRUg8Z1;=R zel{Nl5WkfpX1p{al5EpYjAd@lOSeXC?zIC>O3D$>ykts{jSHU^)Q7PP)3#VxqokTG zX71M6bDlSIwu|jo8+M(Bbe9mY8TgF7WN$lu4e9tRNNJ!xYhPm9aSdJS6?EjXKWm?4 zvNc>o_~)o=+J z)R{nypBW)0y)rEF^iDIk6VL#t+9^(cB`%Q$fo(ZMy>)$YZ|;mB3@ln)|6+W<-XRj& zO>6~!`juIU@{ualu>udv`}-G3uWE)>9JKd_%mcSD^JYwOrLV%8?f5}W>%2wsva-bFE^_-Uo#}NuqV%lo`=udku)vG{M-u?CPE9aGUnx)g}@) zJaCxUc($pqB}3=P8;ks_MKm@guZmI8sNAE=h%E8^s{YHG%FU^fq_6-vY4h}BV2I5u^ zBgq3d5AVZ8xU314w(LNNbIU>y5Dc8_{D3BN6E*pWZN{R-R70&>E$`A z^rn2YahC0DALy!TUimelx8cBLKQy{%DLUdR+jB=tkb7eANvpIjg!-&(E5PNDt7^|% zV^#Zbb#&6=uGnX_*#dk0Yns@7=(?fIB+o}To~Sc9R-EPP3T+Lbx^j2bm?qx-`fbD6 z8b!8)k)N^>FLU^lQ0Tcp*1ruA|9X8u;l4oJi6K{;(OKeS)l}Lx2hwdDB385v5nG;U z5NlhW5Go?XeutL|d9|YJuuahS-TnLFNM5jEm-EIy<881lFu~fwj(2$08Ok1mWj*n5 z1ddoWUK{rl`m#4mw;II^$PI}zlL_9Ei@YW&Iw=-fLVN?_z{yH>B zMFdXO8ic-z(dqP7BUp)sqnTrgs{(c*HQfv30+2~d>fm=%@yJd(Nh2Atl{iG~KcHXiP(n>J0f1^kdL`_**GQREbGKFi{pmGj`kJZ zMt00ygzXV_}I#>B=ONxslvW2@wHPE^WQXcu4DUy(2k=`u}JA? z4GKDrZviz&*<+9l6gS~<$S!1?%m@}x;;2~sZU+CRc-y<_2;J`{rh&{oo{K`%4T4U< zMZg8XIlvjf$)n=i?~ae5=DfsJ11JJm-V}$vH*fk|g#Y7HG*yixc=?6;Qxyh;~juTLpSxQ^K3DG3DyuYnoC-&H1ly1q=+NG&bRNR z8uTulE7nbExE{Eq?)uo8-@U2^_$(AT6|AUz7)t&^NvE#_YEW!q3?gWS!1-C(NLgCH z*ft1jg>_pKhReUprgTp!ZIZ;VzqVU8qmEa#5sfvrM6Gv26Asfk(oB7+ZO_l8C~HEQ zv#}E|-Z);PkgHSMcA~`PrX0M~IuLB9I#g49@te4;IuyIzU0<^_JW0L8wuH@=U-HpV#=aR>k zhRQbjP8|j4iAB2k4s!enjV&u;ZLACKOx9)T!~Lue?QuT7{t5?Vyu;L_5wpKdw9|-S zUxR6s%=#PNqZW)*W7p640-2U`*+9sK9AEQ|AJi3Nz#T)TzY4l1b5S;e-9XN9UVx=W_-e{S<1ZG^e>*SLKTLjkunN$?^a?88_T9j! zGaa;m+djiQvK{Xz6~*teEoca*B;O;IOTp+8v~$xrps0xAo+2_=J1N`vYtsj}}Lm_nuP!q24}+LDrG%cJkXtkNs5Fa_KC)681+Ni6rxMp6ov@vGib0mAjhSm zbh~cb1w!FvC%UwwbbGo>B@vEpua(;=+1}q3agk8InisRg)jv!tu2zrX?)X5t@<=PX zps(s)B(w|d@3`<9UBt2ArJ%IZMJ+B~DlWE<1A;`OkKqJ*0F(~|}Fg^)Oa|RjM1U5G|Yey*KAj1Gsl)?QZ<3G}ymEEwCm3QYwD<+rKjq zV|VGQh_y@VgpD_Fs!Z!#)_`8!Rqth2aV#$66$ZNxrKN^0_OUqFP>u}p!ZmQiG+r~ zsF52kX8gw}Ae#4|Sy5W5z}dEeFIC?C;eQl-P&Op`?2pW#iHQ4j4U7AeO!fjupvtqo z=if11W1~*W^&fzQwib{-+_k+g$gx}8^QU=t>7R+bFZ;!xW^wMN^?ffScABG8Ni8s)#yNb=Gm| zwtBh)NN<2ZaNKw$x)r0MNEPQ@9wwY_*}eX9NbpTRnYp(C%AfHm0pLTx*MN~7X6`Ux zI?{6hlK^7?3js?2TyQWSEdL3?LBYX_S`a@AmT;4$MaQR zKCYB)v6W49AS-JxuBozhu|CwOr7s@#86O^$5tUQ%&=q{5{Co<-_&IqqK(ROl%m3j& zgXwlBy5O-HAwLlaLc9OrpxAzAjic#4km@$xLssW84OmMz_Nm^9r$bM2VYo2{OL za9)k`muGr7pRbJml?=Q_V^jQE>UkubFBYnv@O&E1SN*?gbheT=5bMX4{0NFqD*2C< zB&aL)Fx#_uUWnkcd8_C12!3P+D^R=*UqYK1?4A1KTLlu-<(B@!wxXiLCvi?BpBP1J z3iXa2yQt8?8zcENYQrAMrzoi~8HKFt&qeaXbCsCU{{1qguh=hN+(syNi6KAkwgTY^ ziQ?UO@auUvigyTSQ#=Er`4VX{SGPa^d0X#RTtMdnVcr%ylrE<)eakAKRK z26cLWerW<-ccR}r(LLW=J@tL@ZQgLt%l-NJe%8CJp0pS~JEP}rlla zP{tWihY;3I1^9zzIZgczvFAMcXHEsY)-)Q*w z_{Yd!HJW}v#jj>ICMwqJ4`R2GmV%DRj4@2Z4_o9)jw7*^jGIMzj=h$tbVX1dM;q2k zO1P@VhZX2fcbT8hkb#`QDy)5hAPQCYyEk@9BQ8#s4fZjcC4B#z7oyMa| z=8Gd4i!upc=NK`3p4rLp4~UzR`B7Jwol53YsO+a?ek|g>+JXG4ASP73%2jdN$Ofh! zS63LaQ))gVn;JC+S0k*y9$O~Fj>FM+oQSnvW15()si}Otj-hg^7jGb=Ws*{StWli?3;t;a z)Q%-06i14-pYTlr4X&qTI6qu~ZWj#ahhkL`hx2El;sx3Kdy4;8>({~@UPEij)*L>q zIADP-$02e7jQ{W@+#2Ht(o$T?O>*&+!@-VAVRe&%KHL?ICE9U5#TDBK9zrgkPrUTG zd|FQL8rZ`6QGdPc-sM#xxIU?O^@c~r;mxx?mmfpbKg{K|lc@UIv2QDscxxeG6QE?9 zfHh;^SG4E+7wOhcIjm^-`mZZQQ;=v?dAu=ImLE(Vt!6A4IahF|?S<#XJU)R$cqfnF z7k5n$TB)oF^};W(Z+W*9qCMVK;fXEelZ5Eu9!(+KkN*saCqw^-BjBf3905J{ zLOwID6T42XK3Li{0&AcArR25+S)N0Me1>(&YT8!9Na(_a$FZ{g?V3AnYTD!BL#Qsd zlHL)(Wc<>`wx8^^IP9jj(%H*IA-y8lS9*ONV?%5Ub$m)jADOLhl&ZR;4hfDfQ{8nn z_xgEPbXcWYo98|qKg>{g8`Z`|W+%OxSkc+On%;w40PdC29gA4mv0%#5AH6BV632os zjPZP>;}c8$9h{MkHIROk&lU^oslk26bj+P&!Of^jm~Hf2i(T;4hr3jSrOSd)pgjgX zpBa-acN;JJ;I%Sk6MoF_HqR10KRTSAYhhdCjM$vzIilzPA@CzTB?kWMaDF88@U;SW zOrtzs82HS+RYp3Bpg7LNS5jPK;&os?M+? ziG7snD-x)PPN@e#c6z7+G8;D z$pgt{91ETS|E)#~nCKPFj>EXXX?CgLDHfag5vaY*%-iflV=UVe{)yooht+sH2L$v+Vzc8&sI#isRki~+r9`vx zFv+N|XkMI%(zi+#(1&NuXnsKg(_Y<3SH(_t%-ZQcW_gsQvMaWh@}ucUIzoaiU3B{bl-hT`~B8?iOpXZ_1c=6zXvKHx0|J>+4#$4=@F}ydg z4)z%ECVj5|P5Mk59owV~1oXVoluUL<&oh#2uz%f4YFFUiyvr4Ps*X7~ z-$M)ZbCuPzvW!n3E*qWide}|BU1XI8-^5JMy@|3;nt}Mp-hHp<{WAFCB{ExhT=!Vv zP52;oD@=D&`0Dyub}^*1o$aK%d<(m5e)C4gjhNtP#aIJJWR#7rbp2#6_{q9l$~Q?` ztG{HUk2+e7%TyuzThDFd_~P3GwMQ=v__SBgzH29i!GiF$y>DaUxTwTJYGmg8|MV;# zc^#iV(tm!Xhe^xu$cy&x^!o{T=iIB3m|4-s`QG|)c1oXp9j{F$qgjh1e#7~{uUOw> zVNRYGuj2=f_dQS^Y3qc-@CNebM@d)y*QZUPRZ01Fqc;>@MeX2Bi~39Uz+R}l61_biY*OjJ*(AL&?;jB87mN|)_<5pAcSO51NVqZt7o)p&t2 zcsfQz<=LK#*R!o`%mm&A@A$+7esCD7kRiI~9T#iQsXVO{cui^=^96&pQEZV85s#zv ze!3Fl2A`Cc?a7(Q$0|pUhM3)8upJodL_Vf3t3WunnDp|04#w2@zHxnnPn z%Zv{A*5PKN+`GlfxA93j8u9uO*iEw+d`w=9`F(7Xc%Ha{&(to*jS9R;XeEA%0iPV% z)UZcaL^*1~9!|pq{5Sc1*e{C6HM?)%UlJ_Yp5`h11a^rQ2d?ZAEu@Mc9y*!Sy6LY; z9zzwMab@|!D*ov!G3u#UCL6Lm^QQ9aSqZ-5lzDll^24Jm{StWVU&NXAWHB*k` zo4t$VvWq5+=E?w*0Mh`~0M5fJ_!!TS8~OAgcm(mT{c-9Mi-*tx4cD&tC;_+V_5JDU zHTG08(oPjT#>yM{*lhAd5$H~P2A0)>NGwtz@ir3oz(r7LD3#K!M3(39jeK#Gy!_t< z_s$l7PvlK-j_A$MoA_LcZ@P&eG+xc@K;AXk#*s1LkqG-BsP1MghY$>}7!apzYxamV1xpWqh9T{j^y;HGT)pCLFaE9-)w5s*pB&GYpTcW& zeonzcCZ465db7BJk~Si$`g zeuCRkv}BdurEzC+1WHNMpgY^MteQ_(kwnyzv^mn-zh-+W6Z^Npop3Q4Rr!jBUFwHY#HlN-Pxp{yE zfW?4i(>xny^Q9@io*xUQ9?+kxT{#6U{D!(hN46*FRz9OI>m}3Lgj@OMz6zKIZlo}% ziaB`rfH-RoKRAZa`1ueVtsO_zbP0%pStt;|&M}9t%952D?b>wVlGjUm#c(%L8Xqkq zT)Q!Xo_DNi;zoFcx%`kqB2cR3!Zj-yIjbsHTDvY-Vtlv}P)CH!^{x9+dB$A6(#{%t zJ6fidO-km3bCF*HR@3Tujar|*$S5b4-IMEUU=8DOqKBMGzyx+kJz`zmI<(n#o!9Fb zF^^9OBZKAYLbgE@ljreqD)~$wTl2Rxvy0rE;#hF!7|*hKytRT&#+3i!0-_G#{))XP zLsk&57i^=~yy&^{id379JSb;diSe^#W35b>&kyFqX}cH9?ufHIWw-IQ*)W_x&JJk# z<7~OJ@dDn)L5~r7>s2yia_uyo*?SY7^SAN&A?09Z)j)8KQkIb?f8 z=Cf%Js0M4=cO45RBC_9h{OCEOqm5z@U2*`OXSI#b3L|=<9;;8X_|?ZM+!+u_+fbU? zCdMnOF`hCj)c(EUuQs+fOuU_6h8^3++xax?*j~MzpNyz)4SzqPbv5ky+N(7@KJ53j z*YNAheF_e|IK1ZR;Z+LWhi+UmBA&x{@EHThJbi1Mi$b*degVCkZmv0=>d~BeW%q<5j{QerZ=;24+||UJjlWp79M5c zaTcCr;b|70Vc}U8o?~Gv3oo#cj&?!|qL2u#i?>Z@Q9& zO_eJ=5+Q^hn#37m9%EB#Q4o$UC zH{S1X%Rg)^h5YNXxN&rbqIQVaE4GY|AN;$8O-HtyT$E(n3}({#EQZ4-Lt3`$viRrd z)PbcktM(+@1)|vAOHl-h!qP#Cd%#G%v9w(48jM$|-e^zuHECN;72;S0+zEC||9<{5 z{Z`z{qth{2@RLS2gC3v7joQ2QZoZ{*x7w%_Jk>{eMPJj@%icHkWn3!t+uF z>C4fNCR?N?Uv4_f-OqCS*7Tu{4?W>|=qO+A(Y(b6M-G!qbbq1Xo#T5^5XF-cBcoPV zf6VW#{#Z~b;#~>y{~82G!j%BnUv&`vBcKuCFzbQ;9$BrTX8d?EhQBUOM@IJ&Hz~|Mw8X z30y27l}qF@@FU7`oC2v3PR%87>A()*Qn(a5&_lVwK=tAJ{V)F|feA713mA;w6v{*# z4T$H0xiqjJ2KGwiBLMUl=8IVdL4V}?`Cy(j*vo(EEX+dK7waOOj|48x^VqjSIutyS72e8zBbsMv9*Utqd`^TvVxy)6{uE4I zlp=fOxB?b(K0^ybvpi(~+ROLYb2?YdXp&es*he44Vmv!c@=XP~DGq9;zYy*dui$yH zRT%YfZ&8xEVR^??U!NnbA}4k2Z5$1zz!+hdIgL01 z@o~hFJbqvPAQJT75$!=t|MQUlZ!7Yv02V+IAPt}ZT==q-+X1KpXaTKXlybWOO95j6 zYCzYyQtl*RGoS%b3zz{g1E`l?3?VfoaGtl?1cP0{1##gp;2@Z8FiIj=7>V%;;-WBK zK``-9;QKKP>(9a%gh4)2$^x$-jzawOI>Ny$9n8W$3^N3?knjSdq)@?1LkMF>bA;-{ zP@$MZeinUUbN*@}Fei>vvoMv>hhnaAs6%!80#ET^fQp52nB?%d%Pa zLRMs7-~{9ee~IA+h5GYYXIuB4{7JZn_uSJVWO^2K2;rXBzY|QJv|ogHN@aOwcL;GF z<1a$GTw3xy=$`*YP|DfIei2k2+xPHEM}H9#n9>*5&90kw=e&h=vliUGxX!?N8on1a zY>Yj-K*)2RnUatgG_k78bGIbK2xD&WEc#U#np`$%?5rE6R7^n+ILpMU8z`PMc}khJ zYV<@;^RGf$SlPrI$_P7toaf75g(Ukqc(HMSrfFubc`7^?;1co{#LO3h8K@px# zjD@G^H({b@X{WGdZ`1F>`}}w`OpRUbj<0mDX3jiErXyMc>cEvk?S1YKAv`R2Ki-Mm z@7d1>IqdJ5x&Hv@k1mxcj`_e$5qIW&Gj|?9_@a-@Tq%J5D1Qj)QvrFxU;5Zg5qA#p z*8rlU{Bxg}DdN^4-T)ZAc=5bNb+_NOP(5z;-h)CA-zOM1`8A_GM?!;){b!BlW&o)2 z#Ol#pW%cOY+k_K}aCNYlNCsYhsq~>#m8U5xND*JXe>CGvfxmodKzYMe<+Od-*;5{D zM=`bYf-gSki{JLeXMOQ^zPQsD3;6HJs9v-$9^{L&eX+q8m;2(WzId)LUWAzb;#uem z{PIu#tEYcKrw>r)p9&7KWSY6^EHg3@LE)#HFtkU2xS2|W`5<#CCHe*hHNQb5NK`XS zgivV#cl-wq95ZypXTQecREkdm5l4?Pb4L+3AwEd?v1aCg)$}5&?{CdFSecP-K)e)C z`_10BM+E(<5HberJ(L?17FwBshm`bf5KcXfe1^xZSDK7SVtiga#00-#8cPxQ_ z%?HhlzBO+QL$~Jb9c&D`Pw2aB;24g8^Yr^#h}nD46!bSA0Yjm`CYV>#$DX%Jf(8vr z#`jLK01mJZuOROP`2TAAcm#9MllEpjKP0EV3NiI=I^rW0xkiRRY6=5ARAB&s07#m%K+;D&jI!WjswmDE&zT4TmpnmMct`%RIB>` zZO8UPlj|bvb1{-rb05x4%1g;F&o>o}FPK!Yq+nUWeFgUyJW#N{<^7uXpS(+Xm-7T|A8nX6Qrlk} zr`?g?SYR)-uPb~6@}DdGqcBQmFnnrw5^NtXx}~_G_?_ZUiszIxlssRuyM!}i+JNC^ z&A6NcIUna_=01}9uiV#jGxJP&&*r_B_hDY9)}(c6U(^=oZ_eMI-HK1JX~0$8?BqA+oId1dtFzcH|m$`SL#<8p0OLw8Dfov#`(rIMz?Wg(T<`|iyk&T zW+L&?32uDuq}(le+wxMiXSAPczt;}SugpK0|9*aE!N`J{Xkw%B5#!dPr;500SE?Eg`X6T*SU2YbgB9q^lSA0)bG*1t#8%;N3S#tHs}oYNrt(G zWrlwmju|c)GK`~)c@V~EEHRETUT2(OoNTcoYa;N7$lzTq+yWGpUsd?3T zPvjlR^X3iK&eGnmeOvpU9eqm8ADTZF25|&x%P5!(lY65rE+g#n_ zx+it}b?v%beWm_E{YL#RSVOuY*H~qI!T7N;t?2rqn~Ux#T3z&Z(R|a_rqJTDVy*!m z6~bj|MrugF+jAD?oXwl3&CCBLe^9}Ug7*r~6nVMGxq3>%LWXLm2HOw;XHGE^}G87nR8iz2i`EuBQM9ip!Bk?} zW@<6%i>r%I6idZRO6(<%mb_GQq=ak2jsrr3XyP=#->@Kv1=MNO`1pS znol)9YJSrM=k&{o&(Y-Qb8gAGEoV*6LpiVHyq>clw?21V{^a~xOqkCKIGEALguP^o#KUMs%;@!mui;otc zEdHSQ^WyWx-xvQ>{9AECiMC`le%c2rx)}Xi`gin_{zv_< zdapj%(9aNWP#cCChGXj8YPijCx83l7VVz-vVYA^0!|(6}>Bh0f1;%>g!^S6!RYkX8 zq--#=WkqqOA*L*o#$+;$H&vQ$Gp#V)Z+g(Q(e$M0py@-?d6TACU#u-Ll{iWsEa6&k zcYt9D*Cc70HLq%?=4}aEI<*-8$WKx{ol8b^2TM zX5%E|RJ(DhX==&MWK5^AsYf&}XF|@3oCjb!kLIN2W2*sj9(eY6-_LfRWz??RZ&yX zp`v3&5vF;jRi-A>zfC7hADP-rznh|q)y3Jx*A-7Io>ROE^JaVTAH{zcCza%toG)oF z`K6@0glokjgieKOA~d-gy{1GnK~o85G+%SK=3ZFSmv+tfn!hw*IgvU2bK-K6awcQ; ze}D5yb^0F{wy1b%1bKcmz^1OTUnlN-v<-L&i zRo?e`Kj!^~nG~jt)+TF*YKLnzT7$L(Mmb44Q(L2TXpiYn>+grH?KD&yZ#O<|wC^*X zHhv1<9#oWEG!*7`wCHrvC#E3uYjpAIVzF3PQc}WoaNI`p;wH^(%`fordtgpK=B8*z zYv*V;>No4R=(j@2JK>a@vApclAJn(#kLr)>zkn=d8XBy|xbh?@>+D32EUh1Qn%w%`7O>8U6<+t#Kd?|GQIe$g8BWIG$OCj$0 z<|6ZPbGzAQ9x@|8nxp1qtI@j5UTiP3-?Goy3383hbY`P+Vq%)^&T+W&)x`*BG(GBS;SKX`%)go1{s?;OuakW7;f`0lY=x0EkP$TLOWq2vxH6Ec;W6$y$ zaKZDDBTMNqdX_d(bA+Pw8a%p>zNR7i9mBnlWw06SI>u0>A)CjFSP6TORl^gTStDy@ zJ6R{&%P!?bIN4?(NFOx8MW_9V-DjV%$B>O_GDBV|9jWC!Ss)k66>_C)lJCg(<)Az! zUvpyNJrc3G>bBCGfT`>V5s9} zighC>s?>Ve+GjYoel6<=2p9F z)D!AC)v8`qzv13q=GkDSd=Szquf~gbJAosAdFT7wza7c36Kv4qf9sF<@j+@JfnR_?xfk%T zj-G~eqR{((I!q_%VyL2fau?PZ=e!OX=*_mjuLiE>iyV9<~`QEk<*+1LABO4NB zx||`4ZC1M*jSQf4?eJGVJwPQ07r7Pw2m_eTI?hPny_S)dlHH`E76 zhEpoeo9bnwaqjRQ@M}9P{B%G%^&5p{8?VlxA11Z9UT&b zuXiz%k9jXY01P|IBZDZ|VSb9A1q>vJ6cHn{OfgI3h+Nc+Ldnb(1!93H7WaxWQ6Z|t zS_tVWQ71NwMzKvq#UY4kEePQz%h(k+@xY=&ZB$QUEi?M#V-#*=+1YjuTt>EOJGO7< zP0V+K5F$W?GP@juuCl8^xJeV~l_hf|A;I!wKEkC~mdbM2u?9o0lg+Y4M&%CKCfnsM ztX7?}OLilAdgXrEkDGA>%iN$GLedROV=#VV`7EXqDy1@br;@6u8cNzgbyN=kk2F#< zwZKd}XqV^^ouW&0iyqM{_KSXTP#h88i9s2d6t=DnNFTp8k7a)Fi#ayu_jm#9BB?(f@ol*O)?yO zzL7`O4zznWexesY(ys>9F%(hk^L1fE*cf(%oyeDNG-*FNz%jD^`(ib%$585#`Yo76 zJ958^dJr%Nk^4h5OrtbT28&%zDobNi*zRTD#0_1vwRTd{