diff --git a/.gitignore b/.gitignore index a0bc5604..adcc4f7b 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,6 @@ cmake_install.cmake *.vsxproj *.vsproj *.sln +.waf-* +.lock* +*.pyc diff --git a/CMakeLists.txt b/CMakeLists.txt index 64c48928..80c2c5d9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,7 +32,6 @@ project (HLSDK-XASH3D) #-------------- # USER DEFINES \ ################\ -option(64BIT "Allow 64 Bit builds" OFF) option(USE_VGUI "Enable VGUI1. UNDONE" OFF) option(USE_VGUI2 "Enable VGUI2. UNDONE" OFF) option(USE_VOICEMGR "Enable VOICE MANAGER." OFF) @@ -55,8 +54,8 @@ if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT 64BIT) if(MSVC) error("UNDONE: set 32 build flags") else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C_FLAGS}") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -m32") endif() set(CMAKE_SIZEOF_VOID_P 4) diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..60f4aad3 --- /dev/null +++ b/LICENSE @@ -0,0 +1,39 @@ +Half Life 1 SDK LICENSE +====================== + +Half Life 1 SDK Copyright(c) Valve Corp. + +THIS DOCUMENT DESCRIBES A CONTRACT BETWEEN YOU AND VALVE CORPORATION ("Valve"). +PLEASE READ IT BEFORE DOWNLOADING OR USING THE HALF LIFE 1 SDK ("SDK"). BY +DOWNLOADING AND/OR USING THE HALF LIFE 1 SDK YOU ACCEPT THIS LICENSE. IF YOU DO +NOT AGREE TO THE TERMS OF THIS LICENSE PLEASE DON'T DOWNLOAD OR USE THE SDK. + +You may, free of charge, download and use the SDK to develop a modified Valve +game running on the Half-Life 1 engine. You may distribute your modified Valve +game in source and object code form, but only for free. Terms of use for Valve +games are found in the Steam Subscriber Agreement located here: +http://store.steampowered.com/subscriber_agreement/ + +You may copy, modify, and distribute the SDK and any modifications you make to +the SDK in source and object code form, but only for free. Any distribution of +this SDK must include this LICENSE file. + +Any distribution of the SDK or a substantial portion of the SDK must include +the above copyright notice and the following: + + DISCLAIMER OF WARRANTIES. THE HALF LIFE 1 SDK AND ANY OTHER MATERIAL + DOWNLOADED BY LICENSEE IS PROVIDED "AS IS". VALVE AND ITS SUPPLIERS + DISCLAIM ALL WARRANTIES WITH RESPECT TO THE SDK, EITHER EXPRESS OR IMPLIED, + INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY, + NON-INFRINGEMENT, TITLE AND FITNESS FOR A PARTICULAR PURPOSE. + + LIMITATION OF LIABILITY. IN NO EVENT SHALL VALVE OR ITS SUPPLIERS BE LIABLE + FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES WHATSOEVER + (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, + BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY + LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE THE ENGINE AND/OR THE + SDK, EVEN IF VALVE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + +If you would like to use the SDK for a commercial purpose, please contact Valve +at sourceengine@valvesoftware.com. diff --git a/cl_dll/CMakeLists.txt b/cl_dll/CMakeLists.txt index 4827c0c0..031136d1 100644 --- a/cl_dll/CMakeLists.txt +++ b/cl_dll/CMakeLists.txt @@ -30,6 +30,7 @@ add_definitions(-DCLIENT_WEAPONS -DCLIENT_DLL -DCROWBAR_IDLE_ANIM) if(NOT MSVC) add_compile_options(-fno-exceptions) # GCC/Clang flag add_compile_options(-Wno-write-strings) # GCC/Clang flag + add_compile_options(-fvisibility=hidden) # GCC/Clang flag add_definitions(-D_LINUX -DLINUX) # It seems enough for all non-Win32 systems add_definitions(-Dstricmp=strcasecmp -Dstrnicmp=strncasecmp) if(NOT MINGW) diff --git a/cl_dll/MOTD.cpp b/cl_dll/MOTD.cpp index 179ae4a8..439fb9c4 100644 --- a/cl_dll/MOTD.cpp +++ b/cl_dll/MOTD.cpp @@ -56,7 +56,7 @@ void CHudMOTD::Reset( void ) m_bShow = 0; } -#define LINE_HEIGHT 13 +#define LINE_HEIGHT (gHUD.m_scrinfo.iCharHeight) #define ROW_GAP 13 #define ROW_RANGE_MIN 30 #define ROW_RANGE_MAX ( ScreenHeight - 100 ) diff --git a/cl_dll/cdll_int.cpp b/cl_dll/cdll_int.cpp index dc9199ba..45bbcd67 100644 --- a/cl_dll/cdll_int.cpp +++ b/cl_dll/cdll_int.cpp @@ -212,7 +212,9 @@ void TeamFortressViewport::paintBackground() // int wide, tall; // getParent()->getSize( wide, tall ); // setSize( wide, tall ); - gEngfuncs.VGui_ViewportPaintBackground(HUD_GetRect()); + int extents[4]; + getParent()->getAbsExtents(extents[0],extents[1],extents[2],extents[3]); + gEngfuncs.VGui_ViewportPaintBackground(extents); } void *TeamFortressViewport::operator new( size_t stAllocateBlock ) diff --git a/cl_dll/cl_dll.h b/cl_dll/cl_dll.h index 6e1c4e69..6ba3db67 100644 --- a/cl_dll/cl_dll.h +++ b/cl_dll/cl_dll.h @@ -38,7 +38,7 @@ typedef int ( *pfnUserMsgHook )( const char *pszName, int iSize, void *pbuf ); #include "../engine/cdll_int.h" #include "../dlls/cdll_dll.h" -#ifndef __MSC_VER +#if !defined(_WIN32) #define _cdecl #endif #include "exportdef.h" diff --git a/cl_dll/com_weapons.cpp b/cl_dll/com_weapons.cpp index 5621149b..198c533a 100644 --- a/cl_dll/com_weapons.cpp +++ b/cl_dll/com_weapons.cpp @@ -116,7 +116,7 @@ void HUD_PlaySound( const char *sound, float volume ) if( !g_runfuncs || !g_finalstate ) return; - gEngfuncs.pfnPlaySoundByNameAtLocation( sound, volume, (float *)&g_finalstate->playerstate.origin ); + gEngfuncs.pfnPlaySoundByNameAtLocation( sound, volume, g_finalstate->playerstate.origin ); } /* @@ -127,7 +127,7 @@ Directly queue up an event on the client ===================== */ void HUD_PlaybackEvent( int flags, const edict_t *pInvoker, unsigned short eventindex, float delay, - float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 ) + const float *origin, const float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 ) { vec3_t org; vec3_t ang; @@ -138,7 +138,7 @@ void HUD_PlaybackEvent( int flags, const edict_t *pInvoker, unsigned short event // Weapon prediction events are assumed to occur at the player's origin org = g_finalstate->playerstate.origin; ang = v_angles; - gEngfuncs.pfnPlaybackEvent( flags, pInvoker, eventindex, delay, (float *)&org, (float *)&ang, fparam1, fparam2, iparam1, iparam2, bparam1, bparam2 ); + gEngfuncs.pfnPlaybackEvent( flags, pInvoker, eventindex, delay, org, ang, fparam1, fparam2, iparam1, iparam2, bparam1, bparam2 ); } /* diff --git a/cl_dll/com_weapons.h b/cl_dll/com_weapons.h index efe06ad6..89fb3cfe 100644 --- a/cl_dll/com_weapons.h +++ b/cl_dll/com_weapons.h @@ -27,7 +27,7 @@ int UTIL_SharedRandomLong( unsigned int seed, int low, int high ); int HUD_GetWeaponAnim( void ); void HUD_SendWeaponAnim( int iAnim, int body, int force ); void HUD_PlaySound( const char *sound, float volume ); -void HUD_PlaybackEvent( int flags, const struct edict_s *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 ); +void HUD_PlaybackEvent( int flags, const struct edict_s *pInvoker, unsigned short eventindex, float delay, const float *origin, const float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 ); void HUD_SetMaxSpeed( const struct edict_s *ed, float speed ); int stub_PrecacheModel( const char* s ); int stub_PrecacheSound( const char* s ); diff --git a/cl_dll/compile.bat b/cl_dll/compile.bat index 9270d4bc..18b45459 100644 --- a/cl_dll/compile.bat +++ b/cl_dll/compile.bat @@ -8,68 +8,68 @@ echo -- Compiler is MSVC6 set XASH3DSRC=..\..\Xash3D_original set INCLUDES=-I../common -I../engine -I../pm_shared -I../game_shared -I../public -I../external -I../dlls -I../utils/false_vgui/include -set SOURCES=../dlls/crossbow.cpp^ - ../dlls/crowbar.cpp^ - ../dlls/egon.cpp^ - ../dlls/gauss.cpp^ - ../dlls/handgrenade.cpp^ - ../dlls/hornetgun.cpp^ - ../dlls/mp5.cpp^ - ../dlls/python.cpp^ - ../dlls/rpg.cpp^ - ../dlls/satchel.cpp^ - ../dlls/shotgun.cpp^ - ../dlls/squeakgrenade.cpp^ - ../dlls/tripmine.cpp^ - ../dlls/glock.cpp^ - ev_hldm.cpp^ - hl/hl_baseentity.cpp^ - hl/hl_events.cpp^ - hl/hl_objects.cpp^ - hl/hl_weapons.cpp^ - ammo.cpp^ - ammo_secondary.cpp^ - ammohistory.cpp^ - battery.cpp^ - cdll_int.cpp^ - com_weapons.cpp^ - death.cpp^ - demo.cpp^ - entity.cpp^ - ev_common.cpp^ - events.cpp^ - flashlight.cpp^ - GameStudioModelRenderer.cpp^ - geiger.cpp^ - health.cpp^ - hud.cpp^ - hud_msg.cpp^ - hud_redraw.cpp^ - hud_spectator.cpp^ - hud_update.cpp^ - in_camera.cpp^ - input.cpp^ - input_goldsource.cpp^ - input_mouse.cpp^ - input_xash3d.cpp^ - menu.cpp^ - message.cpp^ - overview.cpp^ - parsemsg.cpp^ - ../pm_shared/pm_debug.c^ - ../pm_shared/pm_math.c^ - ../pm_shared/pm_shared.c^ - saytext.cpp^ - status_icons.cpp^ - statusbar.cpp^ - studio_util.cpp^ - StudioModelRenderer.cpp^ - text_message.cpp^ - train.cpp^ - tri.cpp^ - util.cpp^ - view.cpp^ - scoreboard.cpp^ +set SOURCES=../dlls/crossbow.cpp ^ + ../dlls/crowbar.cpp ^ + ../dlls/egon.cpp ^ + ../dlls/gauss.cpp ^ + ../dlls/handgrenade.cpp ^ + ../dlls/hornetgun.cpp ^ + ../dlls/mp5.cpp ^ + ../dlls/python.cpp ^ + ../dlls/rpg.cpp ^ + ../dlls/satchel.cpp ^ + ../dlls/shotgun.cpp ^ + ../dlls/squeakgrenade.cpp ^ + ../dlls/tripmine.cpp ^ + ../dlls/glock.cpp ^ + ev_hldm.cpp ^ + hl/hl_baseentity.cpp ^ + hl/hl_events.cpp ^ + hl/hl_objects.cpp ^ + hl/hl_weapons.cpp ^ + ammo.cpp ^ + ammo_secondary.cpp ^ + ammohistory.cpp ^ + battery.cpp ^ + cdll_int.cpp ^ + com_weapons.cpp ^ + death.cpp ^ + demo.cpp ^ + entity.cpp ^ + ev_common.cpp ^ + events.cpp ^ + flashlight.cpp ^ + GameStudioModelRenderer.cpp ^ + geiger.cpp ^ + health.cpp ^ + hud.cpp ^ + hud_msg.cpp ^ + hud_redraw.cpp ^ + hud_spectator.cpp ^ + hud_update.cpp ^ + in_camera.cpp ^ + input.cpp ^ + input_goldsource.cpp ^ + input_mouse.cpp ^ + input_xash3d.cpp ^ + menu.cpp ^ + message.cpp ^ + overview.cpp ^ + parsemsg.cpp ^ + ../pm_shared/pm_debug.c ^ + ../pm_shared/pm_math.c ^ + ../pm_shared/pm_shared.c ^ + saytext.cpp ^ + status_icons.cpp ^ + statusbar.cpp ^ + studio_util.cpp ^ + StudioModelRenderer.cpp ^ + text_message.cpp ^ + train.cpp ^ + tri.cpp ^ + util.cpp ^ + view.cpp ^ + scoreboard.cpp ^ MOTD.cpp set DEFINES=/DCLIENT_DLL /DCLIENT_WEAPONS /Dsnprintf=_snprintf /DNO_VOICEGAMEMGR /DGOLDSOURCE_SUPPORT set LIBS=user32.lib Winmm.lib diff --git a/cl_dll/input_goldsource.cpp b/cl_dll/input_goldsource.cpp index c45841cb..be85ee3a 100644 --- a/cl_dll/input_goldsource.cpp +++ b/cl_dll/input_goldsource.cpp @@ -44,62 +44,62 @@ const char* (*pfnSDL_GameControllerName)(SDL_GameController*); int safe_pfnSDL_SetRelativeMouseMode(SDL_bool mode) { - if (pfnSDL_SetRelativeMouseMode) - return pfnSDL_SetRelativeMouseMode(mode); - return -1; + if (pfnSDL_SetRelativeMouseMode) + return pfnSDL_SetRelativeMouseMode(mode); + return -1; } Uint32 safe_pfnSDL_GetRelativeMouseState(int* x, int* y) { - if (pfnSDL_GetRelativeMouseState) - return pfnSDL_GetRelativeMouseState(x, y); - return 0; + if (pfnSDL_GetRelativeMouseState) + return pfnSDL_GetRelativeMouseState(x, y); + return 0; } int safe_pfnSDL_NumJoysticks() { - if (pfnSDL_NumJoysticks) - return pfnSDL_NumJoysticks(); - return -1; + if (pfnSDL_NumJoysticks) + return pfnSDL_NumJoysticks(); + return -1; } SDL_bool safe_pfnSDL_IsGameController(int joystick_index) { - if (pfnSDL_IsGameController) - return pfnSDL_IsGameController(joystick_index); - return SDL_FALSE; + if (pfnSDL_IsGameController) + return pfnSDL_IsGameController(joystick_index); + return SDL_FALSE; } SDL_GameController* safe_pfnSDL_GameControllerOpen(int joystick_index) { - if (pfnSDL_GameControllerOpen) - return pfnSDL_GameControllerOpen(joystick_index); - return NULL; + if (pfnSDL_GameControllerOpen) + return pfnSDL_GameControllerOpen(joystick_index); + return NULL; } Sint16 safe_pfnSDL_GameControllerGetAxis(SDL_GameController* gamecontroller, SDL_GameControllerAxis axis) { - if (pfnSDL_GameControllerGetAxis) - return pfnSDL_GameControllerGetAxis(gamecontroller, axis); - return 0; + if (pfnSDL_GameControllerGetAxis) + return pfnSDL_GameControllerGetAxis(gamecontroller, axis); + return 0; } Uint8 safe_pfnSDL_GameControllerGetButton(SDL_GameController* gamecontroller, SDL_GameControllerButton button) { - if (pfnSDL_GameControllerGetButton) - return pfnSDL_GameControllerGetButton(gamecontroller, button); - return 0; + if (pfnSDL_GameControllerGetButton) + return pfnSDL_GameControllerGetButton(gamecontroller, button); + return 0; } void safe_pfnSDL_JoystickUpdate() { - if (pfnSDL_JoystickUpdate) - pfnSDL_JoystickUpdate(); + if (pfnSDL_JoystickUpdate) + pfnSDL_JoystickUpdate(); } const char* safe_pfnSDL_GameControllerName(SDL_GameController* gamecontroller) { - if (pfnSDL_GameControllerName) - return pfnSDL_GameControllerName(gamecontroller); - return NULL; + if (pfnSDL_GameControllerName) + return pfnSDL_GameControllerName(gamecontroller); + return NULL; } struct SDLFunction { - void** ppfnFunc; - const char* name; + void** ppfnFunc; + const char* name; }; static SDLFunction sdlFunctions[] = { {(void**)&pfnSDL_SetRelativeMouseMode, "SDL_SetRelativeMouseMode"}, @@ -129,15 +129,15 @@ extern cl_enginefunc_t gEngfuncs; extern int iMouseInUse; -extern kbutton_t in_strafe; -extern kbutton_t in_mlook; -extern kbutton_t in_speed; -extern kbutton_t in_jlook; +extern kbutton_t in_strafe; +extern kbutton_t in_mlook; +extern kbutton_t in_speed; +extern kbutton_t in_jlook; -extern cvar_t *m_pitch; -extern cvar_t *m_yaw; -extern cvar_t *m_forward; -extern cvar_t *m_side; +extern cvar_t *m_pitch; +extern cvar_t *m_yaw; +extern cvar_t *m_forward; +extern cvar_t *m_side; extern cvar_t *lookstrafe; extern cvar_t *lookspring; @@ -161,6 +161,7 @@ bool isMouseRelative = false; extern globalvars_t *gpGlobals; #endif +int CL_IsDead( void ); extern Vector dead_viewangles; void V_StopPitchDrift( void ) @@ -169,8 +170,8 @@ void V_StopPitchDrift( void ) } // mouse variables -cvar_t *m_filter; -extern cvar_t *sensitivity; +cvar_t *m_filter; +extern cvar_t *sensitivity; // Custom mouse acceleration (0 disable, 1 to enable, 2 enable with separate yaw/pitch rescale) static cvar_t *m_customaccel; @@ -188,44 +189,44 @@ static cvar_t *m_customaccel_exponent; static cvar_t *m_mousethread_sleep; #endif -float mouse_x, mouse_y; +float mouse_x, mouse_y; -static int restore_spi; -static int originalmouseparms[3], newmouseparms[3] = {0, 0, 1}; -static int mouseactive = 0; -static int mouseparmsvalid; -static int mouseshowtoggle = 1; +static int restore_spi; +static int originalmouseparms[3], newmouseparms[3] = {0, 0, 1}; +static int mouseactive = 0; +static int mouseparmsvalid; +static int mouseshowtoggle = 1; // joystick defines and variables // where should defines be moved? -#define JOY_ABSOLUTE_AXIS 0x00000000 // control like a joystick -#define JOY_RELATIVE_AXIS 0x00000010 // control like a mouse, spinner, trackball -#define JOY_MAX_AXES 6 // X, Y, Z, R, U, V -#define JOY_AXIS_X 0 -#define JOY_AXIS_Y 1 -#define JOY_AXIS_Z 2 -#define JOY_AXIS_R 3 -#define JOY_AXIS_U 4 -#define JOY_AXIS_V 5 +#define JOY_ABSOLUTE_AXIS 0x00000000 // control like a joystick +#define JOY_RELATIVE_AXIS 0x00000010 // control like a mouse, spinner, trackball +#define JOY_MAX_AXES 6 // X, Y, Z, R, U, V +#define JOY_AXIS_X 0 +#define JOY_AXIS_Y 1 +#define JOY_AXIS_Z 2 +#define JOY_AXIS_R 3 +#define JOY_AXIS_U 4 +#define JOY_AXIS_V 5 enum _ControlList { - AxisNada = 0, - AxisForward, - AxisLook, - AxisSide, - AxisTurn + AxisNada = 0, + AxisForward, + AxisLook, + AxisSide, + AxisTurn }; #if !defined(USE_SDL2) && defined(_WIN32) DWORD dwAxisFlags[JOY_MAX_AXES] = { - JOY_RETURNX, - JOY_RETURNY, - JOY_RETURNZ, - JOY_RETURNR, - JOY_RETURNU, - JOY_RETURNV + JOY_RETURNX, + JOY_RETURNY, + JOY_RETURNZ, + JOY_RETURNR, + JOY_RETURNU, + JOY_RETURNV }; #endif @@ -236,10 +237,10 @@ int pdwRawValue[ JOY_MAX_AXES ]; #elif defined(_WIN32) PDWORD pdwRawValue[ JOY_MAX_AXES ]; #endif -DWORD joy_oldbuttonstate, joy_oldpovstate; +DWORD joy_oldbuttonstate, joy_oldpovstate; -int joy_id; -DWORD joy_numbuttons; +int joy_id; +DWORD joy_numbuttons; #ifdef USE_SDL2 SDL_GameController *s_pJoystick = NULL; @@ -273,13 +274,13 @@ cvar_t *joy_yawsensitivity; cvar_t *joy_wwhack1; cvar_t *joy_wwhack2; -int joy_avail, joy_advancedinit, joy_haspov; +int joy_avail, joy_advancedinit, joy_haspov; #ifdef _WIN32 unsigned int s_hMouseThreadId = 0; -HANDLE s_hMouseThread = 0; -HANDLE s_hMouseQuitEvent = 0; -HANDLE s_hMouseThreadActiveLock = 0; +HANDLE s_hMouseThread = 0; +HANDLE s_hMouseQuitEvent = 0; +HANDLE s_hMouseThreadActiveLock = 0; #endif /* @@ -289,14 +290,14 @@ Force_CenterView_f */ void Force_CenterView_f (void) { - vec3_t viewangles; + vec3_t viewangles; - if (!iMouseInUse) - { - gEngfuncs.GetViewAngles( (float *)viewangles ); - viewangles[PITCH] = 0; - gEngfuncs.SetViewAngles( (float *)viewangles ); - } + if (!iMouseInUse) + { + gEngfuncs.GetViewAngles( (float *)viewangles ); + viewangles[PITCH] = 0; + gEngfuncs.SetViewAngles( (float *)viewangles ); + } } #ifdef _WIN32 @@ -310,129 +311,129 @@ LONG mouseThreadSleep = 0; bool MouseThread_ActiveLock_Enter( void ) { - if(!m_bMouseThread) - return true; + if(!m_bMouseThread) + return true; - return WAIT_OBJECT_0 == WaitForSingleObject( s_hMouseThreadActiveLock, INFINITE); + return WAIT_OBJECT_0 == WaitForSingleObject( s_hMouseThreadActiveLock, INFINITE); } void MouseThread_ActiveLock_Exit( void ) { - if(!m_bMouseThread) - return; + if(!m_bMouseThread) + return; - SetEvent( s_hMouseThreadActiveLock ); + SetEvent( s_hMouseThreadActiveLock ); } unsigned __stdcall MouseThread_Function( void * pArg ) { - while ( true ) - { - DWORD sleepVal = (DWORD)InterlockedExchangeAdd(&mouseThreadSleep, 0); - if(0 > sleepVal) sleepVal = 0; - else if(1000 < sleepVal) sleepVal = 1000; - if(WAIT_OBJECT_0 == WaitForSingleObject( s_hMouseQuitEvent, sleepVal)) - { - break; - } + while ( true ) + { + DWORD sleepVal = (DWORD)InterlockedExchangeAdd(&mouseThreadSleep, 0); + if(0 > sleepVal) sleepVal = 0; + else if(1000 < sleepVal) sleepVal = 1000; + if(WAIT_OBJECT_0 == WaitForSingleObject( s_hMouseQuitEvent, sleepVal)) + { + break; + } - if( MouseThread_ActiveLock_Enter() ) - { - if ( InterlockedExchangeAdd(&mouseThreadActive, 0) ) - { - POINT mouse_pos; - POINT center_pos; + if( MouseThread_ActiveLock_Enter() ) + { + if ( InterlockedExchangeAdd(&mouseThreadActive, 0) ) + { + POINT mouse_pos; + POINT center_pos; - center_pos.x = InterlockedExchangeAdd(&mouseThreadCenterX, 0); - center_pos.y = InterlockedExchangeAdd(&mouseThreadCenterY, 0); - GetCursorPos(&mouse_pos); + center_pos.x = InterlockedExchangeAdd(&mouseThreadCenterX, 0); + center_pos.y = InterlockedExchangeAdd(&mouseThreadCenterY, 0); + GetCursorPos(&mouse_pos); - mouse_pos.x -= center_pos.x; - mouse_pos.y -= center_pos.y; + mouse_pos.x -= center_pos.x; + mouse_pos.y -= center_pos.y; - if(mouse_pos.x || mouse_pos.y) SetCursorPos( center_pos.x, center_pos.y ); + if(mouse_pos.x || mouse_pos.y) SetCursorPos( center_pos.x, center_pos.y ); - InterlockedExchangeAdd(&mouseThreadDeltaX, mouse_pos.x); - InterlockedExchangeAdd(&mouseThreadDeltaY, mouse_pos.y); - } + InterlockedExchangeAdd(&mouseThreadDeltaX, mouse_pos.x); + InterlockedExchangeAdd(&mouseThreadDeltaY, mouse_pos.y); + } - MouseThread_ActiveLock_Exit(); - } - } + MouseThread_ActiveLock_Exit(); + } + } - return 0; + return 0; } /// <summary>Updates mouseThreadActive using the global variables mouseactive, iVisibleMouse and m_bRawInput. Should be called after any of these is changed.</summary> /// <remarks>Has to be interlocked manually by programmer! Use MouseThread_ActiveLock_Enter and MouseThread_ActiveLock_Exit.</remarks> void UpdateMouseThreadActive(void) { - InterlockedExchange(&mouseThreadActive, mouseactive && !iVisibleMouse && !m_bRawInput); + InterlockedExchange(&mouseThreadActive, mouseactive && !iVisibleMouse && !m_bRawInput); } #endif void IN_SetMouseMode(bool enable) { - static bool currentMouseMode = false; + static bool currentMouseMode = false; - if(enable == currentMouseMode) - return; + if(enable == currentMouseMode) + return; - if(enable) - { + if(enable) + { #ifdef _WIN32 - if (mouseparmsvalid) - restore_spi = SystemParametersInfo (SPI_SETMOUSE, 0, newmouseparms, 0); + if (mouseparmsvalid) + restore_spi = SystemParametersInfo (SPI_SETMOUSE, 0, newmouseparms, 0); - m_bRawInput = CVAR_GET_FLOAT( "m_rawinput" ) != 0; - if(m_bRawInput) - { + m_bRawInput = CVAR_GET_FLOAT( "m_rawinput" ) != 0; + if(m_bRawInput) + { #ifdef USE_SDL2 - safe_pfnSDL_SetRelativeMouseMode(SDL_TRUE); + safe_pfnSDL_SetRelativeMouseMode(SDL_TRUE); #endif - isMouseRelative = true; - } + isMouseRelative = true; + } #else - safe_pfnSDL_SetRelativeMouseMode(SDL_TRUE); + safe_pfnSDL_SetRelativeMouseMode(SDL_TRUE); #endif - currentMouseMode = true; - } - else - { + currentMouseMode = true; + } + else + { #ifdef _WIN32 - if(isMouseRelative) - { + if(isMouseRelative) + { #ifdef USE_SDL2 - safe_pfnSDL_SetRelativeMouseMode(SDL_FALSE); + safe_pfnSDL_SetRelativeMouseMode(SDL_FALSE); #endif - isMouseRelative = false; - } + isMouseRelative = false; + } - if (restore_spi) - SystemParametersInfo (SPI_SETMOUSE, 0, originalmouseparms, 0); + if (restore_spi) + SystemParametersInfo (SPI_SETMOUSE, 0, originalmouseparms, 0); #else - safe_pfnSDL_SetRelativeMouseMode(SDL_FALSE); + safe_pfnSDL_SetRelativeMouseMode(SDL_FALSE); #endif - currentMouseMode = false; - } + currentMouseMode = false; + } } void IN_SetVisibleMouse(bool visible) { #ifdef _WIN32 - bool lockEntered = MouseThread_ActiveLock_Enter(); + bool lockEntered = MouseThread_ActiveLock_Enter(); #endif - iVisibleMouse = visible; + iVisibleMouse = visible; - IN_SetMouseMode(!visible); + IN_SetMouseMode(!visible); #ifdef _WIN32 - UpdateMouseThreadActive(); - if(lockEntered) MouseThread_ActiveLock_Exit(); + UpdateMouseThreadActive(); + if(lockEntered) MouseThread_ActiveLock_Exit(); #endif } @@ -445,24 +446,24 @@ IN_ActivateMouse */ void GoldSourceInput::IN_ActivateMouse (void) { - if (mouseinitialized) - { + if (mouseinitialized) + { #ifdef _WIN32 - bool lockEntered = MouseThread_ActiveLock_Enter(); + bool lockEntered = MouseThread_ActiveLock_Enter(); #endif - IN_SetMouseMode(true); + IN_SetMouseMode(true); - mouseactive = 1; + mouseactive = 1; #ifdef _WIN32 - UpdateMouseThreadActive(); - if(lockEntered) MouseThread_ActiveLock_Exit(); + UpdateMouseThreadActive(); + if(lockEntered) MouseThread_ActiveLock_Exit(); #endif - // now is a good time to reset mouse positon: - IN_ResetMouse(); - } + // now is a good time to reset mouse positon: + IN_ResetMouse(); + } } @@ -473,21 +474,21 @@ IN_DeactivateMouse */ void GoldSourceInput::IN_DeactivateMouse (void) { - if (mouseinitialized) - { + if (mouseinitialized) + { #ifdef _WIN32 - bool lockEntered = MouseThread_ActiveLock_Enter(); + bool lockEntered = MouseThread_ActiveLock_Enter(); #endif - IN_SetMouseMode(false); + IN_SetMouseMode(false); - mouseactive = 0; + mouseactive = 0; #ifdef _WIN32 - UpdateMouseThreadActive(); - if(lockEntered) MouseThread_ActiveLock_Exit(); + UpdateMouseThreadActive(); + if(lockEntered) MouseThread_ActiveLock_Exit(); #endif - } + } } /* @@ -497,34 +498,34 @@ IN_StartupMouse */ void GoldSourceInput::IN_StartupMouse (void) { - if ( gEngfuncs.CheckParm ("-nomouse", NULL ) ) - return; + if ( gEngfuncs.CheckParm ("-nomouse", NULL ) ) + return; - mouseinitialized = 1; + mouseinitialized = 1; #ifdef _WIN32 - mouseparmsvalid = SystemParametersInfo (SPI_GETMOUSE, 0, originalmouseparms, 0); + mouseparmsvalid = SystemParametersInfo (SPI_GETMOUSE, 0, originalmouseparms, 0); - if (mouseparmsvalid) - { - if ( gEngfuncs.CheckParm ("-noforcemspd", NULL ) ) - newmouseparms[2] = originalmouseparms[2]; + if (mouseparmsvalid) + { + if ( gEngfuncs.CheckParm ("-noforcemspd", NULL ) ) + newmouseparms[2] = originalmouseparms[2]; - if ( gEngfuncs.CheckParm ("-noforcemaccel", NULL ) ) - { - newmouseparms[0] = originalmouseparms[0]; - newmouseparms[1] = originalmouseparms[1]; - } + if ( gEngfuncs.CheckParm ("-noforcemaccel", NULL ) ) + { + newmouseparms[0] = originalmouseparms[0]; + newmouseparms[1] = originalmouseparms[1]; + } - if ( gEngfuncs.CheckParm ("-noforcemparms", NULL ) ) - { - newmouseparms[0] = originalmouseparms[0]; - newmouseparms[1] = originalmouseparms[1]; - newmouseparms[2] = originalmouseparms[2]; - } - } + if ( gEngfuncs.CheckParm ("-noforcemparms", NULL ) ) + { + newmouseparms[0] = originalmouseparms[0]; + newmouseparms[1] = originalmouseparms[1]; + newmouseparms[2] = originalmouseparms[2]; + } + } #endif - mouse_buttons = MOUSE_BUTTON_COUNT; + mouse_buttons = MOUSE_BUTTON_COUNT; } /* @@ -534,43 +535,43 @@ IN_Shutdown */ void GoldSourceInput::IN_Shutdown (void) { - IN_DeactivateMouse (); + IN_DeactivateMouse (); #ifdef _WIN32 - if ( s_hMouseQuitEvent ) - { - SetEvent( s_hMouseQuitEvent ); - } + if ( s_hMouseQuitEvent ) + { + SetEvent( s_hMouseQuitEvent ); + } - if ( s_hMouseThread ) - { - if(WAIT_OBJECT_0 != WaitForSingleObject( s_hMouseThread, 5000 )) - { - TerminateThread( s_hMouseThread, 0 ); - } - CloseHandle( s_hMouseThread ); - s_hMouseThread = (HANDLE)0; - } + if ( s_hMouseThread ) + { + if(WAIT_OBJECT_0 != WaitForSingleObject( s_hMouseThread, 5000 )) + { + TerminateThread( s_hMouseThread, 0 ); + } + CloseHandle( s_hMouseThread ); + s_hMouseThread = (HANDLE)0; + } - if ( s_hMouseQuitEvent ) - { - CloseHandle( s_hMouseQuitEvent ); - s_hMouseQuitEvent = (HANDLE)0; - } + if ( s_hMouseQuitEvent ) + { + CloseHandle( s_hMouseQuitEvent ); + s_hMouseQuitEvent = (HANDLE)0; + } - if( s_hMouseThreadActiveLock ) - { - CloseHandle( s_hMouseThreadActiveLock ); - s_hMouseThreadActiveLock = (HANDLE)0; - } + if( s_hMouseThreadActiveLock ) + { + CloseHandle( s_hMouseThreadActiveLock ); + s_hMouseThreadActiveLock = (HANDLE)0; + } #endif #ifdef USE_SDL2 - for (int j=0; j<ARRAYSIZE(sdlFunctions); ++j) { - *(sdlFunctions[j].ppfnFunc) = NULL; - } - dlclose(sdl2Lib); - sdl2Lib = NULL; + for (int j=0; j<ARRAYSIZE(sdlFunctions); ++j) { + *(sdlFunctions[j].ppfnFunc) = NULL; + } + dlclose(sdl2Lib); + sdl2Lib = NULL; #endif } @@ -583,7 +584,7 @@ Ask for mouse position from engine */ void IN_GetMousePos( int *mx, int *my ) { - gEngfuncs.GetMousePosition( mx, my ); + gEngfuncs.GetMousePosition( mx, my ); } /* @@ -595,27 +596,31 @@ FIXME: Call through to engine? */ void IN_ResetMouse( void ) { - // no work to do in SDL + // no work to do in SDL #ifdef _WIN32 - // reset only if mouse is active and not in visible mode: - if(mouseactive && !iVisibleMouse) - { - if ( !m_bRawInput && gEngfuncs.GetWindowCenterX && gEngfuncs.GetWindowCenterY ) - { - bool lockEntered = MouseThread_ActiveLock_Enter(); + // reset only if mouse is active and not in visible mode: + if(mouseactive && !iVisibleMouse && gEngfuncs.GetWindowCenterX && gEngfuncs.GetWindowCenterY) + { + if ( !m_bMouseThread && m_bRawInput ) + { + SetCursorPos ( gEngfuncs.GetWindowCenterX(), gEngfuncs.GetWindowCenterY() ); + } + else if ( !m_bRawInput ) + { + bool lockEntered = MouseThread_ActiveLock_Enter(); - int centerX = gEngfuncs.GetWindowCenterX(); - int centerY = gEngfuncs.GetWindowCenterY(); + int centerX = gEngfuncs.GetWindowCenterX(); + int centerY = gEngfuncs.GetWindowCenterY(); - SetCursorPos ( centerX, centerY ); - InterlockedExchange( &mouseThreadCenterX, centerX ); - InterlockedExchange( &mouseThreadCenterY, centerY ); - InterlockedExchange( &mouseThreadDeltaX, 0 ); - InterlockedExchange( &mouseThreadDeltaY, 0 ); + SetCursorPos ( centerX, centerY ); + InterlockedExchange( &mouseThreadCenterX, centerX ); + InterlockedExchange( &mouseThreadCenterY, centerY ); + InterlockedExchange( &mouseThreadDeltaX, 0 ); + InterlockedExchange( &mouseThreadDeltaY, 0 ); - if(lockEntered) MouseThread_ActiveLock_Exit(); - } - } + if(lockEntered) MouseThread_ActiveLock_Exit(); + } + } #endif } @@ -626,191 +631,191 @@ IN_MouseEvent */ void GoldSourceInput::IN_MouseEvent (int mstate) { - int i; + int i; - if ( iMouseInUse || iVisibleMouse ) - return; + if ( iMouseInUse || iVisibleMouse ) + return; - // perform button actions - for (i=0 ; i<mouse_buttons ; i++) - { - if ( (mstate & (1<<i)) && - !(mouse_oldbuttonstate & (1<<i)) ) - { - gEngfuncs.Key_Event (K_MOUSE1 + i, 1); - } + // perform button actions + for (i=0 ; i<mouse_buttons ; i++) + { + if ( (mstate & (1<<i)) && + !(mouse_oldbuttonstate & (1<<i)) ) + { + gEngfuncs.Key_Event (K_MOUSE1 + i, 1); + } - if ( !(mstate & (1<<i)) && - (mouse_oldbuttonstate & (1<<i)) ) - { - gEngfuncs.Key_Event (K_MOUSE1 + i, 0); - } - } + if ( !(mstate & (1<<i)) && + (mouse_oldbuttonstate & (1<<i)) ) + { + gEngfuncs.Key_Event (K_MOUSE1 + i, 0); + } + } - mouse_oldbuttonstate = mstate; + mouse_oldbuttonstate = mstate; } //----------------------------------------------------------------------------- // Purpose: Allows modulation of mouse scaling/senstivity value and application // of custom algorithms. -// Input : *x - +// Input : *x - // *y - //----------------------------------------------------------------------------- void IN_ScaleMouse( float *x, float *y ) { - float mx = *x; - float my = *y; + float mx = *x; + float my = *y; - // This is the default sensitivity - float mouse_senstivity = ( gHUD.GetSensitivity() != 0 ) ? gHUD.GetSensitivity() : sensitivity->value; + // This is the default sensitivity + float mouse_senstivity = ( gHUD.GetSensitivity() != 0 ) ? gHUD.GetSensitivity() : sensitivity->value; - // Using special accleration values - if ( m_customaccel->value != 0 ) - { - float raw_mouse_movement_distance = sqrt( mx * mx + my * my ); - float acceleration_scale = m_customaccel_scale->value; - float accelerated_sensitivity_max = m_customaccel_max->value; - float accelerated_sensitivity_exponent = m_customaccel_exponent->value; - float accelerated_sensitivity = ( (float)pow( raw_mouse_movement_distance, accelerated_sensitivity_exponent ) * acceleration_scale + mouse_senstivity ); + // Using special accleration values + if ( m_customaccel->value != 0 ) + { + float raw_mouse_movement_distance = sqrt( mx * mx + my * my ); + float acceleration_scale = m_customaccel_scale->value; + float accelerated_sensitivity_max = m_customaccel_max->value; + float accelerated_sensitivity_exponent = m_customaccel_exponent->value; + float accelerated_sensitivity = ( (float)pow( raw_mouse_movement_distance, accelerated_sensitivity_exponent ) * acceleration_scale + mouse_senstivity ); - if ( accelerated_sensitivity_max > 0.0001f && - accelerated_sensitivity > accelerated_sensitivity_max ) - { - accelerated_sensitivity = accelerated_sensitivity_max; - } + if ( accelerated_sensitivity_max > 0.0001f && + accelerated_sensitivity > accelerated_sensitivity_max ) + { + accelerated_sensitivity = accelerated_sensitivity_max; + } - *x *= accelerated_sensitivity; - *y *= accelerated_sensitivity; + *x *= accelerated_sensitivity; + *y *= accelerated_sensitivity; - // Further re-scale by yaw and pitch magnitude if user requests alternate mode 2 - // This means that they will need to up their value for m_customaccel_scale greatly (>40x) since m_pitch/yaw default - // to 0.022 - if ( m_customaccel->value == 2 ) - { - *x *= m_yaw->value; - *y *= m_pitch->value; - } - } - else - { - // Just apply the default - *x *= mouse_senstivity; - *y *= mouse_senstivity; - } + // Further re-scale by yaw and pitch magnitude if user requests alternate mode 2 + // This means that they will need to up their value for m_customaccel_scale greatly (>40x) since m_pitch/yaw default + // to 0.022 + if ( m_customaccel->value == 2 ) + { + *x *= m_yaw->value; + *y *= m_pitch->value; + } + } + else + { + // Just apply the default + *x *= mouse_senstivity; + *y *= mouse_senstivity; + } } void GoldSourceInput::IN_GetMouseDelta( int *pOutX, int *pOutY) { - bool active = mouseactive && !iVisibleMouse; - int mx, my; + bool active = mouseactive && !iVisibleMouse; + int mx, my; - if(active) - { - int deltaX, deltaY; + if(active) + { + int deltaX, deltaY; #ifdef _WIN32 - if ( !m_bRawInput ) - { - if ( m_bMouseThread ) - { - // update mouseThreadSleep: - InterlockedExchange(&mouseThreadSleep, (LONG)m_mousethread_sleep->value); + if ( !m_bRawInput ) + { + if ( m_bMouseThread ) + { + // update mouseThreadSleep: + InterlockedExchange(&mouseThreadSleep, (LONG)m_mousethread_sleep->value); - bool lockEntered = MouseThread_ActiveLock_Enter(); + bool lockEntered = MouseThread_ActiveLock_Enter(); - current_pos.x = InterlockedExchange( &mouseThreadDeltaX, 0 ); - current_pos.y = InterlockedExchange( &mouseThreadDeltaY, 0 ); + current_pos.x = InterlockedExchange( &mouseThreadDeltaX, 0 ); + current_pos.y = InterlockedExchange( &mouseThreadDeltaY, 0 ); - if(lockEntered) MouseThread_ActiveLock_Exit(); - } - else - { - GetCursorPos (¤t_pos); - } - } - else + if(lockEntered) MouseThread_ActiveLock_Exit(); + } + else + { + GetCursorPos (¤t_pos); + } + } + else #endif - { + { #ifdef USE_SDL2 - safe_pfnSDL_GetRelativeMouseState( &deltaX, &deltaY ); - current_pos.x = deltaX; - current_pos.y = deltaY; + safe_pfnSDL_GetRelativeMouseState( &deltaX, &deltaY ); + current_pos.x = deltaX; + current_pos.y = deltaY; #else - GetCursorPos (¤t_pos); - deltaX = current_pos.x - gEngfuncs.GetWindowCenterX(); - deltaY = current_pos.y - gEngfuncs.GetWindowCenterY(); + GetCursorPos (¤t_pos); + deltaX = current_pos.x - gEngfuncs.GetWindowCenterX(); + deltaY = current_pos.y - gEngfuncs.GetWindowCenterY(); #endif - } + } #ifdef _WIN32 - if ( !m_bRawInput ) - { - if ( m_bMouseThread ) - { - mx = current_pos.x; - my = current_pos.y; - } - else - { - mx = current_pos.x - gEngfuncs.GetWindowCenterX() + mx_accum; - my = current_pos.y - gEngfuncs.GetWindowCenterY() + my_accum; - } - } - else + if ( !m_bRawInput ) + { + if ( m_bMouseThread ) + { + mx = current_pos.x; + my = current_pos.y; + } + else + { + mx = current_pos.x - gEngfuncs.GetWindowCenterX() + mx_accum; + my = current_pos.y - gEngfuncs.GetWindowCenterY() + my_accum; + } + } + else #endif - { - mx = deltaX + mx_accum; - my = deltaY + my_accum; - } + { + mx = deltaX + mx_accum; + my = deltaY + my_accum; + } - mx_accum = 0; - my_accum = 0; + mx_accum = 0; + my_accum = 0; - // reset mouse position if required, so there is room to move: + // reset mouse position if required, so there is room to move: #ifdef _WIN32 - // do not reset if mousethread would do it: - if ( m_bRawInput || !m_bMouseThread ) + // do not reset if mousethread would do it: + if ( m_bRawInput || !m_bMouseThread ) #else - if(true) + if(true) #endif - IN_ResetMouse(); + IN_ResetMouse(); #ifdef _WIN32 - // update m_bRawInput occasionally: - if ( gpGlobals && gpGlobals->time - s_flRawInputUpdateTime > 1.0f ) - { - s_flRawInputUpdateTime = gpGlobals->time; + // update m_bRawInput occasionally: + if ( gpGlobals && gpGlobals->time - s_flRawInputUpdateTime > 1.0f ) + { + s_flRawInputUpdateTime = gpGlobals->time; - bool lockEntered = MouseThread_ActiveLock_Enter(); + bool lockEntered = MouseThread_ActiveLock_Enter(); - m_bRawInput = CVAR_GET_FLOAT( "m_rawinput" ) != 0; + m_bRawInput = CVAR_GET_FLOAT( "m_rawinput" ) != 0; - if(m_bRawInput && !isMouseRelative) - { + if(m_bRawInput && !isMouseRelative) + { #ifdef USE_SDL2 - safe_pfnSDL_SetRelativeMouseMode(SDL_TRUE); + safe_pfnSDL_SetRelativeMouseMode(SDL_TRUE); #endif - isMouseRelative = true; - } - else if(!m_bRawInput && isMouseRelative) - { + isMouseRelative = true; + } + else if(!m_bRawInput && isMouseRelative) + { #ifdef USE_SDL2 - safe_pfnSDL_SetRelativeMouseMode(SDL_FALSE); + safe_pfnSDL_SetRelativeMouseMode(SDL_FALSE); #endif - isMouseRelative = false; - } + isMouseRelative = false; + } - UpdateMouseThreadActive(); - if(lockEntered) MouseThread_ActiveLock_Exit(); - } + UpdateMouseThreadActive(); + if(lockEntered) MouseThread_ActiveLock_Exit(); + } #endif - } - else - { - mx = my = 0; - } + } + else + { + mx = my = 0; + } - if(pOutX) *pOutX = mx; - if(pOutY) *pOutY = my; + if(pOutX) *pOutX = mx; + if(pOutY) *pOutY = my; } /* @@ -820,77 +825,93 @@ IN_MouseMove */ void GoldSourceInput::IN_MouseMove ( float frametime, usercmd_t *cmd) { - int mx, my; - vec3_t viewangles; + int mx, my; + vec3_t viewangles; - gEngfuncs.GetViewAngles( (float *)viewangles ); + if( gHUD.m_iIntermission ) + return; // we can't move during intermission - if ( in_mlook.state & 1) - { - V_StopPitchDrift (); - } + if( CL_IsDead() ) + { + viewangles = dead_viewangles; // HACKHACK: see below + } + else + { + gEngfuncs.GetViewAngles( viewangles ); + } - //jjb - this disbles normal mouse control if the user is trying to - // move the camera, or if the mouse cursor is visible or if we're in intermission - if ( !iMouseInUse && !gHUD.m_iIntermission && !iVisibleMouse ) - { - IN_GetMouseDelta( &mx, &my ); + if ( in_mlook.state & 1) + { + V_StopPitchDrift (); + } - if (m_filter && m_filter->value) - { - mouse_x = (mx + old_mouse_x) * 0.5; - mouse_y = (my + old_mouse_y) * 0.5; - } - else - { - mouse_x = mx; - mouse_y = my; - } + //jjb - this disbles normal mouse control if the user is trying to + // move the camera, or if the mouse cursor is visible or if we're in intermission + if ( !iMouseInUse && !gHUD.m_iIntermission && !iVisibleMouse ) + { + IN_GetMouseDelta( &mx, &my ); - old_mouse_x = mx; - old_mouse_y = my; + if (m_filter && m_filter->value) + { + mouse_x = (mx + old_mouse_x) * 0.5; + mouse_y = (my + old_mouse_y) * 0.5; + } + else + { + mouse_x = mx; + mouse_y = my; + } - // Apply custom mouse scaling/acceleration - IN_ScaleMouse( &mouse_x, &mouse_y ); + old_mouse_x = mx; + old_mouse_y = my; - // add mouse X/Y movement to cmd - if ( (in_strafe.state & 1) || (lookstrafe->value && (in_mlook.state & 1) )) - cmd->sidemove += m_side->value * mouse_x; - else - viewangles[YAW] -= m_yaw->value * mouse_x; + // Apply custom mouse scaling/acceleration + IN_ScaleMouse( &mouse_x, &mouse_y ); - if ( (in_mlook.state & 1) && !(in_strafe.state & 1)) - { - viewangles[PITCH] += m_pitch->value * mouse_y; - if (viewangles[PITCH] > cl_pitchdown->value) - viewangles[PITCH] = cl_pitchdown->value; - if (viewangles[PITCH] < -cl_pitchup->value) - viewangles[PITCH] = -cl_pitchup->value; - } - else - { - if ((in_strafe.state & 1) && gEngfuncs.IsNoClipping() ) - { - cmd->upmove -= m_forward->value * mouse_y; - } - else - { - cmd->forwardmove -= m_forward->value * mouse_y; - } - } - } + // add mouse X/Y movement to cmd + if ( (in_strafe.state & 1) || (lookstrafe->value && (in_mlook.state & 1) )) + cmd->sidemove += m_side->value * mouse_x; + else + viewangles[YAW] -= m_yaw->value * mouse_x; - gEngfuncs.SetViewAngles( (float *)viewangles ); + if ( (in_mlook.state & 1) && !(in_strafe.state & 1)) + { + viewangles[PITCH] += m_pitch->value * mouse_y; + if (viewangles[PITCH] > cl_pitchdown->value) + viewangles[PITCH] = cl_pitchdown->value; + if (viewangles[PITCH] < -cl_pitchup->value) + viewangles[PITCH] = -cl_pitchup->value; + } + else + { + if ((in_strafe.state & 1) && gEngfuncs.IsNoClipping() ) + { + cmd->upmove -= m_forward->value * mouse_y; + } + else + { + cmd->forwardmove -= m_forward->value * mouse_y; + } + } + } + // HACKHACK: change viewangles directly in viewcode, + // so viewangles when player is dead will not be changed on server + if( !CL_IsDead() ) + { + gEngfuncs.SetViewAngles( viewangles ); + } + + dead_viewangles = viewangles; // keep them actual /* //#define TRACE_TEST #if defined( TRACE_TEST ) - { - int mx, my; - void V_Move( int mx, int my ); - IN_GetMousePos( &mx, &my ); - V_Move( mx, my ); - } + { + int mx, my; + void V_Move( int mx, int my ); + IN_GetMousePos( &mx, &my ); + V_Move( mx, my ); + } #endif */ } @@ -902,49 +923,49 @@ IN_Accumulate */ void GoldSourceInput::IN_Accumulate (void) { - //only accumulate mouse if we are not moving the camera with the mouse - if ( !iMouseInUse && !iVisibleMouse) - { - if (mouseactive) - { + //only accumulate mouse if we are not moving the camera with the mouse + if ( !iMouseInUse && !iVisibleMouse) + { + if (mouseactive) + { #ifdef _WIN32 - if ( !m_bRawInput ) - { - if ( !m_bMouseThread ) - { - GetCursorPos (¤t_pos); + if ( !m_bRawInput ) + { + if ( !m_bMouseThread ) + { + GetCursorPos (¤t_pos); - mx_accum += current_pos.x - gEngfuncs.GetWindowCenterX(); - my_accum += current_pos.y - gEngfuncs.GetWindowCenterY(); - } - } - else + mx_accum += current_pos.x - gEngfuncs.GetWindowCenterX(); + my_accum += current_pos.y - gEngfuncs.GetWindowCenterY(); + } + } + else #endif - { + { #ifdef USE_SDL2 - int deltaX, deltaY; - safe_pfnSDL_GetRelativeMouseState( &deltaX, &deltaY ); - mx_accum += deltaX; - my_accum += deltaY; + int deltaX, deltaY; + safe_pfnSDL_GetRelativeMouseState( &deltaX, &deltaY ); + mx_accum += deltaX; + my_accum += deltaY; #else - GetCursorPos (¤t_pos); + GetCursorPos (¤t_pos); - mx_accum += current_pos.x - gEngfuncs.GetWindowCenterX(); - my_accum += current_pos.y - gEngfuncs.GetWindowCenterY(); + mx_accum += current_pos.x - gEngfuncs.GetWindowCenterX(); + my_accum += current_pos.y - gEngfuncs.GetWindowCenterY(); #endif - } + } - // force the mouse to the center, so there's room to move + // force the mouse to the center, so there's room to move #ifdef _WIN32 - // do not reset if mousethread would do it: - if ( m_bRawInput || !m_bMouseThread ) + // do not reset if mousethread would do it: + if ( m_bRawInput || !m_bMouseThread ) #else - if(true) + if(true) #endif - IN_ResetMouse(); + IN_ResetMouse(); - } - } + } + } } @@ -955,12 +976,12 @@ IN_ClearStates */ void GoldSourceInput::IN_ClearStates (void) { - if ( !mouseactive ) - return; + if ( !mouseactive ) + return; - mx_accum = 0; - my_accum = 0; - mouse_oldbuttonstate = 0; + mx_accum = 0; + my_accum = 0; + mouse_oldbuttonstate = 0; } /* @@ -970,136 +991,136 @@ IN_StartupJoystick */ void IN_StartupJoystick (void) { - // abort startup if user requests no joystick - if ( gEngfuncs.CheckParm ("-nojoy", NULL ) ) - return; + // abort startup if user requests no joystick + if ( gEngfuncs.CheckParm ("-nojoy", NULL ) ) + return; - // assume no joystick - joy_avail = 0; + // assume no joystick + joy_avail = 0; #ifdef USE_SDL2 - int nJoysticks = safe_pfnSDL_NumJoysticks(); - if ( nJoysticks > 0 ) - { - for ( int i = 0; i < nJoysticks; i++ ) - { - if ( safe_pfnSDL_IsGameController( i ) ) - { - s_pJoystick = safe_pfnSDL_GameControllerOpen( i ); - if ( s_pJoystick ) - { - //save the joystick's number of buttons and POV status - joy_numbuttons = SDL_CONTROLLER_BUTTON_MAX; - joy_haspov = 0; + int nJoysticks = safe_pfnSDL_NumJoysticks(); + if ( nJoysticks > 0 ) + { + for ( int i = 0; i < nJoysticks; i++ ) + { + if ( safe_pfnSDL_IsGameController( i ) ) + { + s_pJoystick = safe_pfnSDL_GameControllerOpen( i ); + if ( s_pJoystick ) + { + //save the joystick's number of buttons and POV status + joy_numbuttons = SDL_CONTROLLER_BUTTON_MAX; + joy_haspov = 0; - // old button and POV states default to no buttons pressed - joy_oldbuttonstate = joy_oldpovstate = 0; + // old button and POV states default to no buttons pressed + joy_oldbuttonstate = joy_oldpovstate = 0; - // mark the joystick as available and advanced initialization not completed - // this is needed as cvars are not available during initialization - gEngfuncs.Con_Printf ("joystick found\n\n", safe_pfnSDL_GameControllerName(s_pJoystick)); - joy_avail = 1; - joy_advancedinit = 0; - break; - } - } - } - } - else - { - gEngfuncs.Con_DPrintf ("joystick not found -- driver not present\n\n"); - } + // mark the joystick as available and advanced initialization not completed + // this is needed as cvars are not available during initialization + gEngfuncs.Con_Printf ("joystick found\n\n", safe_pfnSDL_GameControllerName(s_pJoystick)); + joy_avail = 1; + joy_advancedinit = 0; + break; + } + } + } + } + else + { + gEngfuncs.Con_DPrintf ("joystick not found -- driver not present\n\n"); + } #elif defined(_WIN32) - int numdevs; - JOYCAPS jc; - MMRESULT mmr; - // verify joystick driver is present - if ((numdevs = joyGetNumDevs ()) == 0) - { - gEngfuncs.Con_DPrintf ("joystick not found -- driver not present\n\n"); - return; - } + int numdevs; + JOYCAPS jc; + MMRESULT mmr; + // verify joystick driver is present + if ((numdevs = joyGetNumDevs ()) == 0) + { + gEngfuncs.Con_DPrintf ("joystick not found -- driver not present\n\n"); + return; + } - // cycle through the joystick ids for the first valid one - for (joy_id=0 ; joy_id<numdevs ; joy_id++) - { - memset (&ji, 0, sizeof(ji)); - ji.dwSize = sizeof(ji); - ji.dwFlags = JOY_RETURNCENTERED; + // cycle through the joystick ids for the first valid one + for (joy_id=0 ; joy_id<numdevs ; joy_id++) + { + memset (&ji, 0, sizeof(ji)); + ji.dwSize = sizeof(ji); + ji.dwFlags = JOY_RETURNCENTERED; - if ((mmr = joyGetPosEx (joy_id, &ji)) == JOYERR_NOERROR) - break; - } + if ((mmr = joyGetPosEx (joy_id, &ji)) == JOYERR_NOERROR) + break; + } - // abort startup if we didn't find a valid joystick - if (mmr != JOYERR_NOERROR) - { - gEngfuncs.Con_DPrintf ("joystick not found -- no valid joysticks (%x)\n\n", mmr); - return; - } + // abort startup if we didn't find a valid joystick + if (mmr != JOYERR_NOERROR) + { + gEngfuncs.Con_DPrintf ("joystick not found -- no valid joysticks (%x)\n\n", mmr); + return; + } - // get the capabilities of the selected joystick - // abort startup if command fails - memset (&jc, 0, sizeof(jc)); - if ((mmr = joyGetDevCaps (joy_id, &jc, sizeof(jc))) != JOYERR_NOERROR) - { - gEngfuncs.Con_DPrintf ("joystick not found -- invalid joystick capabilities (%x)\n\n", mmr); - return; - } + // get the capabilities of the selected joystick + // abort startup if command fails + memset (&jc, 0, sizeof(jc)); + if ((mmr = joyGetDevCaps (joy_id, &jc, sizeof(jc))) != JOYERR_NOERROR) + { + gEngfuncs.Con_DPrintf ("joystick not found -- invalid joystick capabilities (%x)\n\n", mmr); + return; + } - // save the joystick's number of buttons and POV status - joy_numbuttons = jc.wNumButtons; - joy_haspov = jc.wCaps & JOYCAPS_HASPOV; + // save the joystick's number of buttons and POV status + joy_numbuttons = jc.wNumButtons; + joy_haspov = jc.wCaps & JOYCAPS_HASPOV; - // old button and POV states default to no buttons pressed - joy_oldbuttonstate = joy_oldpovstate = 0; + // old button and POV states default to no buttons pressed + joy_oldbuttonstate = joy_oldpovstate = 0; - // mark the joystick as available and advanced initialization not completed - // this is needed as cvars are not available during initialization - gEngfuncs.Con_Printf ("joystick found\n\n", mmr); - joy_avail = 1; - joy_advancedinit = 0; + // mark the joystick as available and advanced initialization not completed + // this is needed as cvars are not available during initialization + gEngfuncs.Con_Printf ("joystick found\n\n", mmr); + joy_avail = 1; + joy_advancedinit = 0; #else - gEngfuncs.Con_DPrintf ("joystick not found -- implement joystick without SDL2\n\n"); + gEngfuncs.Con_DPrintf ("joystick not found -- implement joystick without SDL2\n\n"); #endif } #ifdef USE_SDL2 int RawValuePointer (int axis) { - switch (axis) - { - default: - case JOY_AXIS_X: - return safe_pfnSDL_GameControllerGetAxis( s_pJoystick, SDL_CONTROLLER_AXIS_LEFTX ); - case JOY_AXIS_Y: - return safe_pfnSDL_GameControllerGetAxis( s_pJoystick, SDL_CONTROLLER_AXIS_LEFTY ); - case JOY_AXIS_Z: - return safe_pfnSDL_GameControllerGetAxis( s_pJoystick, SDL_CONTROLLER_AXIS_RIGHTX ); - case JOY_AXIS_R: - return safe_pfnSDL_GameControllerGetAxis( s_pJoystick, SDL_CONTROLLER_AXIS_RIGHTY ); + switch (axis) + { + default: + case JOY_AXIS_X: + return safe_pfnSDL_GameControllerGetAxis( s_pJoystick, SDL_CONTROLLER_AXIS_LEFTX ); + case JOY_AXIS_Y: + return safe_pfnSDL_GameControllerGetAxis( s_pJoystick, SDL_CONTROLLER_AXIS_LEFTY ); + case JOY_AXIS_Z: + return safe_pfnSDL_GameControllerGetAxis( s_pJoystick, SDL_CONTROLLER_AXIS_RIGHTX ); + case JOY_AXIS_R: + return safe_pfnSDL_GameControllerGetAxis( s_pJoystick, SDL_CONTROLLER_AXIS_RIGHTY ); - } + } } #elif defined(_WIN32) PDWORD RawValuePointer (int axis) { - switch (axis) - { - case JOY_AXIS_X: - return &ji.dwXpos; - case JOY_AXIS_Y: - return &ji.dwYpos; - case JOY_AXIS_Z: - return &ji.dwZpos; - case JOY_AXIS_R: - return &ji.dwRpos; - case JOY_AXIS_U: - return &ji.dwUpos; - case JOY_AXIS_V: - return &ji.dwVpos; - } - // FIX: need to do some kind of error - return &ji.dwXpos; + switch (axis) + { + case JOY_AXIS_X: + return &ji.dwXpos; + case JOY_AXIS_Y: + return &ji.dwYpos; + case JOY_AXIS_Z: + return &ji.dwZpos; + case JOY_AXIS_R: + return &ji.dwRpos; + case JOY_AXIS_U: + return &ji.dwUpos; + case JOY_AXIS_V: + return &ji.dwVpos; + } + // FIX: need to do some kind of error + return &ji.dwXpos; } #endif @@ -1111,68 +1132,68 @@ Joy_AdvancedUpdate_f void Joy_AdvancedUpdate_f (void) { - // called once by IN_ReadJoystick and by user whenever an update is needed - // cvars are now available - int i; - DWORD dwTemp; + // called once by IN_ReadJoystick and by user whenever an update is needed + // cvars are now available + int i; + DWORD dwTemp; - // initialize all the maps - for (i = 0; i < JOY_MAX_AXES; i++) - { - dwAxisMap[i] = AxisNada; - dwControlMap[i] = JOY_ABSOLUTE_AXIS; - pdwRawValue[i] = RawValuePointer(i); - } + // initialize all the maps + for (i = 0; i < JOY_MAX_AXES; i++) + { + dwAxisMap[i] = AxisNada; + dwControlMap[i] = JOY_ABSOLUTE_AXIS; + pdwRawValue[i] = RawValuePointer(i); + } - if( joy_advanced->value == 0.0) - { - // default joystick initialization - // 2 axes only with joystick control - dwAxisMap[JOY_AXIS_X] = AxisTurn; - // dwControlMap[JOY_AXIS_X] = JOY_ABSOLUTE_AXIS; - dwAxisMap[JOY_AXIS_Y] = AxisForward; - // dwControlMap[JOY_AXIS_Y] = JOY_ABSOLUTE_AXIS; - } - else - { - if ( strcmp ( joy_name->string, "joystick") != 0 ) - { - // notify user of advanced controller - gEngfuncs.Con_Printf ("\n%s configured\n\n", joy_name->string); - } + if( joy_advanced->value == 0.0) + { + // default joystick initialization + // 2 axes only with joystick control + dwAxisMap[JOY_AXIS_X] = AxisTurn; + // dwControlMap[JOY_AXIS_X] = JOY_ABSOLUTE_AXIS; + dwAxisMap[JOY_AXIS_Y] = AxisForward; + // dwControlMap[JOY_AXIS_Y] = JOY_ABSOLUTE_AXIS; + } + else + { + if ( strcmp ( joy_name->string, "joystick") != 0 ) + { + // notify user of advanced controller + gEngfuncs.Con_Printf ("\n%s configured\n\n", joy_name->string); + } - // advanced initialization here - // data supplied by user via joy_axisn cvars - dwTemp = (DWORD) joy_advaxisx->value; - dwAxisMap[JOY_AXIS_X] = dwTemp & 0x0000000f; - dwControlMap[JOY_AXIS_X] = dwTemp & JOY_RELATIVE_AXIS; - dwTemp = (DWORD) joy_advaxisy->value; - dwAxisMap[JOY_AXIS_Y] = dwTemp & 0x0000000f; - dwControlMap[JOY_AXIS_Y] = dwTemp & JOY_RELATIVE_AXIS; - dwTemp = (DWORD) joy_advaxisz->value; - dwAxisMap[JOY_AXIS_Z] = dwTemp & 0x0000000f; - dwControlMap[JOY_AXIS_Z] = dwTemp & JOY_RELATIVE_AXIS; - dwTemp = (DWORD) joy_advaxisr->value; - dwAxisMap[JOY_AXIS_R] = dwTemp & 0x0000000f; - dwControlMap[JOY_AXIS_R] = dwTemp & JOY_RELATIVE_AXIS; - dwTemp = (DWORD) joy_advaxisu->value; - dwAxisMap[JOY_AXIS_U] = dwTemp & 0x0000000f; - dwControlMap[JOY_AXIS_U] = dwTemp & JOY_RELATIVE_AXIS; - dwTemp = (DWORD) joy_advaxisv->value; - dwAxisMap[JOY_AXIS_V] = dwTemp & 0x0000000f; - dwControlMap[JOY_AXIS_V] = dwTemp & JOY_RELATIVE_AXIS; - } + // advanced initialization here + // data supplied by user via joy_axisn cvars + dwTemp = (DWORD) joy_advaxisx->value; + dwAxisMap[JOY_AXIS_X] = dwTemp & 0x0000000f; + dwControlMap[JOY_AXIS_X] = dwTemp & JOY_RELATIVE_AXIS; + dwTemp = (DWORD) joy_advaxisy->value; + dwAxisMap[JOY_AXIS_Y] = dwTemp & 0x0000000f; + dwControlMap[JOY_AXIS_Y] = dwTemp & JOY_RELATIVE_AXIS; + dwTemp = (DWORD) joy_advaxisz->value; + dwAxisMap[JOY_AXIS_Z] = dwTemp & 0x0000000f; + dwControlMap[JOY_AXIS_Z] = dwTemp & JOY_RELATIVE_AXIS; + dwTemp = (DWORD) joy_advaxisr->value; + dwAxisMap[JOY_AXIS_R] = dwTemp & 0x0000000f; + dwControlMap[JOY_AXIS_R] = dwTemp & JOY_RELATIVE_AXIS; + dwTemp = (DWORD) joy_advaxisu->value; + dwAxisMap[JOY_AXIS_U] = dwTemp & 0x0000000f; + dwControlMap[JOY_AXIS_U] = dwTemp & JOY_RELATIVE_AXIS; + dwTemp = (DWORD) joy_advaxisv->value; + dwAxisMap[JOY_AXIS_V] = dwTemp & 0x0000000f; + dwControlMap[JOY_AXIS_V] = dwTemp & JOY_RELATIVE_AXIS; + } #if !defined(USE_SDL2) && defined(_WIN32) - // compute the axes to collect from DirectInput - joy_flags = JOY_RETURNCENTERED | JOY_RETURNBUTTONS | JOY_RETURNPOV; - for (i = 0; i < JOY_MAX_AXES; i++) - { - if (dwAxisMap[i] != AxisNada) - { - joy_flags |= dwAxisFlags[i]; - } - } + // compute the axes to collect from DirectInput + joy_flags = JOY_RETURNCENTERED | JOY_RETURNBUTTONS | JOY_RETURNPOV; + for (i = 0; i < JOY_MAX_AXES; i++) + { + if (dwAxisMap[i] != AxisNada) + { + joy_flags |= dwAxisFlags[i]; + } + } #endif } @@ -1184,85 +1205,85 @@ IN_Commands */ void GoldSourceInput::IN_Commands (void) { - int i, key_index; + int i, key_index; - if (!joy_avail) - { - return; - } + if (!joy_avail) + { + return; + } - DWORD buttonstate, povstate; + DWORD buttonstate, povstate; - // loop through the joystick buttons - // key a joystick event or auxillary event for higher number buttons for each state change + // loop through the joystick buttons + // key a joystick event or auxillary event for higher number buttons for each state change #ifdef USE_SDL2 - buttonstate = 0; - for ( i = 0; i < SDL_CONTROLLER_BUTTON_MAX; i++ ) - { - if ( safe_pfnSDL_GameControllerGetButton( s_pJoystick, (SDL_GameControllerButton)i ) ) - { - buttonstate |= 1<<i; - } - } + buttonstate = 0; + for ( i = 0; i < SDL_CONTROLLER_BUTTON_MAX; i++ ) + { + if ( safe_pfnSDL_GameControllerGetButton( s_pJoystick, (SDL_GameControllerButton)i ) ) + { + buttonstate |= 1<<i; + } + } - for (i = 0; i < JOY_MAX_AXES; i++) - { - pdwRawValue[i] = RawValuePointer(i); - } + for (i = 0; i < JOY_MAX_AXES; i++) + { + pdwRawValue[i] = RawValuePointer(i); + } #elif defined(_WIN32) - buttonstate = ji.dwButtons; + buttonstate = ji.dwButtons; #endif - for (i=0 ; i < (int)joy_numbuttons ; i++) - { - if ( (buttonstate & (1<<i)) && !(joy_oldbuttonstate & (1<<i)) ) - { - key_index = (i < 4) ? K_JOY1 : K_AUX1; - gEngfuncs.Key_Event (key_index + i, 1); - } + for (i=0 ; i < (int)joy_numbuttons ; i++) + { + if ( (buttonstate & (1<<i)) && !(joy_oldbuttonstate & (1<<i)) ) + { + key_index = (i < 4) ? K_JOY1 : K_AUX1; + gEngfuncs.Key_Event (key_index + i, 1); + } - if ( !(buttonstate & (1<<i)) && (joy_oldbuttonstate & (1<<i)) ) - { - key_index = (i < 4) ? K_JOY1 : K_AUX1; - gEngfuncs.Key_Event (key_index + i, 0); - } - } - joy_oldbuttonstate = buttonstate; + if ( !(buttonstate & (1<<i)) && (joy_oldbuttonstate & (1<<i)) ) + { + key_index = (i < 4) ? K_JOY1 : K_AUX1; + gEngfuncs.Key_Event (key_index + i, 0); + } + } + joy_oldbuttonstate = buttonstate; - if (joy_haspov) - { - // convert POV information into 4 bits of state information - // this avoids any potential problems related to moving from one - // direction to another without going through the center position - povstate = 0; + if (joy_haspov) + { + // convert POV information into 4 bits of state information + // this avoids any potential problems related to moving from one + // direction to another without going through the center position + povstate = 0; #if !defined(USE_SDL2) && defined(_WIN32) - if(ji.dwPOV != JOY_POVCENTERED) - { - if (ji.dwPOV == JOY_POVFORWARD) - povstate |= 0x01; - if (ji.dwPOV == JOY_POVRIGHT) - povstate |= 0x02; - if (ji.dwPOV == JOY_POVBACKWARD) - povstate |= 0x04; - if (ji.dwPOV == JOY_POVLEFT) - povstate |= 0x08; - } + if(ji.dwPOV != JOY_POVCENTERED) + { + if (ji.dwPOV == JOY_POVFORWARD) + povstate |= 0x01; + if (ji.dwPOV == JOY_POVRIGHT) + povstate |= 0x02; + if (ji.dwPOV == JOY_POVBACKWARD) + povstate |= 0x04; + if (ji.dwPOV == JOY_POVLEFT) + povstate |= 0x08; + } #endif - // determine which bits have changed and key an auxillary event for each change - for (i=0 ; i < 4 ; i++) - { - if ( (povstate & (1<<i)) && !(joy_oldpovstate & (1<<i)) ) - { - gEngfuncs.Key_Event (K_AUX29 + i, 1); - } + // determine which bits have changed and key an auxillary event for each change + for (i=0 ; i < 4 ; i++) + { + if ( (povstate & (1<<i)) && !(joy_oldpovstate & (1<<i)) ) + { + gEngfuncs.Key_Event (K_AUX29 + i, 1); + } - if ( !(povstate & (1<<i)) && (joy_oldpovstate & (1<<i)) ) - { - gEngfuncs.Key_Event (K_AUX29 + i, 0); - } - } - joy_oldpovstate = povstate; - } + if ( !(povstate & (1<<i)) && (joy_oldpovstate & (1<<i)) ) + { + gEngfuncs.Key_Event (K_AUX29 + i, 0); + } + } + joy_oldpovstate = povstate; + } } @@ -1274,35 +1295,35 @@ IN_ReadJoystick int IN_ReadJoystick (void) { #ifdef USE_SDL2 - safe_pfnSDL_JoystickUpdate(); - return 1; + safe_pfnSDL_JoystickUpdate(); + return 1; #elif defined(_WIN32) - memset (&ji, 0, sizeof(ji)); - ji.dwSize = sizeof(ji); - ji.dwFlags = joy_flags; + memset (&ji, 0, sizeof(ji)); + ji.dwSize = sizeof(ji); + ji.dwFlags = joy_flags; - if (joyGetPosEx (joy_id, &ji) == JOYERR_NOERROR) - { - // this is a hack -- there is a bug in the Logitech WingMan Warrior DirectInput Driver - // rather than having 32768 be the zero point, they have the zero point at 32668 - // go figure -- anyway, now we get the full resolution out of the device - if (joy_wwhack1->value != 0.0) - { - ji.dwUpos += 100; - } - return 1; - } - else - { - // read error occurred - // turning off the joystick seems too harsh for 1 read error,\ - // but what should be done? - // Con_Printf ("IN_ReadJoystick: no response\n"); - // joy_avail = 0; - return 0; - } + if (joyGetPosEx (joy_id, &ji) == JOYERR_NOERROR) + { + // this is a hack -- there is a bug in the Logitech WingMan Warrior DirectInput Driver + // rather than having 32768 be the zero point, they have the zero point at 32668 + // go figure -- anyway, now we get the full resolution out of the device + if (joy_wwhack1->value != 0.0) + { + ji.dwUpos += 100; + } + return 1; + } + else + { + // read error occurred + // turning off the joystick seems too harsh for 1 read error,\ + // but what should be done? + // Con_Printf ("IN_ReadJoystick: no response\n"); + // joy_avail = 0; + return 0; + } #else - return 0; + return 0; #endif } @@ -1314,189 +1335,189 @@ IN_JoyMove */ void IN_JoyMove ( float frametime, usercmd_t *cmd ) { - float speed, aspeed; - float fAxisValue, fTemp; - int i; - vec3_t viewangles; + float speed, aspeed; + float fAxisValue, fTemp; + int i; + vec3_t viewangles; - gEngfuncs.GetViewAngles( (float *)viewangles ); + gEngfuncs.GetViewAngles( (float *)viewangles ); - // complete initialization if first time in - // this is needed as cvars are not available at initialization time - if( joy_advancedinit != 1 ) - { - Joy_AdvancedUpdate_f(); - joy_advancedinit = 1; - } + // complete initialization if first time in + // this is needed as cvars are not available at initialization time + if( joy_advancedinit != 1 ) + { + Joy_AdvancedUpdate_f(); + joy_advancedinit = 1; + } - // verify joystick is available and that the user wants to use it - if (!joy_avail || !in_joystick->value) - { - return; - } + // verify joystick is available and that the user wants to use it + if (!joy_avail || !in_joystick->value) + { + return; + } - // collect the joystick data, if possible - if (IN_ReadJoystick () != 1) - { - return; - } + // collect the joystick data, if possible + if (IN_ReadJoystick () != 1) + { + return; + } - if (in_speed.state & 1) - speed = cl_movespeedkey->value; - else - speed = 1; + if (in_speed.state & 1) + speed = cl_movespeedkey->value; + else + speed = 1; - aspeed = speed * frametime; + aspeed = speed * frametime; - // loop through the axes - for (i = 0; i < JOY_MAX_AXES; i++) - { - // get the floating point zero-centered, potentially-inverted data for the current axis + // loop through the axes + for (i = 0; i < JOY_MAX_AXES; i++) + { + // get the floating point zero-centered, potentially-inverted data for the current axis #ifdef USE_SDL2 - fAxisValue = (float)pdwRawValue[i]; + fAxisValue = (float)pdwRawValue[i]; #elif defined(_WIN32) - fAxisValue = (float) *pdwRawValue[i]; - fAxisValue -= 32768.0; + fAxisValue = (float) *pdwRawValue[i]; + fAxisValue -= 32768.0; #endif - if (joy_wwhack2->value != 0.0) - { - if (dwAxisMap[i] == AxisTurn) - { - // this is a special formula for the Logitech WingMan Warrior - // y=ax^b; where a = 300 and b = 1.3 - // also x values are in increments of 800 (so this is factored out) - // then bounds check result to level out excessively high spin rates - fTemp = 300.0 * pow(fabs(fAxisValue) / 800.0, 1.3); - if (fTemp > 14000.0) - fTemp = 14000.0; - // restore direction information - fAxisValue = (fAxisValue > 0.0) ? fTemp : -fTemp; - } - } + if (joy_wwhack2->value != 0.0) + { + if (dwAxisMap[i] == AxisTurn) + { + // this is a special formula for the Logitech WingMan Warrior + // y=ax^b; where a = 300 and b = 1.3 + // also x values are in increments of 800 (so this is factored out) + // then bounds check result to level out excessively high spin rates + fTemp = 300.0 * pow(fabs(fAxisValue) / 800.0, 1.3); + if (fTemp > 14000.0) + fTemp = 14000.0; + // restore direction information + fAxisValue = (fAxisValue > 0.0) ? fTemp : -fTemp; + } + } - // convert range from -32768..32767 to -1..1 - fAxisValue /= 32768.0; + // convert range from -32768..32767 to -1..1 + fAxisValue /= 32768.0; - switch (dwAxisMap[i]) - { - case AxisForward: - if ((joy_advanced->value == 0.0) && (in_jlook.state & 1)) - { - // user wants forward control to become look control - if (fabs(fAxisValue) > joy_pitchthreshold->value) - { - // if mouse invert is on, invert the joystick pitch value - // only absolute control support here (joy_advanced is 0) - if (m_pitch->value < 0.0) - { - viewangles[PITCH] -= (fAxisValue * joy_pitchsensitivity->value) * aspeed * cl_pitchspeed->value; - } - else - { - viewangles[PITCH] += (fAxisValue * joy_pitchsensitivity->value) * aspeed * cl_pitchspeed->value; - } - V_StopPitchDrift(); - } - else - { - // no pitch movement - // disable pitch return-to-center unless requested by user - // *** this code can be removed when the lookspring bug is fixed - // *** the bug always has the lookspring feature on - if(lookspring->value == 0.0) - { - V_StopPitchDrift(); - } - } - } - else - { - // user wants forward control to be forward control - if (fabs(fAxisValue) > joy_forwardthreshold->value) - { - cmd->forwardmove += (fAxisValue * joy_forwardsensitivity->value) * speed * cl_forwardspeed->value; - } - } - break; + switch (dwAxisMap[i]) + { + case AxisForward: + if ((joy_advanced->value == 0.0) && (in_jlook.state & 1)) + { + // user wants forward control to become look control + if (fabs(fAxisValue) > joy_pitchthreshold->value) + { + // if mouse invert is on, invert the joystick pitch value + // only absolute control support here (joy_advanced is 0) + if (m_pitch->value < 0.0) + { + viewangles[PITCH] -= (fAxisValue * joy_pitchsensitivity->value) * aspeed * cl_pitchspeed->value; + } + else + { + viewangles[PITCH] += (fAxisValue * joy_pitchsensitivity->value) * aspeed * cl_pitchspeed->value; + } + V_StopPitchDrift(); + } + else + { + // no pitch movement + // disable pitch return-to-center unless requested by user + // *** this code can be removed when the lookspring bug is fixed + // *** the bug always has the lookspring feature on + if(lookspring->value == 0.0) + { + V_StopPitchDrift(); + } + } + } + else + { + // user wants forward control to be forward control + if (fabs(fAxisValue) > joy_forwardthreshold->value) + { + cmd->forwardmove += (fAxisValue * joy_forwardsensitivity->value) * speed * cl_forwardspeed->value; + } + } + break; - case AxisSide: - if (fabs(fAxisValue) > joy_sidethreshold->value) - { - cmd->sidemove += (fAxisValue * joy_sidesensitivity->value) * speed * cl_sidespeed->value; - } - break; + case AxisSide: + if (fabs(fAxisValue) > joy_sidethreshold->value) + { + cmd->sidemove += (fAxisValue * joy_sidesensitivity->value) * speed * cl_sidespeed->value; + } + break; - case AxisTurn: - if ((in_strafe.state & 1) || (lookstrafe->value && (in_jlook.state & 1))) - { - // user wants turn control to become side control - if (fabs(fAxisValue) > joy_sidethreshold->value) - { - cmd->sidemove -= (fAxisValue * joy_sidesensitivity->value) * speed * cl_sidespeed->value; - } - } - else - { - // user wants turn control to be turn control - if (fabs(fAxisValue) > joy_yawthreshold->value) - { - if(dwControlMap[i] == JOY_ABSOLUTE_AXIS) - { - viewangles[YAW] += (fAxisValue * joy_yawsensitivity->value) * aspeed * cl_yawspeed->value; - } - else - { - viewangles[YAW] += (fAxisValue * joy_yawsensitivity->value) * speed * 180.0; - } + case AxisTurn: + if ((in_strafe.state & 1) || (lookstrafe->value && (in_jlook.state & 1))) + { + // user wants turn control to become side control + if (fabs(fAxisValue) > joy_sidethreshold->value) + { + cmd->sidemove -= (fAxisValue * joy_sidesensitivity->value) * speed * cl_sidespeed->value; + } + } + else + { + // user wants turn control to be turn control + if (fabs(fAxisValue) > joy_yawthreshold->value) + { + if(dwControlMap[i] == JOY_ABSOLUTE_AXIS) + { + viewangles[YAW] += (fAxisValue * joy_yawsensitivity->value) * aspeed * cl_yawspeed->value; + } + else + { + viewangles[YAW] += (fAxisValue * joy_yawsensitivity->value) * speed * 180.0; + } - } - } - break; + } + } + break; - case AxisLook: - if (in_jlook.state & 1) - { - if (fabs(fAxisValue) > joy_pitchthreshold->value) - { - // pitch movement detected and pitch movement desired by user - if(dwControlMap[i] == JOY_ABSOLUTE_AXIS) - { - viewangles[PITCH] += (fAxisValue * joy_pitchsensitivity->value) * aspeed * cl_pitchspeed->value; - } - else - { - viewangles[PITCH] += (fAxisValue * joy_pitchsensitivity->value) * speed * 180.0; - } - V_StopPitchDrift(); - } - else - { - // no pitch movement - // disable pitch return-to-center unless requested by user - // *** this code can be removed when the lookspring bug is fixed - // *** the bug always has the lookspring feature on - if( lookspring->value == 0.0 ) - { - V_StopPitchDrift(); - } - } - } - break; + case AxisLook: + if (in_jlook.state & 1) + { + if (fabs(fAxisValue) > joy_pitchthreshold->value) + { + // pitch movement detected and pitch movement desired by user + if(dwControlMap[i] == JOY_ABSOLUTE_AXIS) + { + viewangles[PITCH] += (fAxisValue * joy_pitchsensitivity->value) * aspeed * cl_pitchspeed->value; + } + else + { + viewangles[PITCH] += (fAxisValue * joy_pitchsensitivity->value) * speed * 180.0; + } + V_StopPitchDrift(); + } + else + { + // no pitch movement + // disable pitch return-to-center unless requested by user + // *** this code can be removed when the lookspring bug is fixed + // *** the bug always has the lookspring feature on + if( lookspring->value == 0.0 ) + { + V_StopPitchDrift(); + } + } + } + break; - default: - break; - } - } + default: + break; + } + } - // bounds check pitch - if (viewangles[PITCH] > cl_pitchdown->value) - viewangles[PITCH] = cl_pitchdown->value; - if (viewangles[PITCH] < -cl_pitchup->value) - viewangles[PITCH] = -cl_pitchup->value; + // bounds check pitch + if (viewangles[PITCH] > cl_pitchdown->value) + viewangles[PITCH] = cl_pitchdown->value; + if (viewangles[PITCH] < -cl_pitchup->value) + viewangles[PITCH] = -cl_pitchup->value; - gEngfuncs.SetViewAngles( (float *)viewangles ); + gEngfuncs.SetViewAngles( (float *)viewangles ); } /* @@ -1506,12 +1527,12 @@ IN_Move */ void GoldSourceInput::IN_Move ( float frametime, usercmd_t *cmd) { - if ( !iMouseInUse && mouseactive ) - { - IN_MouseMove ( frametime, cmd); - } + if ( !iMouseInUse && mouseactive ) + { + IN_MouseMove ( frametime, cmd); + } - IN_JoyMove ( frametime, cmd); + IN_JoyMove ( frametime, cmd); } /* @@ -1521,62 +1542,62 @@ IN_Init */ void GoldSourceInput::IN_Init (void) { - m_filter = gEngfuncs.pfnRegisterVariable ( "m_filter","0", FCVAR_ARCHIVE ); - sensitivity = gEngfuncs.pfnRegisterVariable ( "sensitivity","3", FCVAR_ARCHIVE ); // user mouse sensitivity setting. + m_filter = gEngfuncs.pfnRegisterVariable ( "m_filter","0", FCVAR_ARCHIVE ); + sensitivity = gEngfuncs.pfnRegisterVariable ( "sensitivity","3", FCVAR_ARCHIVE ); // user mouse sensitivity setting. - in_joystick = gEngfuncs.pfnRegisterVariable ( "joystick","0", FCVAR_ARCHIVE ); - joy_name = gEngfuncs.pfnRegisterVariable ( "joyname", "joystick", 0 ); - joy_advanced = gEngfuncs.pfnRegisterVariable ( "joyadvanced", "0", 0 ); - joy_advaxisx = gEngfuncs.pfnRegisterVariable ( "joyadvaxisx", "0", 0 ); - joy_advaxisy = gEngfuncs.pfnRegisterVariable ( "joyadvaxisy", "0", 0 ); - joy_advaxisz = gEngfuncs.pfnRegisterVariable ( "joyadvaxisz", "0", 0 ); - joy_advaxisr = gEngfuncs.pfnRegisterVariable ( "joyadvaxisr", "0", 0 ); - joy_advaxisu = gEngfuncs.pfnRegisterVariable ( "joyadvaxisu", "0", 0 ); - joy_advaxisv = gEngfuncs.pfnRegisterVariable ( "joyadvaxisv", "0", 0 ); - joy_forwardthreshold = gEngfuncs.pfnRegisterVariable ( "joyforwardthreshold", "0.15", 0 ); - joy_sidethreshold = gEngfuncs.pfnRegisterVariable ( "joysidethreshold", "0.15", 0 ); - joy_pitchthreshold = gEngfuncs.pfnRegisterVariable ( "joypitchthreshold", "0.15", 0 ); - joy_yawthreshold = gEngfuncs.pfnRegisterVariable ( "joyyawthreshold", "0.15", 0 ); - joy_forwardsensitivity = gEngfuncs.pfnRegisterVariable ( "joyforwardsensitivity", "-1.0", 0 ); - joy_sidesensitivity = gEngfuncs.pfnRegisterVariable ( "joysidesensitivity", "-1.0", 0 ); - joy_pitchsensitivity = gEngfuncs.pfnRegisterVariable ( "joypitchsensitivity", "1.0", 0 ); - joy_yawsensitivity = gEngfuncs.pfnRegisterVariable ( "joyyawsensitivity", "-1.0", 0 ); - joy_wwhack1 = gEngfuncs.pfnRegisterVariable ( "joywwhack1", "0.0", 0 ); - joy_wwhack2 = gEngfuncs.pfnRegisterVariable ( "joywwhack2", "0.0", 0 ); + in_joystick = gEngfuncs.pfnRegisterVariable ( "joystick","0", FCVAR_ARCHIVE ); + joy_name = gEngfuncs.pfnRegisterVariable ( "joyname", "joystick", 0 ); + joy_advanced = gEngfuncs.pfnRegisterVariable ( "joyadvanced", "0", 0 ); + joy_advaxisx = gEngfuncs.pfnRegisterVariable ( "joyadvaxisx", "0", 0 ); + joy_advaxisy = gEngfuncs.pfnRegisterVariable ( "joyadvaxisy", "0", 0 ); + joy_advaxisz = gEngfuncs.pfnRegisterVariable ( "joyadvaxisz", "0", 0 ); + joy_advaxisr = gEngfuncs.pfnRegisterVariable ( "joyadvaxisr", "0", 0 ); + joy_advaxisu = gEngfuncs.pfnRegisterVariable ( "joyadvaxisu", "0", 0 ); + joy_advaxisv = gEngfuncs.pfnRegisterVariable ( "joyadvaxisv", "0", 0 ); + joy_forwardthreshold = gEngfuncs.pfnRegisterVariable ( "joyforwardthreshold", "0.15", 0 ); + joy_sidethreshold = gEngfuncs.pfnRegisterVariable ( "joysidethreshold", "0.15", 0 ); + joy_pitchthreshold = gEngfuncs.pfnRegisterVariable ( "joypitchthreshold", "0.15", 0 ); + joy_yawthreshold = gEngfuncs.pfnRegisterVariable ( "joyyawthreshold", "0.15", 0 ); + joy_forwardsensitivity = gEngfuncs.pfnRegisterVariable ( "joyforwardsensitivity", "-1.0", 0 ); + joy_sidesensitivity = gEngfuncs.pfnRegisterVariable ( "joysidesensitivity", "-1.0", 0 ); + joy_pitchsensitivity = gEngfuncs.pfnRegisterVariable ( "joypitchsensitivity", "1.0", 0 ); + joy_yawsensitivity = gEngfuncs.pfnRegisterVariable ( "joyyawsensitivity", "-1.0", 0 ); + joy_wwhack1 = gEngfuncs.pfnRegisterVariable ( "joywwhack1", "0.0", 0 ); + joy_wwhack2 = gEngfuncs.pfnRegisterVariable ( "joywwhack2", "0.0", 0 ); - m_customaccel = gEngfuncs.pfnRegisterVariable ( "m_customaccel", "0", FCVAR_ARCHIVE ); - m_customaccel_scale = gEngfuncs.pfnRegisterVariable ( "m_customaccel_scale", "0.04", FCVAR_ARCHIVE ); - m_customaccel_max = gEngfuncs.pfnRegisterVariable ( "m_customaccel_max", "0", FCVAR_ARCHIVE ); - m_customaccel_exponent = gEngfuncs.pfnRegisterVariable ( "m_customaccel_exponent", "1", FCVAR_ARCHIVE ); + m_customaccel = gEngfuncs.pfnRegisterVariable ( "m_customaccel", "0", FCVAR_ARCHIVE ); + m_customaccel_scale = gEngfuncs.pfnRegisterVariable ( "m_customaccel_scale", "0.04", FCVAR_ARCHIVE ); + m_customaccel_max = gEngfuncs.pfnRegisterVariable ( "m_customaccel_max", "0", FCVAR_ARCHIVE ); + m_customaccel_exponent = gEngfuncs.pfnRegisterVariable ( "m_customaccel_exponent", "1", FCVAR_ARCHIVE ); #ifdef _WIN32 - m_bRawInput = CVAR_GET_FLOAT( "m_rawinput" ) != 0; - m_bMouseThread = gEngfuncs.CheckParm ("-mousethread", NULL ) != NULL; - m_mousethread_sleep = gEngfuncs.pfnRegisterVariable ( "m_mousethread_sleep", "1", FCVAR_ARCHIVE ); // default to less than 1000 Hz + m_bRawInput = CVAR_GET_FLOAT( "m_rawinput" ) != 0; + m_bMouseThread = gEngfuncs.CheckParm ("-mousethread", NULL ) != NULL; + m_mousethread_sleep = gEngfuncs.pfnRegisterVariable ( "m_mousethread_sleep", "1", FCVAR_ARCHIVE ); // default to less than 1000 Hz - m_bMouseThread = m_bMouseThread && NULL != m_mousethread_sleep; + m_bMouseThread = m_bMouseThread && NULL != m_mousethread_sleep; - if (m_bMouseThread) - { - // init mouseThreadSleep: + if (m_bMouseThread) + { + // init mouseThreadSleep: #if 0 // _beginthreadex is not defined on VS 6? - InterlockedExchange(&mouseThreadSleep, (LONG)m_mousethread_sleep->value); + InterlockedExchange(&mouseThreadSleep, (LONG)m_mousethread_sleep->value); - s_hMouseQuitEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); - s_hMouseThreadActiveLock = CreateEvent( NULL, FALSE, TRUE, NULL ); - if ( s_hMouseQuitEvent && s_hMouseThreadActiveLock) - { - s_hMouseThread = (HANDLE)_beginthreadex( NULL, 0, MouseThread_Function, NULL, 0, &s_hMouseThreadId ); - } + s_hMouseQuitEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); + s_hMouseThreadActiveLock = CreateEvent( NULL, FALSE, TRUE, NULL ); + if ( s_hMouseQuitEvent && s_hMouseThreadActiveLock) + { + s_hMouseThread = (HANDLE)_beginthreadex( NULL, 0, MouseThread_Function, NULL, 0, &s_hMouseThreadId ); + } - m_bMouseThread = NULL != s_hMouseThread; + m_bMouseThread = NULL != s_hMouseThread; #else - m_bMouseThread = 0; + m_bMouseThread = 0; #endif - // at this early stage this won't print anything: - // gEngfuncs.Con_DPrintf ("Mouse thread %s.\n", m_bMouseThread ? "initalized" : "failed to initalize"); - } + // at this early stage this won't print anything: + // gEngfuncs.Con_DPrintf ("Mouse thread %s.\n", m_bMouseThread ? "initalized" : "failed to initalize"); + } #endif #ifdef USE_SDL2 @@ -1597,11 +1618,11 @@ void GoldSourceInput::IN_Init (void) gEngfuncs.Con_Printf("Could not load SDL2: %s\n", dlerror()); } #endif - gEngfuncs.pfnAddCommand ("force_centerview", Force_CenterView_f); - gEngfuncs.pfnAddCommand ("joyadvancedupdate", Joy_AdvancedUpdate_f); + gEngfuncs.pfnAddCommand ("force_centerview", Force_CenterView_f); + gEngfuncs.pfnAddCommand ("joyadvancedupdate", Joy_AdvancedUpdate_f); - IN_StartupMouse (); - IN_StartupJoystick (); + IN_StartupMouse (); + IN_StartupJoystick (); } #endif diff --git a/cl_dll/message.cpp b/cl_dll/message.cpp index ff8d97bf..bbd59d9a 100644 --- a/cl_dll/message.cpp +++ b/cl_dll/message.cpp @@ -240,7 +240,7 @@ void CHudMessage::MessageDrawScan( client_textmessage_t *pMessage, float time ) { int i, j, length, width; const char *pText; - unsigned char line[80]; + const char *pLineStart; pText = pMessage->pMessage; // Count lines @@ -278,22 +278,21 @@ void CHudMessage::MessageDrawScan( client_textmessage_t *pMessage, float time ) { m_parms.lineLength = 0; m_parms.width = 0; + pLineStart = pText; while( *pText && *pText != '\n' ) { unsigned char c = *pText; - line[m_parms.lineLength] = c; m_parms.width += gHUD.m_scrinfo.charWidths[c]; m_parms.lineLength++; pText++; } pText++; // Skip LF - line[m_parms.lineLength] = 0; m_parms.x = XPosition( pMessage->x, m_parms.width, m_parms.totalWidth ); for( j = 0; j < m_parms.lineLength; j++ ) { - m_parms.text = line[j]; + m_parms.text = pLineStart[j]; int next = m_parms.x + gHUD.m_scrinfo.charWidths[m_parms.text]; MessageScanNextChar(); diff --git a/cl_dll/scoreboard.cpp b/cl_dll/scoreboard.cpp index 5d52787c..d4bdecb8 100644 --- a/cl_dll/scoreboard.cpp +++ b/cl_dll/scoreboard.cpp @@ -108,7 +108,7 @@ We have a minimum width of 1-320 - we could have the field widths scale with it? int SCOREBOARD_WIDTH = 320; // Y positions -#define ROW_GAP 13 +#define ROW_GAP (gHUD.m_scrinfo.iCharHeight) #define ROW_RANGE_MIN 15 #define ROW_RANGE_MAX ( ScreenHeight - 50 ) diff --git a/cl_dll/wscript b/cl_dll/wscript new file mode 100644 index 00000000..d0bd0951 --- /dev/null +++ b/cl_dll/wscript @@ -0,0 +1,66 @@ +#! /usr/bin/env python +# encoding: utf-8 +# a1batross, mittorn, 2018 + +from waflib import Utils +import os + +def options(opt): + # stub + return + +def configure(conf): + if conf.env.GOLDSRC: + if conf.env.DEST_OS != 'win32': + conf.check_cc(lib='dl') + +def build(bld): + source = bld.path.parent.ant_glob([ + 'pm_shared/*.c', + 'dlls/crossbow.cpp', 'dlls/crowbar.cpp', 'dlls/egon.cpp', 'dlls/gauss.cpp', 'dlls/handgrenade.cpp', + 'dlls/hornetgun.cpp', 'dlls/mp5.cpp', 'dlls/python.cpp', 'dlls/rpg.cpp', 'dlls/satchel.cpp', + 'dlls/shotgun.cpp', 'dlls/squeakgrenade.cpp', 'dlls/tripmine.cpp', 'dlls/glock.cpp' + ]) + + source += bld.path.ant_glob(['hl/*.cpp']) + source += [ + 'ev_hldm.cpp', 'ammo.cpp', 'ammo_secondary.cpp', 'ammohistory.cpp', + 'battery.cpp', 'cdll_int.cpp', 'com_weapons.cpp', 'death.cpp', + 'demo.cpp', 'entity.cpp', 'ev_common.cpp', 'events.cpp', + 'flashlight.cpp', 'GameStudioModelRenderer.cpp', 'geiger.cpp', + 'health.cpp', 'hud.cpp', 'hud_msg.cpp', 'hud_redraw.cpp', + 'hud_spectator.cpp', 'hud_update.cpp', 'in_camera.cpp', + 'input.cpp', 'input_goldsource.cpp', 'input_mouse.cpp', + 'input_xash3d.cpp', 'menu.cpp', 'message.cpp', + 'overview.cpp', 'parsemsg.cpp', 'saytext.cpp', + 'status_icons.cpp', 'statusbar.cpp', 'studio_util.cpp', + 'StudioModelRenderer.cpp', 'text_message.cpp', 'train.cpp', + 'tri.cpp', 'util.cpp', 'view.cpp', 'scoreboard.cpp', 'MOTD.cpp' + ] + + includes = Utils.to_list('. hl/ ../dlls ../dlls/wpn_shared ../common ../engine ../pm_shared ../game_shared ../public ../utils/false_vgui/include') + + defines = ['CLIENT_DLL'] + if bld.env.GOLDSRC: + defines += ['GOLDSOURCE_SUPPORT'] + + libs = [] + if bld.env.GOLDSRC: + libs += ['DL'] + + if bld.env.DEST_OS2 not in ['android']: + install_path = os.path.join(bld.env.GAMEDIR, bld.env.CLIENT_DIR) + else: + install_path = bld.env.PREFIX + + bld.shlib( + source = source, + target = 'client', + features = 'c cxx', + includes = includes, + defines = defines, + use = libs, + install_path = install_path, + subsystem = bld.env.MSVC_SUBSYSTEM, + idx = 1 + ) diff --git a/dlls/CMakeLists.txt b/dlls/CMakeLists.txt index 9ff6e679..62e6c026 100644 --- a/dlls/CMakeLists.txt +++ b/dlls/CMakeLists.txt @@ -30,6 +30,7 @@ add_definitions(-DCLIENT_WEAPONS -DCROWBAR_IDLE_ANIM) if(NOT MSVC) add_compile_options(-fno-exceptions) # GCC/Clang flag add_compile_options(-Wno-invalid-offsetof) # GCC/Clang flag + add_compile_options(-fvisibility=hidden) # GCC/Clang flag add_definitions(-D_LINUX) # It seems enough for all non-Win32 systems add_definitions(-Dstricmp=strcasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf ) else() @@ -144,7 +145,7 @@ set (SVDLL_SOURCES ../pm_shared/pm_math.c ../pm_shared/pm_shared.c ) - + include_directories (. wpn_shared ../common ../engine ../pm_shared ../game_shared ../public) if(USE_VOICEMGR) diff --git a/dlls/bullsquid.cpp b/dlls/bullsquid.cpp index af3ab88a..8db94c25 100644 --- a/dlls/bullsquid.cpp +++ b/dlls/bullsquid.cpp @@ -398,7 +398,7 @@ BOOL CBullsquid::FValidateHintType( short sHint ) } } - ALERT( at_aiconsole, "Couldn't validate hint type" ); + ALERT( at_aiconsole, "Couldn't validate hint type\n" ); return FALSE; } diff --git a/dlls/client.cpp b/dlls/client.cpp index a555a980..9e42a442 100644 --- a/dlls/client.cpp +++ b/dlls/client.cpp @@ -51,6 +51,7 @@ extern int gmsgSayText; extern int gmsgBhopcap; extern cvar_t allow_spectators; +extern cvar_t multibyte_only; extern int g_teamplay; @@ -312,6 +313,10 @@ decodeFinishedMaybeCESU8: bool Q_UnicodeValidate( const char *pUTF8 ) { bool bError = false; + + if( !multibyte_only.value ) + return true; + while( *pUTF8 ) { unsigned int uVal; @@ -1157,8 +1162,8 @@ void SetupVisibility( edict_t *pViewEntity, edict_t *pClient, unsigned char **pv } } - *pvs = ENGINE_SET_PVS( (float *)&org ); - *pas = ENGINE_SET_PAS( (float *)&org ); + *pvs = ENGINE_SET_PVS( org ); + *pas = ENGINE_SET_PAS( org ); } #include "entity_state.h" diff --git a/dlls/compile.bat b/dlls/compile.bat index 53c4511b..f97806a5 100644 --- a/dlls/compile.bat +++ b/dlls/compile.bat @@ -8,105 +8,105 @@ echo -- Compiler is MSVC6 set XASH3DSRC=..\..\Xash3D_original set INCLUDES=-I../common -I../engine -I../pm_shared -I../game_shared -I../public -set SOURCES=agrunt.cpp^ - airtank.cpp^ - aflock.cpp^ - animating.cpp^ - animation.cpp^ - apache.cpp^ - barnacle.cpp^ - barney.cpp^ - bigmomma.cpp^ - bloater.cpp^ - bmodels.cpp^ - bullsquid.cpp^ - buttons.cpp^ - cbase.cpp^ - client.cpp^ - combat.cpp^ - controller.cpp^ - crossbow.cpp^ - crowbar.cpp^ - defaultai.cpp^ - doors.cpp^ - effects.cpp^ - egon.cpp^ - explode.cpp^ - flyingmonster.cpp^ - func_break.cpp^ - func_tank.cpp^ - game.cpp^ - gamerules.cpp^ - gargantua.cpp^ - gauss.cpp^ - genericmonster.cpp^ - ggrenade.cpp^ - globals.cpp^ - glock.cpp^ - gman.cpp^ - h_ai.cpp^ - h_battery.cpp^ - h_cine.cpp^ - h_cycler.cpp^ - h_export.cpp^ - handgrenade.cpp^ - hassassin.cpp^ - headcrab.cpp^ - healthkit.cpp^ - hgrunt.cpp^ - hornet.cpp^ - hornetgun.cpp^ - houndeye.cpp^ - ichthyosaur.cpp^ - islave.cpp^ - items.cpp^ - leech.cpp^ - lights.cpp^ - maprules.cpp^ - monstermaker.cpp^ - monsters.cpp^ - monsterstate.cpp^ - mortar.cpp^ - mp5.cpp^ - multiplay_gamerules.cpp^ - nihilanth.cpp^ - nodes.cpp^ - observer.cpp^ - osprey.cpp^ - pathcorner.cpp^ - plane.cpp^ - plats.cpp^ - player.cpp^ - playermonster.cpp^ - python.cpp^ - rat.cpp^ - roach.cpp^ - rpg.cpp^ - satchel.cpp^ - schedule.cpp^ - scientist.cpp^ - scripted.cpp^ - shotgun.cpp^ - singleplay_gamerules.cpp^ - skill.cpp^ - sound.cpp^ - soundent.cpp^ - spectator.cpp^ - squadmonster.cpp^ - squeakgrenade.cpp^ - subs.cpp^ - talkmonster.cpp^ - teamplay_gamerules.cpp^ - tempmonster.cpp^ - tentacle.cpp^ - triggers.cpp^ - tripmine.cpp^ - turret.cpp^ - util.cpp^ - weapons.cpp^ - world.cpp^ - xen.cpp^ - zombie.cpp^ +set SOURCES=agrunt.cpp ^ + airtank.cpp ^ + aflock.cpp ^ + animating.cpp ^ + animation.cpp ^ + apache.cpp ^ + barnacle.cpp ^ + barney.cpp ^ + bigmomma.cpp ^ + bloater.cpp ^ + bmodels.cpp ^ + bullsquid.cpp ^ + buttons.cpp ^ + cbase.cpp ^ + client.cpp ^ + combat.cpp ^ + controller.cpp ^ + crossbow.cpp ^ + crowbar.cpp ^ + defaultai.cpp ^ + doors.cpp ^ + effects.cpp ^ + egon.cpp ^ + explode.cpp ^ + flyingmonster.cpp ^ + func_break.cpp ^ + func_tank.cpp ^ + game.cpp ^ + gamerules.cpp ^ + gargantua.cpp ^ + gauss.cpp ^ + genericmonster.cpp ^ + ggrenade.cpp ^ + globals.cpp ^ + glock.cpp ^ + gman.cpp ^ + h_ai.cpp ^ + h_battery.cpp ^ + h_cine.cpp ^ + h_cycler.cpp ^ + h_export.cpp ^ + handgrenade.cpp ^ + hassassin.cpp ^ + headcrab.cpp ^ + healthkit.cpp ^ + hgrunt.cpp ^ + hornet.cpp ^ + hornetgun.cpp ^ + houndeye.cpp ^ + ichthyosaur.cpp ^ + islave.cpp ^ + items.cpp ^ + leech.cpp ^ + lights.cpp ^ + maprules.cpp ^ + monstermaker.cpp ^ + monsters.cpp ^ + monsterstate.cpp ^ + mortar.cpp ^ + mp5.cpp ^ + multiplay_gamerules.cpp ^ + nihilanth.cpp ^ + nodes.cpp ^ + observer.cpp ^ + osprey.cpp ^ + pathcorner.cpp ^ + plane.cpp ^ + plats.cpp ^ + player.cpp ^ + playermonster.cpp ^ + python.cpp ^ + rat.cpp ^ + roach.cpp ^ + rpg.cpp ^ + satchel.cpp ^ + schedule.cpp ^ + scientist.cpp ^ + scripted.cpp ^ + shotgun.cpp ^ + singleplay_gamerules.cpp ^ + skill.cpp ^ + sound.cpp ^ + soundent.cpp ^ + spectator.cpp ^ + squadmonster.cpp ^ + squeakgrenade.cpp ^ + subs.cpp ^ + talkmonster.cpp ^ + teamplay_gamerules.cpp ^ + tempmonster.cpp ^ + tentacle.cpp ^ + triggers.cpp ^ + tripmine.cpp ^ + turret.cpp ^ + util.cpp ^ + weapons.cpp ^ + world.cpp ^ + xen.cpp ^ + zombie.cpp ^ ../pm_shared/pm_debug.c ../pm_shared/pm_math.c ../pm_shared/pm_shared.c set DEFINES=/DCLIENT_WEAPONS /Dsnprintf=_snprintf /DNO_VOICEGAMEMGR set LIBS=user32.lib diff --git a/dlls/crossbow.cpp b/dlls/crossbow.cpp index f669d054..63ab515a 100644 --- a/dlls/crossbow.cpp +++ b/dlls/crossbow.cpp @@ -373,7 +373,7 @@ void CCrossbow::FireSniperBolt() flags = 0; #endif - PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usCrossbow2, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType], 0, 0 ); + PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usCrossbow2, 0.0, g_vecZero, g_vecZero, 0, 0, m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType], 0, 0 ); // player "shoot" animation m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); @@ -442,7 +442,7 @@ void CCrossbow::FireBolt() flags = 0; #endif - PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usCrossbow, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType], 0, 0 ); + PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usCrossbow, 0.0, g_vecZero, g_vecZero, vecDir.x, vecDir.y, m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType], 0, 0 ); m_flNextPrimaryAttack = m_flNextSecondaryAttack = GetNextAttackDelay( 0.75 ); diff --git a/dlls/crowbar.cpp b/dlls/crowbar.cpp index 4cc48d97..8a0ba9a3 100644 --- a/dlls/crowbar.cpp +++ b/dlls/crowbar.cpp @@ -204,7 +204,7 @@ int CCrowbar::Swing( int fFirst ) if( fFirst ) { PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usCrowbar, - 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, + 0.0, g_vecZero, g_vecZero, 0, 0, 0, 0, 0, 0 ); } diff --git a/dlls/doors.cpp b/dlls/doors.cpp index c12cc3a0..085ee441 100644 --- a/dlls/doors.cpp +++ b/dlls/doors.cpp @@ -926,6 +926,7 @@ public: void Spawn( void ); void Precache( void ); void EXPORT MomentaryMoveDone( void ); + void EXPORT StopMoveSound( void ); void KeyValue( KeyValueData *pkvd ); void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); @@ -1117,7 +1118,15 @@ void CMomentaryDoor::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYP } void CMomentaryDoor::MomentaryMoveDone( void ) +{ + SetThink(&CMomentaryDoor::StopMoveSound); + pev->nextthink = pev->ltime + 0.1; +} + +void CMomentaryDoor::StopMoveSound() { STOP_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noiseMoving ) ); EMIT_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noiseArrived ), 1, ATTN_NORM ); + pev->nextthink = -1; + ResetThink(); } diff --git a/dlls/egon.cpp b/dlls/egon.cpp index b83c9086..6f248309 100644 --- a/dlls/egon.cpp +++ b/dlls/egon.cpp @@ -197,7 +197,7 @@ void CEgon::Attack( void ) m_flAmmoUseTime = gpGlobals->time;// start using ammo ASAP. - PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usEgonFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, m_fireState, m_fireMode, 1, 0 ); + PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usEgonFire, 0.0, g_vecZero, g_vecZero, 0.0, 0.0, m_fireState, m_fireMode, 1, 0 ); m_shakeTime = 0; @@ -216,7 +216,7 @@ void CEgon::Attack( void ) if( pev->fuser1 <= UTIL_WeaponTimeBase() ) { - PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usEgonFire, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, m_fireState, m_fireMode, 0, 0 ); + PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usEgonFire, 0, g_vecZero, g_vecZero, 0.0, 0.0, m_fireState, m_fireMode, 0, 0 ); pev->fuser1 = 1000; } @@ -504,7 +504,7 @@ void CEgon::EndAttack( void ) if( m_fireState != FIRE_OFF ) //Checking the button just in case!. bMakeNoise = true; - PLAYBACK_EVENT_FULL( FEV_GLOBAL | FEV_RELIABLE, m_pPlayer->edict(), m_usEgonStop, 0, (float *)&m_pPlayer->pev->origin, (float *)&m_pPlayer->pev->angles, 0.0, 0.0, bMakeNoise, 0, 0, 0 ); + PLAYBACK_EVENT_FULL( FEV_GLOBAL | FEV_RELIABLE, m_pPlayer->edict(), m_usEgonStop, 0, m_pPlayer->pev->origin, m_pPlayer->pev->angles, 0.0, 0.0, bMakeNoise, 0, 0, 0 ); m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 2.0; m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.5; diff --git a/dlls/extdll.h b/dlls/extdll.h index d6ea4888..4610db5e 100644 --- a/dlls/extdll.h +++ b/dlls/extdll.h @@ -62,6 +62,7 @@ typedef int BOOL; // Misc C-runtime library headers #include "stdio.h" #include "stdlib.h" +#include "stddef.h" #include "math.h" #if defined(__LP64__) || defined(__LLP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__) diff --git a/dlls/game.cpp b/dlls/game.cpp index 5f0c278d..0bc448c8 100644 --- a/dlls/game.cpp +++ b/dlls/game.cpp @@ -31,6 +31,7 @@ cvar_t friendlyfire = { "mp_friendlyfire","0", FCVAR_SERVER }; cvar_t falldamage = { "mp_falldamage","0", FCVAR_SERVER }; cvar_t weaponstay = { "mp_weaponstay","0", FCVAR_SERVER }; cvar_t selfgauss = { "mp_selfgauss", "1", FCVAR_SERVER }; +cvar_t chargerfix = { "mp_chargerfix", "0", FCVAR_SERVER }; cvar_t satchelfix = { "mp_satchelfix", "0", FCVAR_SERVER }; cvar_t forcerespawn = { "mp_forcerespawn","1", FCVAR_SERVER }; cvar_t flashlight = { "mp_flashlight","0", FCVAR_SERVER }; @@ -43,6 +44,7 @@ cvar_t allowmonsters = { "mp_allowmonsters","0", FCVAR_SERVER }; cvar_t bhopcap = { "mp_bhopcap", "1", FCVAR_SERVER }; cvar_t allow_spectators = { "allow_spectators", "0", FCVAR_SERVER }; // 0 prevents players from being spectators +cvar_t multibyte_only = { "mp_multibyte_only", "0", FCVAR_SERVER }; cvar_t mp_chattime = { "mp_chattime","10", FCVAR_SERVER }; @@ -508,6 +510,7 @@ void GameDLLInit( void ) CVAR_REGISTER( &falldamage ); CVAR_REGISTER( &weaponstay ); CVAR_REGISTER( &selfgauss ); + CVAR_REGISTER( &chargerfix ); CVAR_REGISTER( &satchelfix ); CVAR_REGISTER( &forcerespawn ); CVAR_REGISTER( &flashlight ); @@ -518,6 +521,7 @@ void GameDLLInit( void ) CVAR_REGISTER( &defaultteam ); CVAR_REGISTER( &allowmonsters ); CVAR_REGISTER( &bhopcap ); + CVAR_REGISTER( &multibyte_only ); CVAR_REGISTER( &mp_chattime ); diff --git a/dlls/game.h b/dlls/game.h index 0dc5ba87..7eb665c6 100644 --- a/dlls/game.h +++ b/dlls/game.h @@ -28,6 +28,7 @@ extern cvar_t friendlyfire; extern cvar_t falldamage; extern cvar_t weaponstay; extern cvar_t selfgauss; +extern cvar_t chargerfix; extern cvar_t satchelfix; extern cvar_t forcerespawn; extern cvar_t flashlight; diff --git a/dlls/gauss.cpp b/dlls/gauss.cpp index 62af08e1..21377783 100644 --- a/dlls/gauss.cpp +++ b/dlls/gauss.cpp @@ -138,7 +138,7 @@ BOOL CGauss::Deploy() void CGauss::Holster( int skiplocal /* = 0 */ ) { - PLAYBACK_EVENT_FULL( FEV_RELIABLE | FEV_GLOBAL, m_pPlayer->edict(), m_usGaussFire, 0.01, (float *)&m_pPlayer->pev->origin, (float *)&m_pPlayer->pev->angles, 0.0, 0.0, 0, 0, 0, 1 ); + PLAYBACK_EVENT_FULL( FEV_RELIABLE | FEV_GLOBAL, m_pPlayer->edict(), m_usGaussFire, 0.01, m_pPlayer->pev->origin, m_pPlayer->pev->angles, 0.0, 0.0, 0, 0, 0, 1 ); m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5; @@ -217,7 +217,7 @@ void CGauss::SecondaryAttack() m_pPlayer->m_flStartCharge = gpGlobals->time; m_pPlayer->m_flAmmoStartCharge = UTIL_WeaponTimeBase() + GetFullChargeTime(); - PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usGaussSpin, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, 110, 0, 0, 0 ); + PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usGaussSpin, 0.0, g_vecZero, g_vecZero, 0.0, 0.0, 110, 0, 0, 0 ); m_iSoundState = SND_CHANGE_PITCH; } @@ -281,7 +281,7 @@ void CGauss::SecondaryAttack() if( m_iSoundState == 0 ) ALERT( at_console, "sound state %d\n", m_iSoundState ); - PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usGaussSpin, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, pitch, 0, ( m_iSoundState == SND_CHANGE_PITCH ) ? 1 : 0, 0 ); + PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usGaussSpin, 0.0, g_vecZero, g_vecZero, 0.0, 0.0, pitch, 0, ( m_iSoundState == SND_CHANGE_PITCH ) ? 1 : 0, 0 ); m_iSoundState = SND_CHANGE_PITCH; // hack for going through level transitions @@ -389,13 +389,13 @@ void CGauss::Fire( Vector vecOrigSrc, Vector vecDir, float flDamage ) g_irunninggausspred = true; #endif // The main firing event is sent unreliably so it won't be delayed. - PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usGaussFire, 0.0, (float *)&m_pPlayer->pev->origin, (float *)&m_pPlayer->pev->angles, flDamage, 0.0, 0, 0, m_fPrimaryFire ? 1 : 0, 0 ); + PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usGaussFire, 0.0, m_pPlayer->pev->origin, m_pPlayer->pev->angles, flDamage, 0.0, 0, 0, m_fPrimaryFire ? 1 : 0, 0 ); // This reliable event is used to stop the spinning sound // It's delayed by a fraction of second to make sure it is delayed by 1 frame on the client // It's sent reliably anyway, which could lead to other delays - PLAYBACK_EVENT_FULL( FEV_NOTHOST | FEV_RELIABLE, m_pPlayer->edict(), m_usGaussFire, 0.01, (float *)&m_pPlayer->pev->origin, (float *)&m_pPlayer->pev->angles, 0.0, 0.0, 0, 0, 0, 1 ); + PLAYBACK_EVENT_FULL( FEV_NOTHOST | FEV_RELIABLE, m_pPlayer->edict(), m_usGaussFire, 0.01, m_pPlayer->pev->origin, m_pPlayer->pev->angles, 0.0, 0.0, 0, 0, 0, 1 ); /*ALERT( at_console, "%f %f %f\n%f %f %f\n", vecSrc.x, vecSrc.y, vecSrc.z, diff --git a/dlls/glock.cpp b/dlls/glock.cpp index b0e13a05..7d68c168 100644 --- a/dlls/glock.cpp +++ b/dlls/glock.cpp @@ -205,7 +205,7 @@ void CGlock::GlockFire( float flSpread, float flCycleTime, BOOL fUseAutoAim ) Vector vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAiming, vecSpread, 8192, BULLET_PLAYER_9MM, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed ); - PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), fUseAutoAim ? m_usFireGlock1 : m_usFireGlock2, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, ( m_iClip == 0 ) ? 1 : 0, 0 ); + PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), fUseAutoAim ? m_usFireGlock1 : m_usFireGlock2, 0.0, g_vecZero, g_vecZero, vecDir.x, vecDir.y, 0, 0, ( m_iClip == 0 ) ? 1 : 0, 0 ); m_flNextPrimaryAttack = m_flNextSecondaryAttack = GetNextAttackDelay( flCycleTime ); diff --git a/dlls/h_battery.cpp b/dlls/h_battery.cpp index 976a5733..dabbc06c 100644 --- a/dlls/h_battery.cpp +++ b/dlls/h_battery.cpp @@ -26,6 +26,8 @@ #include "saverestore.h" #include "skill.h" #include "gamerules.h" +#include "weapons.h" +#include "game.h" class CRecharge : public CBaseToggle { @@ -116,7 +118,7 @@ void CRecharge::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE use } // if the player doesn't have the suit, or there is no juice left, make the deny noise - if( ( m_iJuice <= 0 ) || ( !( pActivator->pev->weapons & ( 1 << WEAPON_SUIT ) ) ) ) + if( ( m_iJuice <= 0 ) || ( !( pActivator->pev->weapons & ( 1 << WEAPON_SUIT ) ) ) || ( ( chargerfix.value ) && ( pActivator->pev->armorvalue == MAX_NORMAL_BATTERY ) ) ) { if( m_flSoundTime <= gpGlobals->time ) { diff --git a/dlls/healthkit.cpp b/dlls/healthkit.cpp index 99d53d35..e1744479 100644 --- a/dlls/healthkit.cpp +++ b/dlls/healthkit.cpp @@ -22,6 +22,7 @@ #include "player.h" #include "items.h" #include "gamerules.h" +#include "game.h" extern int gmsgItemPickup; @@ -187,7 +188,7 @@ void CWallHealth::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE u } // if the player doesn't have the suit, or there is no juice left, make the deny noise - if( ( m_iJuice <= 0 ) || ( !( pActivator->pev->weapons & ( 1 << WEAPON_SUIT ) ) ) ) + if( ( m_iJuice <= 0 ) || ( !( pActivator->pev->weapons & ( 1 << WEAPON_SUIT ) ) ) || ( ( chargerfix.value ) && ( pActivator->pev->health >= pActivator->pev->max_health ) ) ) { if( m_flSoundTime <= gpGlobals->time ) { diff --git a/dlls/hornetgun.cpp b/dlls/hornetgun.cpp index cc63d6db..909ba342 100644 --- a/dlls/hornetgun.cpp +++ b/dlls/hornetgun.cpp @@ -150,7 +150,7 @@ void CHgun::PrimaryAttack() #else flags = 0; #endif - PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usHornetFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, FIREMODE_TRACK, 0, 0, 0 ); + PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usHornetFire, 0.0, g_vecZero, g_vecZero, 0.0, 0.0, FIREMODE_TRACK, 0, 0, 0 ); // player "shoot" animation m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); @@ -231,7 +231,7 @@ void CHgun::SecondaryAttack( void ) #else flags = 0; #endif - PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usHornetFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, FIREMODE_FAST, 0, 0, 0 ); + PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usHornetFire, 0.0, g_vecZero, g_vecZero, 0.0, 0.0, FIREMODE_FAST, 0, 0, 0 ); m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]--; m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME; diff --git a/dlls/houndeye.cpp b/dlls/houndeye.cpp index cedee258..940b68ea 100644 --- a/dlls/houndeye.cpp +++ b/dlls/houndeye.cpp @@ -155,7 +155,7 @@ BOOL CHoundeye::FValidateHintType( short sHint ) } } - ALERT( at_aiconsole, "Couldn't validate hint type" ); + ALERT( at_aiconsole, "Couldn't validate hint type\n" ); return FALSE; } diff --git a/dlls/monsters.cpp b/dlls/monsters.cpp index 953d1a69..3ff235ee 100644 --- a/dlls/monsters.cpp +++ b/dlls/monsters.cpp @@ -1208,13 +1208,19 @@ void CBaseMonster::SetActivity( Activity NewActivity ) iSequence = LookupActivity( NewActivity ); + Activity OldActivity = m_Activity; + m_Activity = NewActivity; // Go ahead and set this so it doesn't keep trying when the anim is not present + + // In case someone calls this with something other than the ideal activity + m_IdealActivity = m_Activity; + // Set to the desired anim, or default anim if the desired is not present if( iSequence > ACTIVITY_NOT_AVAILABLE ) { if( pev->sequence != iSequence || !m_fSequenceLoops ) { // don't reset frame between walk and run - if( !( m_Activity == ACT_WALK || m_Activity == ACT_RUN ) || !( NewActivity == ACT_WALK || NewActivity == ACT_RUN ) ) + if( !( OldActivity == ACT_WALK || OldActivity == ACT_RUN ) || !( NewActivity == ACT_WALK || NewActivity == ACT_RUN ) ) pev->frame = 0; } @@ -1228,11 +1234,6 @@ void CBaseMonster::SetActivity( Activity NewActivity ) ALERT( at_aiconsole, "%s has no sequence for act:%d\n", STRING( pev->classname ), NewActivity ); pev->sequence = 0; // Set to the reset anim (if it's there) } - - m_Activity = NewActivity; // Go ahead and set this so it doesn't keep trying when the anim is not present - - // In case someone calls this with something other than the ideal activity - m_IdealActivity = m_Activity; } //========================================================= diff --git a/dlls/mp5.cpp b/dlls/mp5.cpp index 8981d4d0..980e0014 100644 --- a/dlls/mp5.cpp +++ b/dlls/mp5.cpp @@ -195,7 +195,7 @@ void CMP5::PrimaryAttack() #else flags = 0; #endif - PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usMP5, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 ); + PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usMP5, 0.0, g_vecZero, g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 ); if( !m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 ) // HEV suit - indicate out of ammo condition diff --git a/dlls/nodes.cpp b/dlls/nodes.cpp index 04705638..6babe01d 100644 --- a/dlls/nodes.cpp +++ b/dlls/nodes.cpp @@ -21,6 +21,7 @@ #include "cbase.h" #include "monsters.h" #include "nodes.h" +#include "nodes_compat.h" #include "animation.h" #include "doors.h" @@ -44,9 +45,7 @@ LINK_ENTITY_TO_CLASS( info_node_air, CNodeEnt ) #if !defined _WIN32 #include <unistd.h> #include <sys/stat.h> -#define CreateDirectory(p, n) mkdir(p, 0777) -#else -#define CreateDirectory(p, n) CreateDirectoryA(p, n) +#define CreateDirectoryA(p, n) mkdir(p, 0777) #endif //========================================================= @@ -1701,9 +1700,9 @@ void CTestHull::BuildNodeGraph( void ) // make sure directories have been made GET_GAME_DIR( szNrpFilename ); strcat( szNrpFilename, "/maps" ); - CreateDirectory( szNrpFilename, NULL ); + CreateDirectoryA( szNrpFilename, NULL ); strcat( szNrpFilename, "/graphs" ); - CreateDirectory( szNrpFilename, NULL ); + CreateDirectoryA( szNrpFilename, NULL ); strcat( szNrpFilename, "/" ); strcat( szNrpFilename, STRING( gpGlobals->mapname ) ); @@ -2375,9 +2374,9 @@ int CGraph::FLoadGraph( const char *szMapName ) char szDirName[MAX_PATH]; GET_GAME_DIR( szDirName ); strcat( szDirName, "/maps" ); - CreateDirectory( szDirName, NULL ); + CreateDirectoryA( szDirName, NULL ); strcat( szDirName, "/graphs" ); - CreateDirectory( szDirName, NULL ); + CreateDirectoryA( szDirName, NULL ); strcpy( szFilename, "maps/graphs/" ); strcat( szFilename, szMapName ); @@ -2386,42 +2385,47 @@ int CGraph::FLoadGraph( const char *szMapName ) pMemFile = aMemFile = LOAD_FILE_FOR_ME( szFilename, &length ); if( !aMemFile ) - { return FALSE; - } - else + + // Read the graph version number + // + length -= sizeof(int); + if( length < 0 ) + goto ShortFile; + iVersion = *(int *) pMemFile; + pMemFile += sizeof(int); + + if( iVersion == GRAPH_VERSION || iVersion == GRAPH_VERSION_RETAIL ) { - // Read the graph version number - // - length -= sizeof(int); - if( length < 0 ) - goto ShortFile; - memcpy( &iVersion, pMemFile, sizeof(int) ); - pMemFile += sizeof(int); - - if( iVersion != GRAPH_VERSION ) - { - // This file was written by a different build of the dll! - // - ALERT( at_aiconsole, "**ERROR** Graph version is %d, expected %d\n", iVersion, GRAPH_VERSION ); - goto ShortFile; - } - // Read the graph class // - length -= sizeof(CGraph); - if( length < 0 ) - goto ShortFile; - memcpy( this, pMemFile, sizeof(CGraph) ); - pMemFile += sizeof(CGraph); + if ( iVersion == GRAPH_VERSION ) + { + length -= sizeof(CGraph); + if( length < 0 ) + goto ShortFile; + memcpy( this, pMemFile, sizeof(CGraph) ); + pMemFile += sizeof(CGraph); - // Set the pointers to zero, just in case we run out of memory. - // - m_pNodes = NULL; - m_pLinkPool = NULL; - m_di = NULL; - m_pRouteInfo = NULL; - m_pHashLinks = NULL; + // Set the pointers to zero, just in case we run out of memory. + // + m_pNodes = NULL; + m_pLinkPool = NULL; + m_di = NULL; + m_pRouteInfo = NULL; + m_pHashLinks = NULL; + } +#if _GRAPH_VERSION != _GRAPH_VERSION_RETAIL + else + { + ALERT( at_aiconsole, "Loading CGraph in GRAPH_VERSION 16 compatibility mode\n" ); + length -= sizeof(CGraph_Retail); + if( length < 0 ) + goto ShortFile; + reinterpret_cast<CGraph_Retail*>(pMemFile) -> copyOverTo(this); + pMemFile += sizeof(CGraph_Retail); + } +#endif // Malloc for the nodes // @@ -2453,11 +2457,25 @@ int CGraph::FLoadGraph( const char *szMapName ) // Read in all the links // - length -= sizeof(CLink) * m_cLinks; - if( length < 0 ) - goto ShortFile; - memcpy( m_pLinkPool, pMemFile, sizeof(CLink) * m_cLinks ); - pMemFile += sizeof(CLink) * m_cLinks; + if( iVersion == GRAPH_VERSION ) + { + length -= sizeof(CLink) * m_cLinks; + if( length < 0 ) + goto ShortFile; + memcpy( m_pLinkPool, pMemFile, sizeof(CLink) * m_cLinks ); + pMemFile += sizeof(CLink) * m_cLinks; + } +#if _GRAPH_VERSION != _GRAPH_VERSION_RETAIL + else + { + ALERT( at_aiconsole, "Loading CLink array in GRAPH_VERSION 16 compatibility mode\n" ); + length -= sizeof(CLink_Retail) * m_cLinks; + if( length < 0 ) + goto ShortFile; + reinterpret_cast<CLink_Retail*>(pMemFile) -> copyOverTo(m_pLinkPool); + pMemFile += sizeof(CLink_Retail) * m_cLinks; + } +#endif // Malloc for the sorting info. // @@ -2482,7 +2500,7 @@ int CGraph::FLoadGraph( const char *szMapName ) m_pRouteInfo = (signed char *)calloc( sizeof(signed char), m_nRouteInfo ); if( !m_pRouteInfo ) { - ALERT( at_aiconsole, "***ERROR**\nCounldn't malloc %d route bytes!\n", m_nRouteInfo ); + ALERT( at_aiconsole, "***ERROR**\nCouldn't malloc %d route bytes!\n", m_nRouteInfo ); goto NoMemory; } m_CheckedCounter = 0; @@ -2505,7 +2523,7 @@ int CGraph::FLoadGraph( const char *szMapName ) m_pHashLinks = (short *)calloc( sizeof(short), m_nHashLinks ); if( !m_pHashLinks ) { - ALERT( at_aiconsole, "***ERROR**\nCounldn't malloc %d hash link bytes!\n", m_nHashLinks ); + ALERT( at_aiconsole, "***ERROR**\nCouldn't malloc %d hash link bytes!\n", m_nHashLinks ); goto NoMemory; } @@ -2531,6 +2549,13 @@ int CGraph::FLoadGraph( const char *szMapName ) return TRUE; } + else + { + // This file was written by a different build of the dll! + // + ALERT( at_aiconsole, "**ERROR** Graph version is %d, expected %d\n", iVersion, GRAPH_VERSION ); + goto ShortFile; + } ShortFile: NoMemory: @@ -2558,9 +2583,9 @@ int CGraph::FSaveGraph( const char *szMapName ) // make sure directories have been made GET_GAME_DIR( szFilename ); strcat( szFilename, "/maps" ); - CreateDirectory( szFilename, NULL ); + CreateDirectoryA( szFilename, NULL ); strcat( szFilename, "/graphs" ); - CreateDirectory( szFilename, NULL ); + CreateDirectoryA( szFilename, NULL ); strcat( szFilename, "/" ); strcat( szFilename, szMapName ); diff --git a/dlls/nodes.h b/dlls/nodes.h index 52b715e5..4bc1ec1b 100644 --- a/dlls/nodes.h +++ b/dlls/nodes.h @@ -105,11 +105,14 @@ typedef struct //========================================================= // CGraph //========================================================= +#define _GRAPH_VERSION_RETAIL 16 // Retail Half-Life graph version. Don't increment this #ifdef XASH_64BIT -#define GRAPH_VERSION (int)16 * 10 +#define _GRAPH_VERSION (16 * 10) #else -#define GRAPH_VERSION (int)16// !!!increment this whever graph/node/link classes change, to obsolesce older disk files. +#define _GRAPH_VERSION (16) // !!!increment this whenever graph/node/link classes change, to obsolesce older disk files. #endif +#define GRAPH_VERSION (int)_GRAPH_VERSION +#define GRAPH_VERSION_RETAIL (int)_GRAPH_VERSION_RETAIL class CGraph { diff --git a/dlls/nodes_compat.h b/dlls/nodes_compat.h new file mode 100644 index 00000000..d73567e9 --- /dev/null +++ b/dlls/nodes_compat.h @@ -0,0 +1,143 @@ + +#pragma once +#ifndef NODES_32BIT_COMPAT +#define NODES_32BIT_COMPAT + +//#include "nodes.h" + +#if _GRAPH_VERSION != _GRAPH_VERSION_RETAIL + +#include "stdint.h" + +typedef int32_t PTR32; + +class CGraph_Retail +{ +public: + + BOOL m_fGraphPresent; + BOOL m_fGraphPointersSet; + BOOL m_fRoutingComplete; + + PTR32 m_pNodes; // CNode* + PTR32 m_pLinkPool; // CLink* + PTR32 m_pRouteInfo; // signed char* + + int m_cNodes; + int m_cLinks; + int m_nRouteInfo; + + PTR32 m_di; // DIST_INFO* + int m_RangeStart[3][NUM_RANGES]; + int m_RangeEnd[3][NUM_RANGES]; + float m_flShortest; + int m_iNearest; + int m_minX, m_minY, m_minZ, m_maxX, m_maxY, m_maxZ; + int m_minBoxX, m_minBoxY, m_minBoxZ, m_maxBoxX, m_maxBoxY, m_maxBoxZ; + int m_CheckedCounter; + float m_RegionMin[3], m_RegionMax[3]; + CACHE_ENTRY m_Cache[CACHE_SIZE]; + + + int m_HashPrimes[16]; + PTR32 m_pHashLinks; // short* + int m_nHashLinks; + + int m_iLastActiveIdleSearch; + + int m_iLastCoverSearch; + + + void copyOverTo(CGraph *other) { + other->m_fGraphPresent = m_fGraphPresent; + other->m_fGraphPointersSet = m_fGraphPointersSet; + other->m_fRoutingComplete = m_fRoutingComplete; + + other->m_pNodes = NULL; + other->m_pLinkPool = NULL; + other->m_pRouteInfo = NULL; + + other->m_cNodes = m_cNodes; + other->m_cLinks = m_cLinks; + other->m_nRouteInfo = m_nRouteInfo; + + other->m_di = NULL; + + memcpy( (void *) &other->m_RangeStart, (void *) m_RangeStart, + offsetof(class CGraph, m_pHashLinks) - offsetof(class CGraph, m_RangeStart) ); + +#if 0 // replacement routine in case a change in CGraph breaks the above memcpy + for (int i = 0; i < 3; ++i) + for (int j = 0; j < NUM_RANGES; ++j) + other->m_RangeStart[i][j] = m_RangeStart[i][j]; +// m_RangeStart[3][NUM_RANGES] + for (int i = 0; i < 3; ++i) + for (int j = 0; j < NUM_RANGES; ++j) + other->m_RangeEnd[i][j] = m_RangeEnd[i][j]; +// m_RangeEnd[3][NUM_RANGES] + other->m_flShortest = m_flShortest; + other->m_iNearest = m_iNearest; + other->m_minX = m_minX; + other->m_minY = m_minY; + other->m_minZ = m_minZ; + other->m_maxX = m_maxX; + other->m_maxY = m_maxY; + other->m_maxZ = m_maxZ; + other->m_minBoxX = m_minBoxX; + other->m_minBoxY = m_minBoxY; + other->m_minBoxZ = m_minBoxZ; + other->m_maxBoxX = m_maxBoxX; + other->m_maxBoxY = m_maxBoxY; + other->m_maxBoxZ = m_maxBoxZ; + other->m_CheckedCounter = m_CheckedCounter; + for (int i = 0; i < 3; ++i) + other->m_RegionMin[i] = m_RegionMin[i]; +// m_RegionMin[3] + for (int i = 0; i < 3; ++i) + other->m_RegionMax[i] = m_RegionMax[i]; +// m_RegionMax[3] + for (int i = 0; i < CACHE_SIZE; ++i) + other->m_Cache[i] = m_Cache[i]; +// m_Cache[CACHE_SIZE] + for (int i = 0; i < 16; ++i) + other->m_HashPrimes[i] = m_HashPrimes[i]; +// m_HashPrimes[16] +#endif + + other->m_pHashLinks = NULL; + other->m_nHashLinks = m_nHashLinks; + + other->m_iLastActiveIdleSearch = m_iLastActiveIdleSearch; + + other->m_iLastCoverSearch = m_iLastCoverSearch; + + } + +}; + + +class CLink_Retail +{ + +public: + int m_iSrcNode; + int m_iDestNode; + PTR32 m_pLinkEnt; // entvars_t* + char m_szLinkEntModelname[ 4 ]; + int m_afLinkInfo; + float m_flWeight; + + void copyOverTo(CLink* other) { + other->m_iSrcNode = m_iSrcNode; + other->m_iDestNode = m_iDestNode ; + other->m_pLinkEnt = NULL; + for (int i = 0; i < 4; ++i) + other->m_szLinkEntModelname[i] = m_szLinkEntModelname[i]; +// m_szLinkEntModelname[ 4 ] + other->m_afLinkInfo = m_afLinkInfo; + other->m_flWeight = m_flWeight; + } +}; + +#endif +#endif diff --git a/dlls/plats.cpp b/dlls/plats.cpp index b3e1c683..5a96a36b 100644 --- a/dlls/plats.cpp +++ b/dlls/plats.cpp @@ -1059,7 +1059,7 @@ void CFuncTrackTrain::StopSound( void ) us_encode = us_sound; PLAYBACK_EVENT_FULL( FEV_RELIABLE | FEV_UPDATE, edict(), m_usAdjustPitch, 0.0, - (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, us_encode, 0, 1, 0 ); + g_vecZero, g_vecZero, 0.0, 0.0, us_encode, 0, 1, 0 ); /* STOP_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noise ) ); */ @@ -1107,7 +1107,7 @@ void CFuncTrackTrain::UpdateSound( void ) us_encode = us_sound | us_pitch | us_volume; PLAYBACK_EVENT_FULL( FEV_RELIABLE | FEV_UPDATE, edict(), m_usAdjustPitch, 0.0, - (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, us_encode, 0, 0, 0 ); + g_vecZero, g_vecZero, 0.0, 0.0, us_encode, 0, 0, 0 ); } } diff --git a/dlls/python.cpp b/dlls/python.cpp index 90606c50..88aa34b5 100644 --- a/dlls/python.cpp +++ b/dlls/python.cpp @@ -200,7 +200,7 @@ void CPython::PrimaryAttack() #else flags = 0; #endif - PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usFirePython, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 ); + PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usFirePython, 0.0, g_vecZero, g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 ); if( !m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 ) // HEV suit - indicate out of ammo condition diff --git a/dlls/scientist.cpp b/dlls/scientist.cpp index 7e94b286..cc506b6f 100644 --- a/dlls/scientist.cpp +++ b/dlls/scientist.cpp @@ -695,12 +695,6 @@ void CScientist::TalkInit() { CTalkMonster::TalkInit(); - // scientist will try to talk to friends in this order: - - m_szFriends[0] = "monster_scientist"; - m_szFriends[1] = "monster_sitting_scientist"; - m_szFriends[2] = "monster_barney"; - // scientists speach group names (group names are in sentences.txt) m_szGrp[TLK_ANSWER] = "SC_ANSWER"; diff --git a/dlls/shotgun.cpp b/dlls/shotgun.cpp index eb36c6b7..fb5e0daf 100644 --- a/dlls/shotgun.cpp +++ b/dlls/shotgun.cpp @@ -152,7 +152,7 @@ void CShotgun::PrimaryAttack() Vector vecDir = m_pPlayer->FireBulletsPlayer( 16, vecSrc, vecAiming, VECTOR_CONE_DM_SHOTGUN, 2048, BULLET_PLAYER_BUCKSHOT, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed ); - PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usSingleFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 ); + PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usSingleFire, 0.0, g_vecZero, g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 ); if( !m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 ) // HEV suit - indicate out of ammo condition @@ -224,7 +224,7 @@ void CShotgun::SecondaryAttack( void ) vecDir = m_pPlayer->FireBulletsPlayer( 12, vecSrc, vecAiming, VECTOR_CONE_10DEGREES, 2048, BULLET_PLAYER_BUCKSHOT, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed ); } - PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usDoubleFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 ); + PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usDoubleFire, 0.0, g_vecZero, g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 ); if( !m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 ) // HEV suit - indicate out of ammo condition diff --git a/dlls/sound.cpp b/dlls/sound.cpp index 30c44326..6637fe53 100644 --- a/dlls/sound.cpp +++ b/dlls/sound.cpp @@ -1037,9 +1037,8 @@ void USENTENCEG_InitLRU( unsigned char *plru, int count ) int USENTENCEG_PickSequential( int isentenceg, char *szfound, int ipick, int freset ) { - char *szgroupname; + const char *szgroupname; unsigned char count; - char sznum[8]; if( !fSentencesInit ) return -1; @@ -1056,10 +1055,7 @@ int USENTENCEG_PickSequential( int isentenceg, char *szfound, int ipick, int fre if( ipick >= count ) ipick = count - 1; - strcpy( szfound, "!" ); - strcat( szfound, szgroupname ); - sprintf( sznum, "%d", ipick ); - strcat( szfound, sznum ); + sprintf( szfound, "!%s%d", szgroupname, ipick ); if( ipick >= count ) { @@ -1083,11 +1079,10 @@ int USENTENCEG_PickSequential( int isentenceg, char *szfound, int ipick, int fre int USENTENCEG_Pick( int isentenceg, char *szfound ) { - char *szgroupname; + const char *szgroupname; unsigned char *plru; unsigned char i; unsigned char count; - char sznum[8]; unsigned char ipick; int ffound = FALSE; @@ -1116,10 +1111,8 @@ int USENTENCEG_Pick( int isentenceg, char *szfound ) USENTENCEG_InitLRU( plru, count ); else { - strcpy( szfound, "!" ); - strcat( szfound, szgroupname ); - sprintf( sznum, "%d", ipick ); - strcat( szfound, sznum ); + sprintf( szfound, "!%s%d", szgroupname, ipick ); + return ipick; } } @@ -1227,7 +1220,6 @@ int SENTENCEG_PlaySequentialSz( edict_t *entity, const char *szgroupname, float void SENTENCEG_Stop( edict_t *entity, int isentenceg, int ipick ) { char buffer[64]; - char sznum[8]; if( !fSentencesInit ) return; @@ -1235,10 +1227,7 @@ void SENTENCEG_Stop( edict_t *entity, int isentenceg, int ipick ) if( isentenceg < 0 || ipick < 0 ) return; - strcpy( buffer, "!" ); - strcat( buffer, rgsentenceg[isentenceg].szgroupname ); - sprintf( sznum, "%d", ipick ); - strcat( buffer, sznum ); + sprintf( buffer, "!%s%d", rgsentenceg[isentenceg].szgroupname, ipick ); STOP_SOUND( entity, CHAN_VOICE, buffer ); } @@ -1369,9 +1358,8 @@ void SENTENCEG_Init() int SENTENCEG_Lookup( const char *sample, char *sentencenum ) { - char sznum[8]; - int i; + // this is a sentence name; lookup sentence number // and give to engine as string. for( i = 0; i < gcallsentences; i++ ) @@ -1379,9 +1367,7 @@ int SENTENCEG_Lookup( const char *sample, char *sentencenum ) { if( sentencenum ) { - strcpy( sentencenum, "!" ); - sprintf( sznum, "%d", i ); - strcat( sentencenum, sznum ); + sprintf(sentencenum, "!%d", i); } return i; } diff --git a/dlls/squeakgrenade.cpp b/dlls/squeakgrenade.cpp index bfe17ed1..a7295599 100644 --- a/dlls/squeakgrenade.cpp +++ b/dlls/squeakgrenade.cpp @@ -508,7 +508,7 @@ void CSqueak::PrimaryAttack() #else flags = 0; #endif - PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usSnarkFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, 0, 0, 0, 0 ); + PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usSnarkFire, 0.0, g_vecZero, g_vecZero, 0.0, 0.0, 0, 0, 0, 0 ); if( tr.fAllSolid == 0 && tr.fStartSolid == 0 && tr.flFraction > 0.25 ) { diff --git a/dlls/subs.cpp b/dlls/subs.cpp index 2a299ce4..e24a5c08 100644 --- a/dlls/subs.cpp +++ b/dlls/subs.cpp @@ -407,6 +407,13 @@ void CBaseToggle::LinearMove( Vector vecDest, float flSpeed ) // divide vector length by speed to get time to reach dest float flTravelTime = vecDestDelta.Length() / flSpeed; + if( flTravelTime < 0.05 ) + { + UTIL_SetOrigin( pev, m_vecFinalDest ); + LinearMoveDone(); + return; + } + // set nextthink to trigger a call to LinearMoveDone when dest is reached pev->nextthink = pev->ltime + flTravelTime; SetThink( &CBaseToggle::LinearMoveDone ); diff --git a/dlls/tripmine.cpp b/dlls/tripmine.cpp index 94907bcd..6e8fc2fc 100644 --- a/dlls/tripmine.cpp +++ b/dlls/tripmine.cpp @@ -444,7 +444,7 @@ void CTripmine::PrimaryAttack( void ) #else flags = 0; #endif - PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usTripFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, 0, 0, 0, 0 ); + PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usTripFire, 0.0, g_vecZero, g_vecZero, 0.0, 0.0, 0, 0, 0, 0 ); if( tr.flFraction < 1.0 ) { diff --git a/dlls/util.cpp b/dlls/util.cpp index c7feab31..a5160876 100644 --- a/dlls/util.cpp +++ b/dlls/util.cpp @@ -1733,8 +1733,8 @@ void CSaveRestoreBuffer::BufferRewind( int size ) extern "C" { unsigned _rotr( unsigned val, int shift ) { - register unsigned lobit; /* non-zero means lo bit set */ - register unsigned num = val; /* number to rotate */ + unsigned lobit; /* non-zero means lo bit set */ + unsigned num = val; /* number to rotate */ shift &= 0x1f; /* modulo 32 -- this will also make negative shifts work */ diff --git a/dlls/util.h b/dlls/util.h index 41e86a84..602380ba 100644 --- a/dlls/util.h +++ b/dlls/util.h @@ -552,8 +552,8 @@ void EMIT_GROUPNAME_SUIT(edict_t *entity, const char *groupname); #define RANDOM_SOUND_ARRAY( array ) (array) [ RANDOM_LONG(0,ARRAYSIZE( (array) )-1) ] -#define PLAYBACK_EVENT( flags, who, index ) PLAYBACK_EVENT_FULL( flags, who, index, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, 0, 0, 0, 0 ); -#define PLAYBACK_EVENT_DELAY( flags, who, index, delay ) PLAYBACK_EVENT_FULL( flags, who, index, delay, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, 0, 0, 0, 0 ); +#define PLAYBACK_EVENT( flags, who, index ) PLAYBACK_EVENT_FULL( flags, who, index, 0, g_vecZero, g_vecZero, 0.0, 0.0, 0, 0, 0, 0 ); +#define PLAYBACK_EVENT_DELAY( flags, who, index, delay ) PLAYBACK_EVENT_FULL( flags, who, index, delay, g_vecZero, g_vecZero, 0.0, 0.0, 0, 0, 0, 0 ); #define GROUP_OP_AND 0 #define GROUP_OP_NAND 1 diff --git a/dlls/wscript b/dlls/wscript new file mode 100644 index 00000000..05a7d002 --- /dev/null +++ b/dlls/wscript @@ -0,0 +1,72 @@ +#! /usr/bin/env python +# encoding: utf-8 +# a1batross, mittorn, 2018 + +from waflib import Utils +import os + +def options(opt): + # stub + return + +def configure(conf): + # stub + return + +def build(bld): + defines = [] + source = bld.path.parent.ant_glob([ + 'pm_shared/*.c', + ]) + + source += [ + 'agrunt.cpp', 'airtank.cpp', 'aflock.cpp', 'animating.cpp', 'animation.cpp', 'apache.cpp', + 'barnacle.cpp', 'barney.cpp', 'bigmomma.cpp', 'bloater.cpp', 'bmodels.cpp', 'bullsquid.cpp', 'buttons.cpp', + 'cbase.cpp', 'client.cpp', 'combat.cpp', 'controller.cpp', 'crossbow.cpp', 'crowbar.cpp', + 'defaultai.cpp', 'doors.cpp', + 'effects.cpp', 'egon.cpp', 'explode.cpp', + 'flyingmonster.cpp', 'func_break.cpp', 'func_tank.cpp', + 'game.cpp', 'gamerules.cpp', 'gargantua.cpp', 'gauss.cpp', 'genericmonster.cpp', 'ggrenade.cpp', 'globals.cpp', 'glock.cpp', 'gman.cpp', + 'h_ai.cpp', 'h_battery.cpp', 'h_cine.cpp', 'h_cycler.cpp', 'h_export.cpp', 'handgrenade.cpp', 'hassassin.cpp', 'headcrab.cpp', + 'healthkit.cpp', 'hgrunt.cpp', 'hornet.cpp', 'hornetgun.cpp', 'houndeye.cpp', + 'ichthyosaur.cpp', 'islave.cpp', 'items.cpp', + 'leech.cpp', 'lights.cpp', + 'maprules.cpp', 'monstermaker.cpp', 'monsters.cpp', 'monsterstate.cpp', 'mortar.cpp', 'mp5.cpp', 'multiplay_gamerules.cpp', + 'nihilanth.cpp', 'nodes.cpp', + 'observer.cpp', 'osprey.cpp', + 'pathcorner.cpp', 'plane.cpp', 'plats.cpp', 'player.cpp', 'playermonster.cpp', 'python.cpp', + 'rat.cpp', 'roach.cpp', 'rpg.cpp', + 'satchel.cpp', 'schedule.cpp', 'scientist.cpp', 'scripted.cpp', 'shotgun.cpp', 'singleplay_gamerules.cpp', 'skill.cpp', + 'sound.cpp', 'soundent.cpp', 'spectator.cpp', 'squadmonster.cpp', 'squeakgrenade.cpp', 'subs.cpp', + 'talkmonster.cpp', 'teamplay_gamerules.cpp', 'tempmonster.cpp', 'tentacle.cpp', + 'triggers.cpp', 'tripmine.cpp', 'turret.cpp', + 'util.cpp', + 'weapons.cpp', 'world.cpp', 'xen.cpp', 'zombie.cpp'] + + if bld.env.VOICEMGR: + source += bld.path.parent.ant_glob([ + 'game_shared/voice_gamemgr.cpp', + ]) + else: + defines += ['NO_VOICEGAMEMGR'] + + includes = Utils.to_list('. wpn_shared ../common ../engine ../pm_shared ../game_shared ../public') + + libs = [] + + if bld.env.DEST_OS2 not in ['android']: + install_path = os.path.join(bld.env.GAMEDIR, bld.env.SERVER_DIR) + else: + install_path = bld.env.PREFIX + + bld.shlib( + source = source, + target = 'server', + features = 'c cxx', + includes = includes, + defines = defines, + use = libs, + install_path = install_path, + subsystem = bld.env.MSVC_SUBSYSTEM, + idx = 2 + ) diff --git a/engine/cdll_int.h b/engine/cdll_int.h index abfc43bd..8ab903b0 100644 --- a/engine/cdll_int.h +++ b/engine/cdll_int.h @@ -169,7 +169,7 @@ typedef struct cl_enginefuncs_s int (*GetWindowCenterX)( void ); int (*GetWindowCenterY)( void ); void (*GetViewAngles)( float * ); - void (*SetViewAngles)( float * ); + void (*SetViewAngles)( const float * ); int (*GetMaxClients)( void ); void (*Cvar_SetValue)( const char *cvar, float value ); @@ -195,20 +195,20 @@ typedef struct cl_enginefuncs_s float (*GetClientTime)( void ); void (*V_CalcShake)( void ); - void (*V_ApplyShake)( float *origin, float *angles, float factor ); + void (*V_ApplyShake)( const float *origin, const float *angles, float factor ); - int (*PM_PointContents)( float *point, int *truecontents ); - int (*PM_WaterEntity)( float *p ); - struct pmtrace_s *(*PM_TraceLine)( float *start, float *end, int flags, int usehull, int ignore_pe ); + int (*PM_PointContents)( const float *point, int *truecontents ); + int (*PM_WaterEntity)( const float *p ); + struct pmtrace_s *(*PM_TraceLine)( const float *start, const float *end, int flags, int usehull, int ignore_pe ); struct model_s *(*CL_LoadModel)( const char *modelname, int *index ); int (*CL_CreateVisibleEntity)( int type, struct cl_entity_s *ent ); const struct model_s* (*GetSpritePointer)( HSPRITE hSprite ); - void (*pfnPlaySoundByNameAtLocation)( const char *szSound, float volume, float *origin ); + void (*pfnPlaySoundByNameAtLocation)( const char *szSound, float volume, const float *origin ); unsigned short (*pfnPrecacheEvent)( int type, const char* psz ); - void (*pfnPlaybackEvent)( int flags, const struct edict_s *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 ); + void (*pfnPlaybackEvent)( int flags, const struct edict_s *pInvoker, unsigned short eventindex, float delay, const float *origin, const float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 ); void (*pfnWeaponAnim)( int iAnim, int body ); float (*pfnRandomFloat)( float flLow, float flHigh ); int (*pfnRandomLong)( int lLow, int lHigh ); diff --git a/engine/eiface.h b/engine/eiface.h index f6cf2f51..6a5f86fc 100644 --- a/engine/eiface.h +++ b/engine/eiface.h @@ -124,7 +124,7 @@ typedef struct enginefuncs_s int (*pfnWalkMove)( edict_t *ent, float yaw, float dist, int iMode ); void (*pfnSetOrigin)( edict_t *e, const float *rgflOrigin ); void (*pfnEmitSound)( edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch ); - void (*pfnEmitAmbientSound)( edict_t *entity, float *pos, const char *samp, float vol, float attenuation, int fFlags, int pitch ); + void (*pfnEmitAmbientSound)( edict_t *entity, const float *pos, const char *samp, float vol, float attenuation, int fFlags, int pitch ); void (*pfnTraceLine)( const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr ); void (*pfnTraceToss)( edict_t* pent, edict_t* pentToIgnore, TraceResult *ptr ); int (*pfnTraceMonsterHull)( edict_t *pEdict, const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr ); @@ -219,10 +219,10 @@ typedef struct enginefuncs_s void (*pfnSetPhysicsKeyValue)( const edict_t *pClient, const char *key, const char *value ); const char *(*pfnGetPhysicsInfoString)( const edict_t *pClient ); unsigned short (*pfnPrecacheEvent)( int type, const char*psz ); - void (*pfnPlaybackEvent)( int flags, const edict_t *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 ); - - unsigned char *(*pfnSetFatPVS)( float *org ); - unsigned char *(*pfnSetFatPAS)( float *org ); + void (*pfnPlaybackEvent)( int flags, const edict_t *pInvoker, unsigned short eventindex, float delay, const float *origin, const float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 ); + + unsigned char *(*pfnSetFatPVS)( const float *org ); + unsigned char *(*pfnSetFatPAS)( const float *org ); int (*pfnCheckVisibility )( const edict_t *entity, unsigned char *pset ); @@ -241,7 +241,7 @@ typedef struct enginefuncs_s // Forces the client and server to be running with the same version of the specified file // ( e.g., a player model ). // Calling this has no effect in single player - void (*pfnForceUnmodified)( FORCE_TYPE type, float *mins, float *maxs, const char *filename ); + void (*pfnForceUnmodified)( FORCE_TYPE type, const float *mins, const float *maxs, const char *filename ); void (*pfnGetPlayerStats)( const edict_t *pClient, int *ping, int *packet_loss ); @@ -355,7 +355,7 @@ typedef enum _fieldtypes FIELD_TYPECOUNT // MUST BE LAST } FIELDTYPE; -#if !defined(offsetof) && !defined(GNUC) +#if !defined(offsetof) && !defined(__GNUC__) #define offsetof(s,m) (size_t)&(((s *)0)->m) #endif diff --git a/gnu.txt b/gnu.txt deleted file mode 100644 index e587591e..00000000 --- a/gnu.txt +++ /dev/null @@ -1,621 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/scripts/waifulib/xcompile.py b/scripts/waifulib/xcompile.py new file mode 100644 index 00000000..3244a95a --- /dev/null +++ b/scripts/waifulib/xcompile.py @@ -0,0 +1,302 @@ +# encoding: utf-8 +# xcompile.py -- crosscompiling utils +# Copyright (C) 2018 a1batross +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +try: from fwgslib import get_flags_by_compiler +except: from waflib.extras.fwgslib import get_flags_by_compiler +from waflib import Logs +import os +import sys + +# Output: +# CROSSCOMPILING -- set to true, if crosscompiling is enabled +# DEST_OS2 -- as some operating systems is built on top of another, it's better to not change DEST_OS, +# instead of this DEST_OS2 is defined with target value +# For example: android is built on top of linux and have many things in common, +# but it can't be considered as default GNU/Linux. +# Possible values: +# DEST_OS2 DEST_OS +# 'android' 'linux' + +# This class does support ONLY r10e and r19c NDK +class Android: + ctx = None # waf context + arch = None + toolchain = None + api = None + toolchain_path = None + ndk_home = None + ndk_rev = 0 + is_hardfloat = False + clang = False + + def __init__(self, ctx, arch, toolchain, api): + self.ctx = ctx + for i in ['ANDROID_NDK_HOME', 'ANDROID_NDK']: + self.ndk_home = os.getenv(i) + if self.ndk_home != None: + break + + if not self.ndk_home: + conf.fatal('Set ANDROID_NDK_HOME environment variable pointing to the root of Android NDK!') + + # TODO: this were added at some point of NDK development + # but I don't know at which version + # r10e don't have it + source_prop = os.path.join(self.ndk_home, 'source.properties') + if os.path.exists(source_prop): + with open(source_prop) as ndk_props_file: + for line in ndk_props_file.readlines(): + tokens = line.split('=') + trimed_tokens = [token.strip() for token in tokens] + + if 'Pkg.Revision' in trimed_tokens: + self.ndk_rev = int(trimed_tokens[1].split('.')[0]) + else: + self.ndk_rev = 10 + + if self.ndk_rev not in [10, 19]: + ctx.fatal('Unknown NDK revision: {}'.format(self.ndk_rev)) + + self.arch = arch + if self.arch == 'armeabi-v7a-hard': + if self.ndk_rev <= 10: + self.arch = 'armeabi-v7a' # Only armeabi-v7a have hard float ABI + self.is_hardfloat = True + else: + raise Exception('NDK does not support hardfloat ABI') + + self.toolchain = toolchain + + if self.ndk_rev >= 19 or 'clang' in self.toolchain: + self.clang = True + + if self.is_arm64() or self.is_amd64() and self.api < 21: + Logs.warn('API level for 64-bit target automatically was set to 21') + self.api = 21 + elif self.ndk_rev >= 19 and self.api < 16: + Logs.warn('API level automatically was set to 16 due to NDK support') + self.api = 16 + else: self.api = api + self.toolchain_path = self.gen_toolchain_path() + + # TODO: Crystax support? + # TODO: Support for everything else than linux-x86_64? + # TODO: Determine if I actually need to implement listed above + + def is_arm(self): + ''' + Checks if selected architecture is **32-bit** ARM + ''' + return self.arch.startswith('armeabi') + + def is_x86(self): + ''' + Checks if selected architecture is **32-bit** or **64-bit** x86 + ''' + return self.arch == 'x86' + + def is_amd64(self): + ''' + Checks if selected architecture is **64-bit** x86 + ''' + return self.arch == 'x86_64' + + def is_arm64(self): + ''' + Checks if selected architecture is AArch64 + ''' + return self.arch == 'aarch64' + + def is_clang(self): + ''' + Checks if selected toolchain is Clang (TODO) + ''' + return self.clang + + def is_hardfp(self): + return self.is_hardfloat + + def gen_toolchain_path(self): + path = 'toolchains' + + if sys.platform.startswith('linux'): + toolchain_host = 'linux' + elif sys.platform.startswith('darwin'): + toolchain_host = 'darwin' + elif sys.platform.startswith('win32') or sys.platform.startswith('cygwin'): + toolchain_host = 'windows' + else: raise Exception('Unsupported by NDK host platform') + + toolchain_host += '-' + + # Assuming we are building on x86 + if sys.maxsize > 2**32: + toolchain_host += 'x86_64' + else: toolchain_host += 'x86' + + if self.is_clang(): + if self.ndk_rev < 19: + raise Exception('Clang is not supported for this NDK') + + toolchain_folder = 'llvm' + + if self.is_x86(): + triplet = 'i686-linux-android{}-'.format(self.api) + elif self.is_arm(): + triplet = 'armv7a-linux-androideabi{}-'.format(self.api) + else: + triplet = self.arch + '-linux-android{}-'.format(self.api) + else: + if self.is_x86() or self.is_amd64(): + toolchain_folder = self.arch + '-' + self.toolchain + elif self.is_arm(): + toolchain_folder = 'arm-linux-androideabi-' + self.toolchain + else: + toolchain_folder = self.arch + '-linux-android-' + self.toolchain + + if self.is_x86(): + triplet = 'i686-linux-android-' + elif self.is_arm(): + triplet = 'arm-linux-androideabi-' + else: + triplet = self.arch + '-linux-android-' + + return os.path.join(path, toolchain_folder, 'prebuilt', toolchain_host, 'bin', triplet) + + def cc(self): + return os.path.abspath(os.path.join(self.ndk_home, self.toolchain_path + ('clang' if self.is_clang() else 'gcc'))) + + def cxx(self): + return os.path.abspath(os.path.join(self.ndk_home, self.toolchain_path + ('clang++' if self.is_clang() else 'g++'))) + + def system_stl(self): + # TODO: proper STL support + return os.path.abspath(os.path.join(self.ndk_home, 'sources', 'cxx-stl', 'system', 'include')) + + def sysroot(self): + if self.ndk_rev >= 19: + return os.path.abspath(os.path.join(self.ndk_home, 'sysroot')) + else: + arch = self.arch + if self.is_arm(): + arch = 'arm' + elif self.is_arm64(): + arch = 'arm64' + path = 'platforms/android-{}/arch-{}'.format(self.api, arch) + + return os.path.abspath(os.path.join(self.ndk_home, path)) + + def cflags(self): + cflags = ['--sysroot={0}'.format(self.sysroot()), '-DANDROID', '-D__ANDROID__'] + cflags += ['-I{0}'.format(self.system_stl())] + if self.is_arm(): + if self.arch == 'armeabi-v7a': + # ARMv7 support + cflags += ['-mthumb', '-mfpu=neon', '-mcpu=cortex-a9', '-DHAVE_EFFICIENT_UNALIGNED_ACCESS', '-DVECTORIZE_SINCOS'] + if not self.is_clang(): + cflags += [ '-mvectorize-with-neon-quad' ] + if self.is_hardfloat: + cflags += ['-D_NDK_MATH_NO_SOFTFP=1', '-mhard-float', '-mfloat-abi=hard', '-DLOAD_HARDFP', '-DSOFTFP_LINK'] + else: + cflags += ['-mfloat-abi=softfp'] + else: + # ARMv5 support + cflags += ['-march=armv5te', '-mtune=xscale', '-msoft-float'] + elif self.is_x86(): + cflags += ['-mtune=atom', '-march=atom', '-mssse3', '-mfpmath=sse', '-DVECTORIZE_SINCOS', '-DHAVE_EFFICIENT_UNALIGNED_ACCESS'] + return cflags + + # they go before object list + def linkflags(self): + linkflags = ['--sysroot={0}'.format(self.sysroot())] + return linkflags + + def ldflags(self): + ldflags = ['-lgcc', '-no-canonical-prefixes'] + if self.is_arm(): + if self.arch == 'armeabi-v7a': + ldflags += ['-march=armv7-a', '-Wl,--fix-cortex-a8', '-mthumb'] + if self.is_hardfloat: + ldflags += ['-Wl,--no-warn-mismatch', '-lm_hard'] + else: + ldflags += ['-march=armv5te'] + return ldflags + +def options(opt): + android = opt.add_option_group('Android options') + android.add_option('--android', action='store', dest='ANDROID_OPTS', default=None, + help='enable building for android, format: --android=<arch>,<toolchain>,<api>, example: --android=armeabi-v7a-hard,4.9,9') + +def configure(conf): + if conf.options.ANDROID_OPTS: + values = conf.options.ANDROID_OPTS.split(',') + if len(values) != 3: + conf.fatal('Invalid --android paramater value!') + + valid_archs = ['x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'armeabi-v7a-hard', 'aarch64', 'mipsel', 'mips64el'] + + if values[0] not in valid_archs: + conf.fatal('Unknown arch: {}. Supported: {}'.format(values[0], ', '.join(valid_archs))) + + android = Android(conf, values[0], values[1], int(values[2])) + setattr(conf, 'android', android) + conf.environ['CC'] = android.cc() + conf.environ['CXX'] = android.cxx() + conf.env.CFLAGS += android.cflags() + conf.env.CXXFLAGS += android.cflags() + conf.env.LINKFLAGS += android.linkflags() + conf.env.LDFLAGS += android.ldflags() + + conf.env.HAVE_M = True + if android.is_hardfp(): + conf.env.LIB_M = ['m_hard'] + else: conf.env.LIB_M = ['m'] + + conf.env.PREFIX = '/lib/{}'.format(android.arch) + + conf.msg('Selected Android NDK', '{}, version: {}'.format(android.ndk_home, android.ndk_rev)) + # no need to print C/C++ compiler, as it would be printed by compiler_c/cxx + conf.msg('... C/C++ flags', ' '.join(android.cflags()).replace(android.ndk_home, '$NDK')) + conf.msg('... link flags', ' '.join(android.linkflags()).replace(android.ndk_home, '$NDK')) + conf.msg('... ld flags', ' '.join(android.ldflags()).replace(android.ndk_home, '$NDK')) + + # conf.env.ANDROID_OPTS = android + conf.env.DEST_OS2 = 'android' +# else: +# conf.load('compiler_c compiler_cxx') # Use host compiler :) + +def post_compiler_cxx_configure(conf): + if conf.options.ANDROID_OPTS: + if conf.android.ndk_rev >= 19: + conf.env.CXXFLAGS_cxxshlib += ['-static-libstdc++'] + conf.env.LDFLAGS_cxxshlib += ['-static-libstdc++'] + return + +def post_compiler_c_configure(conf): + return + +from waflib.Tools import compiler_cxx, compiler_c + +compiler_cxx_configure = getattr(compiler_cxx, 'configure') +compiler_c_configure = getattr(compiler_c, 'configure') + +def patch_compiler_cxx_configure(conf): + compiler_cxx_configure(conf) + post_compiler_cxx_configure(conf) + +def patch_compiler_c_configure(conf): + compiler_c_configure(conf) + post_compiler_c_configure(conf) + +setattr(compiler_cxx, 'configure', patch_compiler_cxx_configure) +setattr(compiler_c, 'configure', patch_compiler_c_configure) diff --git a/waf b/waf new file mode 100755 index 00000000..b35987aa --- /dev/null +++ b/waf @@ -0,0 +1,169 @@ +#!/usr/bin/env python +# encoding: latin-1 +# Thomas Nagy, 2005-2018 +# +""" +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +""" + +import os, sys, inspect + +VERSION="2.0.17" +REVISION="da8474e646911ac5657990d535080c54" +GIT="31da55afb92d9865019eb5193e874d1ffb86c522" +INSTALL='' +C1='#9' +C2='#3' +C3='#*' +cwd = os.getcwd() +join = os.path.join + + +WAF='waf' +def b(x): + return x +if sys.hexversion>0x300000f: + WAF='waf3' + def b(x): + return x.encode() + +def err(m): + print(('\033[91mError: %s\033[0m' % m)) + sys.exit(1) + +def unpack_wafdir(dir, src): + f = open(src,'rb') + c = 'corrupt archive (%d)' + while 1: + line = f.readline() + if not line: err('run waf-light from a folder containing waflib') + if line == b('#==>\n'): + txt = f.readline() + if not txt: err(c % 1) + if f.readline() != b('#<==\n'): err(c % 2) + break + if not txt: err(c % 3) + txt = txt[1:-1].replace(b(C1), b('\n')).replace(b(C2), b('\r')).replace(b(C3), b('\x00')) + + import shutil, tarfile + try: shutil.rmtree(dir) + except OSError: pass + try: + for x in ('Tools', 'extras'): + os.makedirs(join(dir, 'waflib', x)) + except OSError: + err("Cannot unpack waf lib into %s\nMove waf in a writable directory" % dir) + + os.chdir(dir) + tmp = 't.bz2' + t = open(tmp,'wb') + try: t.write(txt) + finally: t.close() + + try: + t = tarfile.open(tmp) + except: + try: + os.system('bunzip2 t.bz2') + t = tarfile.open('t') + tmp = 't' + except: + os.chdir(cwd) + try: shutil.rmtree(dir) + except OSError: pass + err("Waf cannot be unpacked, check that bzip2 support is present") + + try: + for x in t: t.extract(x) + finally: + t.close() + + for x in ('Tools', 'extras'): + os.chmod(join('waflib',x), 493) + + if sys.hexversion<0x300000f: + sys.path = [join(dir, 'waflib')] + sys.path + import fixpy2 + fixpy2.fixdir(dir) + + os.remove(tmp) + os.chdir(cwd) + + try: dir = unicode(dir, 'mbcs') + except: pass + try: + from ctypes import windll + windll.kernel32.SetFileAttributesW(dir, 2) + except: + pass + +def test(dir): + try: + os.stat(join(dir, 'waflib')) + return os.path.abspath(dir) + except OSError: + pass + +def find_lib(): + src = os.path.abspath(inspect.getfile(inspect.getmodule(err))) + base, name = os.path.split(src) + + #devs use $WAFDIR + w=test(os.environ.get('WAFDIR', '')) + if w: return w + + #waf-light + if name.endswith('waf-light'): + w = test(base) + if w: return w + err('waf-light requires waflib -> export WAFDIR=/folder') + + dirname = '%s-%s-%s' % (WAF, VERSION, REVISION) + for i in (INSTALL,'/usr','/usr/local','/opt'): + w = test(i + '/lib/' + dirname) + if w: return w + + #waf-local + dir = join(base, (sys.platform != 'win32' and '.' or '') + dirname) + w = test(dir) + if w: return w + + #unpack + unpack_wafdir(dir, src) + return dir + +wafdir = find_lib() +sys.path.insert(0, wafdir) + +if __name__ == '__main__': + sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), 'scripts', 'waifulib')) + from waflib import Scripting + Scripting.waf_entry_point(cwd, VERSION, wafdir) + +#==> +#BZh91AY&SYL7���9����������������u��� 8�X0E��bQ\{���*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#3�o�K�mCam�vu��eJ��wt]���Sf��:��l�ݶq:���}������S���۹N�Nݺ7�}������ۡ�{;RR�]#9���ט�ͬ�@aحٽy�_>��g�v|��a���xoy�z��w����#*�Og�����������m�����o�ޏl�{��3w�|�#*#*#*#*�6�>=#*��N�{���r�#*ݻaݭ����w�����+Z��57:�٦Im݅��8�F�#9��CM���w#*�DT�#*���"��DPTz�R�J��nT�z>������w�s�K�+����w*��ۮ"��j�O[�p��p�wc�T�>���J��z�z��$������cg����ٻ)n�m����fl�&v��N���k��uu��E���۞��R� {7��Z�ۮ��Vm�=�zǽ��X�z��t���n9��EQk���^�E@��^G(c:uJKk�/y˙��z�v�>�-�5��'�#*�{Ghν{{'$����}��)��#9�9��4�A��q�0���v���<w�Y�p��AS}p:�Y�#*�R�}Y�/��[{wvۆ��Zwm��;n�y��l��sm��wg�;M�n����WkB�lK9ëݽ�н��x\��a��vt�˞��>���f[����5vNͶ��뾷�z�d��.��o}]ә}uCَ=�)ƎN�8�r��#*7����zu_w}�F�z�Ks�H�(%;5I�B�kl���vv�6ɗ�K������ݹ���Y�{ݞzoy��������(W��7�U���v����#*#*&���#*h{�{��^w��}�}EOp[���;nøşj��=��ù� ��ٯZP}Po�5��z�Ski���Ts�����ڽW���iv�o#*V��{wl�)�����N�wGk�^�غ������#�Y�˛X��.�+�7e��}�z����m��<�ow4Z�羾=��0 m�(>��M�W�J[p^��t���S�t�^��{�;{={��v�^��&���U!ܓ���2��#3�n�tX{�8z��k��N�{:���>���$���ۭ�;a�}��c���:4#3=#*{�t�t��o;��s(�X;��g�:w4q���oy�gl#9|�ꁧ�#*$=ws�`�x#*#9w�e�5��ۀt�T�P*�=.�Ֆ�1���w���ε�=�f�c��=�jc������:#*$H�W&]6�t�v�Uf7YƦ6�t�8�Ot7��:�|�x�wϞ���۵���ؚ��Gu�x�2����^Iٝ������oc�O}��^�Z�n�p�����^���_���4�#*@#*�#*��#*FM4i�6��56���!�#*zF���� �A2hh�z6�S'��=OPyL51#*#*@#*#*#*$"M��4$�L�LFFLO%G��Jz��T#3<�L�@#*#*#*#*'�RD�LM5OBj�QH��4��4��#*~�#*#*#*#*#*#*"HBh�#*M�4Ę��i��4�?�ҏS��z#*L�S@��#*I�� #*�#*D�h#9m���Ri�FjzF�l����#*#*#*#*��K�ڶ����s��j��s:����DK%>M[N�dH���$����ګD��zV ���?G�o�-�[�F2��V'Ֆx�*��Xu2F$ý>.b���z�t��^ť�����b�g���TCz#9@Eo��t\�W��|��+��;$��!'\������e����F\��K��3����Ls��O�5���5����]˄�3����Ţ�Ģ�k=5Wj�wk]dɲ#3�WZ�[Qm�j���k�Z��kZ�U���k[�R#9 ""Q'9�YD��i����!�BG85[ ��(�"|������B�[^UڝZ5E^��ݴU��DsQP��$eYL�Z� �4�R��i�l� �IMX���2-)F�R�&�,Q���mY�6њK&�Dhͤ�B�"jR�@��MK#*�I�����Rl����%�Jfam#*�M-!�C#*�eL�h6�6���(I��lH��+1(#3�K-#JZ-4��V�mm��X��2���U�Yf�)i4T�MMlfԶ�ٖ�$�H���MFM�fh�*#9$�"X�"F��i��1&������IS"3J��R����B"B�#3��FIR&B4�B���"E(H�2#355f��A%"�K2�5�b��YHd���b�M �RdSL�%&M#31"f��H��cY(ڍE��fI6�IL�66�؉1M)���mI`����P�I)6-I�(����Q "Q�HE"�0E��d1�RDa2���JME�Rlk ��jH�b iM�$ 1�[E�e�2J&�dX�#9�dF�Fl���jiD��)A�,�#314,b#c,l�&-T����)D�-""m4�0�64!$�%�A�FL�6��A�2�ցP��#3%��F,��L&�H�#9(јL�P��A�F&R ���1���ʄ�l�*fme[)�e0���b�͋(Tl�EI�1&�I6H��2T�-3E��ғ6L��Fmi��D`�Q&�`)��i�2�R4A�%�,Y�)��"Cdd�&L�VCE�F2���,EMQI&$�JmMF�"���&#&j4�"m�f� ����3!�" J��Ɣ*i���eb�KI�$�# �-Eb�iBȚ&C�1 �L�jK���D�M2mJi@ɣZa�&e&)C,�"2�$S!�4�15��3&D��Z�մ`�Bjf��I��Y��2H�h5)l#9Y��RiBYR���mL�-�1$b&�)J"f��&����Y��0�o���eF�[# SJ�h���Dm4��6�4ڕ�Qf�)�f�E��XK� �Yi���#30��Q���jKT�a�FLe���T��"�f$3L�Kh�%&�X�QHZ2i�KY��,,m �k4ɓ5&���V�QSe�U&YMc+0���f3*��dF�M2�%L��Y*Ͱ�i�Xڤhb����4J��&��)j+�*��kE&�e��5d�MZ*űh��b�DSIbŋF65���F��l�FJ3`�Ѱi��R Q����I�i�lh�bV-I6�H[Z��Y��d&S5-d�&�ĄJZE��E����1J[5M���K1Z�m��Y)d�jPlam$��f�ƅ��k+6��6��E���ME�$����`MJH�#9��j���S*J��!*(dڊ�4�E&MT�M�)�H6DVY�LJf%�EM2��P��i���ͦ�b�Ʋ�)�Dąh�Aa�� �Z"�h��1����QbJdFcIe��J�#F�a)R�$&�ђ!#936�l�I(��HS1SY")��X�jMIaEhH�T!FKEP��E!��F�2�2��3Y�Mb�Y���cR-EQ�Z3DT4jSI��,Vej4 �bQ�Q��T��(ce4��!I��L��TRji,��m(���d��X��hY����b, ٳC6Ʀ��F��&�LB��MI �h���QF*�e��aIXFY4��R�j(��ʒ�S(��FCD�YIS"-��X֍����YTPV4E�I�-L4B�a5�1Q�-4���B�4I̒��cɋ�کYITkf�&�)�B���̕�J���m����h��J�S4�+m3�5)k)ll%��l���4ԒBA ��E���,IDb6�HjC&d�� h!hҚ���SmIl���i#9i)��$Q�lM-���I��b�h�#Il`�#3�F,��-��&Ս�e(�KT�!�6Ƥ��"�"����R#��$�Ѩ�KY*Yk&�%hm�DTQ$Z��T�mEb�Z�F֓1�f&3��Mh�m4����l��M�Q�l�#)#9��h�`�*,i-F�fX�-3RVœjRf�#3%b�Ec&6+���b�2�Q1%��X�6)�MES#9)%X�ش�[F5���42��Y6���!mF��4eDh��IEP�jJ�36X#BDbI2�dI���E�+DS5S�?�/���5�#D\�;�S.�j�߮J-���?�쟡�j>�lcCHƿbf؆�������]���M�D����cx��?��Kzd2�i#9����2�a�����.CVΞt`����F��\�h�$-*���� /UI���h��T��������G�&�Mxdƣ/��1�硇�{���J�P�>X��ql-�J�J�%=�Aɚ�i���陏��+c�F6�va�'%����l٩8U��#9JLU#*�M�z4,�Mb�G��6%#�&H�cM�#2�RD6_�.�ܲ�.��N�9��T6�S �ɚ!��Ɨ�RR�(�UԂ2F,�Nm����Fs�m,��eAL���i�5�E$E��+���Mp�q��,��m�qp��c#9G�t\��דG�X_Wk�Kb1(*?���/x<^��A;�[b�`ShR,�<�U��-C�EO���pk�c�(`�q��:Ԓ�?6�x�l0�N�-�BJ��J�y��ٹ���\��RSo���ؘ��ň5�K��Xg�yݼ�s�N�ƙ\�4ʐ�Uʺy�D��ξY��F����O���U��r)��9 ��n\����A�&8��m�_#9�Bd<O�G]%�.�I�0却�H�'�跻��{���h��r�NQ�w�ݒDFztj��6�46�8���wTnQҹs%�@ҳ�@��Qd#9�4:ic�b/3�e��`���`5>Gļ��#9#�EH�c�hg�,h�QՋ}�R��#3?kF4������̆�+�)��:i��H*8�����d>�}���g�!l�ȻQF(�n*�3�_ns�s_V,[��i�tEY�IP8x�26`����^���$Pi)��5"�V������e��?�9nN�Vm���՝ɣ'6I}+�u��C2������PW�}��:��>8����|�ݭ��s�m� �6�m|�l�ɺ��F���F� ��b�#9�P���TOd ��e;�6�j4�<\m��QKi����V*v+�E�5K*� ڇٜ\O���S�\-�Ee����؝y���}M�����Xf�D�EtP�1��PX����+W�'�OWn�^�{���z��0�C������y�8�O��E�#a��p��/�7,���j��_uX��KɠFCD)b������҈�j�R��#9�Ru���&�i1���R|��Wxꄡ�4���}�,DM��R���. E�sQ��wѽz��J�T=h�ٚ��v���,YAg�H��F�bZ�T-�cQRm��Sx��E��#�TX)4�@���ޢ�Wf�ـd�%N5��M08m@Z?�CNe��kf���L ���UTAQ#*FE�P6J٨-$�{�xh�ܮ�77��=u�����!Ŵ��T�]����G����e���JEzwլ�����Х��ᡅ9:2���� ���AM�(SvZl� �Jv��J�*6Kn�)i6I�.�/����(*�̣��f�<$��G��5?v�onj��G�q�Q�EO�%xxXZ<����(��e(��v�EՄ;���ɗ�^��~[�N��:���M��:���J�b��.8���\�WHa�*���% �w3$�w���bZj�V�f�m����صII�Q�AQ�p��|�#peKb�M+>?�!y߷I}������d��h��I:W0h�UUP��B�Ј����͝]1I¿*�����ϣn=l�)]=3FJC�2MX/s{u�1\zQeU�~��.H�$6�,�X}�n�0�g;�jC�kwy�=Bl����uFɌ �,~�2�.z�:��\o�Ǐ��.NM�(S�?�;珢�X$M�&ѳ����-z�sP���\��:�k�n����J~\�D�aڟ�YXF|� ��W���U�0Y�+d0����'�%����)l8���b�d):��#Ʊ��p��:a�Q����3��*���su{Ӻ.A�Ht���" &Oδy��.2�>�H�����=v��o������HyV,�t�]�iBL8#9���.�S#7Z����8��闭���fS�ߪt�C5=L��p~���J]�`�!��#.r��W �>i��M!�-��ΰn�c�2���?���f��Z����ԩ��*r���/��N�i�ϳ�`WVo>�����l��t�eG�!c���7�Cj�� ���)f��a�L}:s��6qå�W��,�ܛbpn=��(vѕ�[�t##3ȱ�gY���%$�����LB����;�R\<�P�ϙtjI#n(��p���JG�Q�����h�.�n;����YӦoԄ��Ӄ���c��Xg�]R1#ۿ�8������lI�U#G�G���!�Ǚ������!C�ƶ�ѯ���v`��q6>�uXƬ�!K��������TJNm�*�z�]�8W�� �����O��G?�G[�\��tlE�`��JDN�����)��!�]z�ϙ�ʋ���m�&�]�^�_�ϼ�����]4"�&|���_��������^:���"���Ԗ�����u�#9#g����KW���O��w�`��zU�ʏ+��Q�����C�}w�x���ʙ$Ms#3�������K�P����x*���)��_�v��W��d"�I�]ڪZ����!(�̳e��w�FK��hP`/N�k���o"9f~H���8�4t���)MEoj�O#f.N�'A��?�.����1b3#3>c�(QPGWv��� �`�G�E"���`f����QQx[1H�4��ヲ詥Y�Ҳa>m�;�x��3m/�c�h��=�����E�SҸv���������ߢ"��[]�݀9J��'�p�\��PUj֫9�5d���2T�(B3 ��xb��\J��W�e1��59�5'�aC��)2dRf�qmI=�g �-l �T�iت�U��:�8�ŕ�fދB"��Ic��3H����j Ï�*Z���T��7̡"���۹��f��k�Q�q<n�I�̐��m�����G��A��VG梳m/���.!�ӥ��# ؟�A�}��"#�@�Qh����ʲ�G?�֏M�H��)r�PV&���d�C?8�_-��B��r@�vr]��m��B����]O#*�a�s]6������v�+"�)�HoNI/�����M��-O#9t;G��v{���BqeB�U�r��zw�8W�=�^��h��h��\�v���z��%���vtS���G��H��q�DQ��⃙���o�T<������ޫ���4.����S&rk�~��,�#3�u����ʧ��&<���T�D3\}>G�C�#9EX@ܪ��65���k�oJ�4�1S��}4D� �K���Wʞ�\xP���xy����[ڭ�9م�D�KRa���H��(k~��W,����@�J��{*�)�9������B"��R�"�M�ttm���(=}CKcG�p�l�&��N۳�;}XU��w�A��j��kˏ����6�U�[�5f�;C-���A�pqĩ(�zn���n���=�:%b\l�ݿWeg�>U���q���J%.��� ��á~��US�1"a������Wt��퓯ߛo�[Q�/"�Q�n5 Eu6��IDp]V��f��Ag%7�M��#*�4U��S�O�A�",��E#���_+B���^�������0���(gv6�o�m�գ���ž%�9!�����C���g�F���s�#3�!�ە/�|#*�?w9��S����v7uR�0ϗi�?:�3C4�H>����r"P��1#*�NN�I�ꃭ� P�&�NA�q$��N�+�U0D'�&�^��L"EB��<�aC7jr��9ӭ���ɶ)օZ|�1��Zi{�z�]ݶ�y/#9��#3#3�UG��=i�\���5���zC����pr�!hXҊ�=ʠ1y$j0)�8���Vb0�\9�"6xA+)��o��S�4�[����:��ܖ�%:`�����Ƶ�^77���Ƽ\�0{�M�xb�Z��뛗��}�<�(�f�Tb�Y�]3od;�#���$���X���J�}���r�����J�8%�rC��٩��bh���α#3j�J"F��B�|�rL�<���P���8B��ƕ���㬾��#3��r�#*�ሇ�x�ǵH��L1�6o������݉����rm�,���L��~�����8��(�:�\�(f��OƔ��֓j��{������f�jIzJ�'j@ӥV"����V�Y�T��F}U.���,`��c ������v�m���3أ#`#�����E�䴱�<��-o#9t��#*�b㳜����j�~�Gm��L��v��<[]���)'D�e��H�j��[8o1���~Ű �EBr~/HM%�#+�U10b�]K��#3�R�~jzҙ����m3,+�k���sg��E�Ck��3�E+m"q'��3!�"SB�T �x���m�W��8[�*6�� Je��`m͑,�g����9��Y�`�#;����5����ȹև*�ŊۡIQ1A�۟�-h��a����4��6�nH0�p�I�����Ο,kJ&���?��2<�#9��5�Z��k�S�H��NjDuq�x����+b>p���J#3�#9#3�Ʈ}�Ϋ��T�eM^;wno�ȥ�U�']e�ѱ���kLF�o�����h#3>��s?f=����v[֎��1$�$����n�V@�>k��B?.�| Qq�RM���=wv|D���#���!�o���h7���]Z����BE�f��;� ��p����`x����rd�h*Qő�7� �FW��?��8���n��69F�<�7m��E�L�c����E��y�����6�k@2���9Er�tSU��ohsz[�Q>��)��f��u�]P��f8u���[�4팍95w?g+��i)se{-pҦ��g�7�V`������Ѵ�m#3�t���#3�8���`�X*ZQ�g*dC�X���q�C��Yo�"���zVm���b�o�햚.��4��]#*̠��v>v.5bգC�m�Q��8�����������>���V�/�[�ȂoI.5���#�Y����ܱ��t��\J1k��h`C|������i3Z�S��TB4�aq��#����c��Ar�-C�O�����b�n�M�uҟ'�[H�����2{%=��w/f(2G![�q�u;s�^e1�Ql�a��$�k�yb�qv�w7�I��Gˠ���I[��O�Y|'�U2�����`�'k ��s�JFS ���]��F�e��5�Ɗ��E��`AH�W0q��f�HeN���̽U^�4���x�*Efh�4����=���2�Ӿ�pS���q@��v��<os#3��A[�Bٗ�@H0\ּ��}�Ù����FOqm�d��/�8�碨�@W�E!���fp'Q�a��0�=��,���^���Xw9���R���AK��Q��)q�Ƒ�`�����(I�g($�R͢�b�FR��r�%3��.(����"�FI�>��/Z+��>:�����f����?�Z�:rm~*�Z�e�k`�q�a+�h"[N]EU8���(���!�<B@se�X*��Wl�})`��}��\��)��^u���f�:�GKpҷ�f�N�48I��!@�"��#*�'=�hl{��c,W���V�y �P�����P��>��D�?��CO��g$6�1�܂EA�b��'����wv����=h��q�<�ۋg�����o=s��ƍo��5��>P$RF�@���^���:$��n��!ft#9`:\z����sdJ��|H�'[1�� Ѓ��h[�;7��?ݣ��Y�?#3�[ٰ�l��7�Q�XʎZ_r D�8tNf�+"Y�E����)^Tq����dON�כ��틀�r�b4�s�2�_eҝ��0:� w�7ۆ�'b�4�)v��'�{K�v���yu��B偻e^y�9�k���C(�爻T˂�2a�^���m2u�o�֮<�����C�ז��j,s7XS�q� $43��{��^�Ȝš��r�PٯD���%�������Sm���� E�j�,�$�ߵZ�m����O�x��x<�e�s;b'���zIV�HlHt,ű��9��TT�#9n�iww%\�՛�:��c#3���͔������c��Ϛ����x���:M|������c ���?����fB�+Єd#*�S����`Q:�8s��}��ٸ���L�#������|Uݧ��*||�>^49h�:Y�l�d,*�0F���o�sR�\� ��7�5������$BD�� �������%�c#3.�ج���ݲ���#92n��8�Cr]#9�9�J g��,:AJB����bw��HY��x�݅�&����g�ݿՇ�v��k�o']QP0w��������[)��N��p1#3|�y1��#9�I#9/J�m�K��ps�>ý&Z�y@�$��B"P'o��_�#*_L�e�@�%�o�� W�L��#�-��*T�1��f`5���U?�����Z��K�_2.��#ư�n#�6��t��E����ߦNQǵ��C`Ƈɑ{�(Ȣ)��>�9������MSF�S\E����#3xF�R�:n%���q�:"��4�P[l���#35��s�J�>�}��"w���X�d"£:7�c�5�6�ÿ3ݒ�aI}����6y�[��qT6���Kc��<A3C��Z���t�����f:b��Y���%e�=��}����G���_0���̏�` l��a��|q�=yq#3���Lfն�B�wa�h6I��;�/�������5OuRBd�����.00�A�o�P� <Q��T#*9��$���yb�=#@�@��#3ofI�����ٵ�6��.r�9�W�逿]�i���w�j�#3��#�j]���;�K��}�G�t�����ä1�7m��N���}���w�: ���ʣ���D���=3�<w��OH� nv �]ى���0怳��ϻ��"=QQB�IP7���#*�H�丅�/a�h�U���q-c&�R*�yt��d�#}'�\~�HbRVR�c���:�KѠH�b"PZ��s5Q��C}��9e�+Tˋ���{�������a�9���.x��8�! c(q��Ѷ1��>?xZx�((H&�;���6��M2U�@TA۷F3�C��/�'��&��L�]�#3-&IK��6g,���dI�;��1S�}��#97߱��L�^2�"��O�?0JfB�P�^]���^���mJ�l���7�>�Q�-��o(!q����U`�B&f�<�#�ӥ��垚��1W���4��t�=��OL���i��=��?��\�B�s�G���>��߬��.ߩ[S0#9��d�T��P��'K2ηG���z{v����鹴�9��d��kA�����,!n��m�(��l6=b��~3�<����:��$,n�nJ���]�X$ݙ�E�X���?�Z�;�z��)�8��c ����p�"���{Ѥذ�4�t��n��ַ��N( n���!�,4��N-��ż��pz���nL�<��RN(X�����Y�)%��[0���]��x/�=3����@���m��>Vo��,)��3�5���C�V���)#M�����0�ڻ����ŭ9Ҭ0��m��''�`z#*���1( ���4ygR��]����͜��M���H�#9���#3�io3��&��L��;Kc��v�='M0����F�M|ኟ�ƄOJ�u��o�4�ɃoU� �j�!�o����a����e��F��ˏ˚ZV����(F���,ab�H�Uy��W���me��ᴇNщL�<~-HI%�ɏ����P���#pb.�\*��c@����7+N�[#9��#�P�FP���Yږ2�j�N��~�a�n"C6��a�j�{ό�?�`zg7�0I�����!��LJ��s�=<���J,]@��A#����c����{lem�LL�̕�#�J���!����W�3�ڨ�ճ�XԺ,5��H$w�PN����G��|z�ۅm}M��s����Rd���n�A���Xޠ�\�<����j�!;>N���>�.N�J&dDb���a</m>�sW�:8��2Q`4����Y9�%5�C�"�bSJ�l,al^;8�Ʀ@���cb)SҦ7�8��0c��\�f�����M�xq�:f=�Pi�9�-�� LǶ<2��>}��|s2�H��#Q���߷��7�9�l�����s��?�3��*#9�:A(#9#*�S���{���c�����z�5�7f��<�+�#9��(ؚ�H#*�^�#*���`,�7P � �fB�y�<hCm#�U<�YXDZ�t4(��\SA�0�E)<�r�63�2�M��^�b<`|1�G��).Iԥ�V�(����[T&R���Z\,J2�s]xt�`Vbp"��W�y�W8�kF�H@(W*�#3Q2�"���������"�(X�bka ȩ��{��@th[�\��WcP����hc%E�Y��F��;B�SZ�#3��dș�į�y��n���'x}v��c�<�Gw��5��=��(�t�#3�Nr�r4��+:un8z�~����%��1<����w��2��8$��j�swF!�1��I:����:2�#�C�����!L;l�*��;�����R�p�f�A�{��4{����Y�^W=�)HH╎\���ĵ���d��W4s��7He�w|#3�ϯm�%���.�+בѺ���ɷՅO���z�Fu㑺W� !9w!2����'��ƒ�X��:�HV<�� S��OE�>��`E64�G�tP�,�W/WZiw&���:��6��q �(�c��^X������=�#9͖2x�B%�]�y�k����a��F�ݺF�ܴj4�%9�~���'�~�i��j+��|�x�F��CR@2EʅUP�e����#�Z$gOw�^� ��0mP���1��@6#*��N7�h�l���y��O>�ɪ�tō,o�Ӫ�h�D��n����k}*2;�QI�I�BiV�jHb�����=9���;���bEj�d�4�P���nz6�p�6�Ƅ>#,��o�fLcLJ5/I��c����c�B�朆$�@���L�A�p��L���)���"�d�`P #9�'}�4��Xh�ێdY�66�Q���J�5�˲���Z\ev}�R|�<�C4�}}({T�r���8��t�����{�����*�a������$q�!A����f�c���w��䞬١�~���K�<z�\ ��Z4���up1zj[�*�wy�vA7�T��{2r5���kL�}�U�ip(�ܺ9+�����c�R�z�DFƢ�P�8���[%0��e�'�%@p�� ´�1b1ʼn �(]e�d�`ĉ��m���;�w(�'��~��ds�=EF�h��m��/�צ6���=���F�ʼn�-{$���ƍ��j��c�+c�uR�'��X�U�#9��BDE#*X|�����[�N�V3;1$o�y���U�/i�-/�^������'�x�-g�7��_Lߧ���ǙX��ꀵA[�T�����Sh��>憕�7�2�9` F�9�g�;Psq����>d�5ƽ�1Nm����eN�2|�,Q��d!�9ż�ul#9?�/{����(�Z�� 6}��z-�z���(a��f��3�ԯ/aOR, ���]Ѹzdp\L�x�ǘ�#]��&��h��q��`a����T�mjmș�ʺ��Qa��>�[;q|w��#9����fq����oy(sO���-��C�Kl&H���0A"�;v�8Y)_&`�/a!�� ��zp�H[�Æ��G������N��;h���*rYz9 Dw�cT�X\���ko�f��s�ۊHZ��وɸ%g�٭^�sΡCKձ���RS�W|Dz� �2�NN��$��������km�O��#�@iÅg/!��kT�AE`�A����Kc�q#Vы�Xw#3e��Ŵ����d�̇~�����r�#�rHQkO$�((�G8�~$�\aEA���G�#3i���ٕ�%$Ma�Mn�VT?�gr�e!���Hܷ��f7?ؼ��D䋟�ߒ�0Ci��4���N�h,���F�Jf�$=�#9�����(dY�$��E�4'�F��5��F:Ep[̐�A7P����\ԈmZP�9e�0 4B0\8�b���JEڥ�4�Y#90�7��iRa�2ա�#����U#9�Ǧa�A��`ZiI�.�|tA�r��"�݊�CӦ�zaS ���G�!3�E��csƋV��4�%7~յO*�1�!��a����),j]���ڝ����j@�tG=*��0���J�v�(�db)4d��L�TE��.��䣻�o��7��͈WPs";��O�~p������^�ls��I:�����3B���X4�p��#��>.�{O��ioﶔ����p�:;�PRBH��Ǻ�G�_�;��x��ugޜ��I�%�I:���c�b}Nj�S�#��4R�� n�7D�g)e�˴b��OI��,�;�`�����r�KcE���đ���}Ӕ��'��4O���{u�|�Vr��Ӷa<6})�n�]F�~�cnz�_�lV>��k��l}�1��S�z�R�B��>�5���~�ţa!�a���N#7Q7U��M{v�i���0�8h3��P�{.����2��?���A���x}��c#e�����J8�CZ���f��\�L͊<��u��b'�u����ϳ~���FnX����a�L��V�2D�ݬ��RJ���}ܞ������:��}9l��5-��F��Fm�reZH�QB�UQC���ᬹ��6���P��D�KQ#9r����<!GJD.��XY�.-��1�#9ܒ߀T����r��J�'����3ý���Y�/G�6{�ꔠH�U��ـ���ABN俅t>�"�ۡ�#9n�"R!���9U��c���9dIɷ�;�p ��#3�q-p5���Qq�`{m�]��ȹ�ˡ��AIF@�-ͭt�H�ͺV�����"4���f!���1�ZYiOe#}cVR/�p`�k�k��I�K�Cxw�2��@�0�-�F�,�-k�e��q����A�� �AO�"���}E���ȼ��sˬ?!z����x�����|#FG/��ϕ�����ha�aΥٌ�8j������J-߷`�����}�����3��Wt4>b�"����y������6�J�>��{XY���H�5 �-T���x��A�ޫ�Nd1HV���T�D)��wV��o����/%%�ԃjE#9"(�>�͉*�X(��f�ņ>pr0�#3#9x^-6��#�O����ϱ�/��7'��|�n�����!O�(��Ɓ,0��#9DNd�I>��5 _)�=7r���{6�/��Ⱥ��,�0Y$��;�����zE��#9������[#3�Yd�"#*s�m����^~�8t���c�=���)u�R����x�$vÐ����|�8����j�V�oA����!�G�0��ԬC����T�y/rM#*�]����tE'�ηy*:��H��'�v3�y=�������#֩g�z_��U�Q���eȍ�A�5��?�ؽݡ����������g;Ww:o�2yxv���b��9�-�#9�Z�������?�v�V�$8���L_�e�g�����OB#9l٭ ?sAd�����u�������Tz1��ɷ�h���h).�w��_�o��j���b,*[��kAͩ,�$�l�bQ�bh�b��^�۵k-��K\��#3��)1�@�<)��>$���i��j#9aD#������_[~�I��ֿ������6y�h6E)^��qJ�N a:i��i]=(�����粍\�E͊��()%*A>wB�3^�k���:{����.��(�1����g��f��4�k���e��kn��6�w����K?[&�01�*#�'&�����Q�ޥ\Cm�$��*nB�TQ<��z�N��}z����{lj�m6#�E��Q�iؤ����f��g�~���y�0�rE��xXʟ���M����f�ɧR�A�Q~���q��?�D������4��7��V����ks«#*ߙ@��Xs�,�G1���C1�u�4T;D�f>O��$9u�m~�s}�u��X�'�HL���٧�W����G��� Jy;��7���'��#����B�#90���M�#3����'V��Q�k�=��b՝+}Xϟ�I���1G��O�����H��6t����~��`�?4��۟��:X~���4�o|$_���$z��;>�7������!�����}!�Υ�s�T���h.6���t#31���}���D��O9��]>�����냗ퟘ�u� |K���E�dS��f�����c�6j���x�q���_5�:�م��� ��uG"y�3ɽ�ɶ�v�=��V~]w��is��};��??��Z7��mK������Y�'�;��i����&�x�����6��i�z`b�"�UL���������T[�r��!ݾ����b��@S'�����(���FoZR��,>ek#*l9h6�(#܌�X�0b�3����#9�7�˝��w6�?��ƈeNê���P\���M�08��v�%��j����'����C���-��f�a?���v��z����?Q�O�3�ϥc�'� �G�p�P���[~�#*���T�a���H��ҽ�o*��� �Ө#�w��� 2 ����a�и�QX�"¹|�����x�Y���1�Rt�l<��m��k�c�da�����(�5z�Yi},P�W&=Lz������{���B@i�W��+ʀ���X+MS���� �?���s����'i��S{邴qA�<^�e7r?�Tj;����Ƒ��;l�~`=v=i�(/�H��y�#*������2�A�1BD��ڪ}�M=}���d:�ؼ�8�쓻�ɽ�)�GA��hm���r�㩀��E:Y >�^��"���7|/�i�Hs�����$�>�O�F;�C$���F��s�ɪT�#wu��4�g���$<���ȷ��SՕ�>yΨpO�0�eܡX��fl��{/�A�!L��#9H���<�$�h�W�`X���Ā���%�o���t+~�����CuLlA�����.O�w@��K��߇F��������X�G�o>�����#V�����4oW��6���v�o-�W7@��/�4�}�VN�_�Fe/[5�U˧}����/���g�b��_.���/����{��o�Ϡ���Jp+��c�dTJ�{n���w��K�����'�Nw�|h����n~�C��⾹����jv;W�?Ç�g�F~ch�;ӎ��t|�;x0\�G0���v�N���o&��G��ۗ�!勇�IOҞ��9�d��>T��|.�_�W�[��=Y�Vt�d-àW�r��|^:�1-RC��ɐ�\����[)����˺#3t-�����c��0�����W%����ͮ�ӊr����lc#35m_GD�����ݪ���q�W��R˄���zR����m���Z��X�J.�6�o�G���,�+l�j��m悌i#3~,�Y�ytqa�F��[-�W�(��~�]|�s���ph<ȹΪ���{�����f��u�ܞ�nLw[��͇�Iݬ����yȗ����W_�9o�lwl���a�b��Y7:�=W�o�'��;9'�ѭ�)2C��'P�O ���r����M�=�Gɵ���e6�Ӳ����6'8�Wy98��6����u/���#3��O�{]��|�j��kI#3&<�\v��c��+��p#9��]��g���ׅ�:���;�67U�����.t��k�D}���f��؆6e��?9�@eh���ƙx��8\�x�|{��r�����,��y(���n��9������,����5t���cLE�����^��/w�T��.�Z�f��(��Q?�+�:���Só.Ǝ�xL?1���&6j�A�հ_�M?}�#Q��;Ϧ���R-#*�H�m�O��W��u0ݮK�[GͷC�g����zz��#�գ��+�#3�p8�X�O%�jycO�~X8��3���hdTǕ�����x�_�䝗W��-��m����I��������{�m�e����#9�?��=��,���T}��?�t�/�Rwz�W^���/;iiw����[Z��������#9(FAs���(]���ឃ�N����n��$��E#3�ƮH#*����Dh³��D����ax�#9/2H�vTgݮ��6�j�|�?�ϲj��{B~����p�o�5�8�j�}^�����b�f����e���;�";/��D�>�Z�.�f����.�����"w:z�p�|t�w�}]?�]�������A�<x���?XP�n-��L�\��@6~�;��(?�~��o�(��L�����W�6��*ّ�o��ջ�z���6�B]��o��p��5G�o�t��A��Ty��Mi��`��k��KP���!��������o��b^��� �B^��~�\�����#G�l2N�c��ڇ���~�d�ߐM��D�H"\�'&���g�;�Or�m<��#ͺ1b��qv �l��]����Y�%�ϊv��4Q��<��adhH�<}�ʪ1Ӈ���}��}8�r�u?|F� >IaQO^�aP�gyT��zƫ�Q����i��0&��qu^M�v`LW��N��>t"�:�����LDֽ9rk�q�f�_u���<)�w?#��iP�j�����lpz�@�]|��%�U3壈�z�v$\=S3�$�!�Kܣ�t��Z���ڛ�.:wwHyi�������~����T9#*�&���S�nK]=��#*�E{�w��0k�T��0��qN\���#9�N�ϕd��l�Z�*;}��g8z=�� �.'�wr�E�kX�������uwƱq��g��_�i�2��N�y���qOd]�|��Q�Z6���U5�ȴ� P�wV��M�����M4�D�,���=�܂�ԃ!���E�Ŗ��%�:'����=�����*�Ȣa�|��=�^�}���A );����$�o�#9#*��Sq�u��.e���>0o5��h�5�F�G����d(���~Br���K����5��m�ÏH�z� x��+dWkwY}L,�#3_A��qy��Q�G�N��+V�ڕ�����~�#QG^� V�Vi���l����Waٍ�_��4��}��TտU*[���L���X�pf�y�|\���O q�*a�)�(�O�gI�^�m����;�ϵv�<�������͚mk�/���(��z��$��_G��C�å�'�1�A�Z��<��99�;�g�,d��~^�#3��o#*3A�K��c�Ē���a���*?��d�S�!�/F�����%<����#���2#*��������o���?7�F��d��ʏ�\?�Z,̹��,0�!1�#3AȑFd�|�+Z�#3*�m������T�M��ǒ�H*������d.�����,�f��SVe�H���0�%i�[�M`��cX�L�� Ց447B�K#3X��++#��p���Ѽ8�� �`�f!�IUD����|уa ��#oh�W}UR�#3�X���/u��}??��]�ga((>߷�~Kī;��7�@w6�c��[�����\xV�3�={-!a�lar(��e�a���<�?�o�M���,�C�3�C���yB��V�1�#�����]�-&�2#3�#9��$��j�&��l��IT���&�$�f�?�j����n��F?�+ֆ�*iôO����8`��ݯ*��sx�k�a��R�s��ݕٟ.�<ݯ�J�/���~ݾ��^A�U����|�^:�?����^��w�7�❟����s�����G�<�"�!�V�}����1����y�v[bͯ;-��{c�p�ɶ?X���8\Q��"�CbA$I>�}����==����_�n�Z��"�@�!W���Ǒ�&�USo�����W��S�p��ה:p^��������qs��r�NkCξ������Tإ������~���]��ݜ���&��&�����{�-�� ���}�o�@ v,�$�!�~С���i��x��|�����lbhͯ#��<Up�VҋP���;�v%F�CC(��/Z<��c��2�M�F���f'�h1CbGV�#9���"#3A�6��h���$��^B���Ƙ:�#9�V[?g��F��RVGMf�#3���^7L�'ɮ�+��+r�G����7<Y�#��J��#9�)X2���il��h'��6�l��4Dl�b��P�$�13&���s"�H#N㣩e-�g$��8o�B�P4�#9,%1���rC#*!���&9\H9w�q]���LH�dJ����n���6=&D�J,ҠW�E#!h"�;�ޡ�cF�j`*�p#��R1�l�`�p��G���fpW��x�#9I$Q� ������*U䱄�"���gJk�@`�����%�~ql��y:]m����E�������w4d9��������ਧ�V������O\=��c���@��1��<��C����=���Wag�=�z5E�O0� ���i̢�"6�:뛹����x��gX���\���!dDD���^���e��?~��#*�5�Z�{?������p_�Nsfc���G�����Btď�}��f�q��a���#�lA�}�r�]*#9�$�eUV��G���hM =,IB�����<�>��9G�/��^Q�B�/�D����pT�n��t�����UQ�?ܣ��J���{x��_����J%ٰc^��FV�cnF�z;:f����[�H��\��S]�y$�$%��ٳW�y9#���3#*����F�?���w��*�H����('بb��U�����ڤld�q",CQ/�b�?�.�ʹKˣ�H�7b�����>��/��e��l�������aW�T������#*v,� 0X�F3,=I�"��e_���'�639f4Ɔ%��F��Ԙ�*G">i0�-�#3�T)8#9�X�"��)�=e��VƈS�#J�R0�i�IpE30�B��j412��X]�k���^��Mu��C�7��y#9�FC�Ѣ�b�~��f�ɸ��#3�Xن��kV#9>ũ��ۜcX1�H�ٮϔs��Q��7Φ�a�2�fV�Z�K"d:�\l�R"H(��h�`a��ш0�#3��6��h�fԇV"��p��I���X6�jn����[2��LQnj����L4��`�̼�B��a��%*QT*th��.�D���>����t:w��(�s�GHO#���!�?O�~�d��*5#*!#9*���v�ng���x��>���5$3�i��ަ�3#3�x�l�e�1~�>�)���O�d��#3�q�o�>;���_�{�ӷL枞:�f��`'�|c�y��ͯїJt�u������k���<y+Ed�Ab�X�����Vʪ `ӌ��{���"#r:E����cH�:}���`��.�H�)FD���f�lj���j�[� ��/�NU �~!����0��b尰��St⊗���ʊ`4��R�h�D�р�L�0�E����X��*�EP�T������c1�O�T�Rn��Q2�c�Q�g���q�_]�}|���r���㋾ZE�j�'ψ��o�4�$O���_��)�c��nϮJ.ZV�)jip�ln���� �2�6B�.��C���St�;���廉�֘Hy�#C�#����UI��ud�)`A��<���h�#9F��*��j#3��+�q�����tF��pV@�k:���(7ߘ-���s+XpJ1��P�E�XJeJMA��Ri��GP2'=�`�vE�I���cր�ѻ����e]�ÌcL|�hGb�G�|����5w.�I�������Y���֬i1�A�=�>��'�q""v��#3��hW�Q1��#38�H�F���SX����`V�qX�(G�I�H�Zb9B�*���k@W����n��F�w�cx��L�k�������>V惩�uO������a�|G���?ve�m�NG������c+2&t�:�����҃6C��~$��m��`��N��N,��݇��5�H_��;��6��}�ś0�� �vo����Ud:#T&�m+;�h�j��w���u�O��IB��ۀ��7�Sú��wv�Զ��L�|Xڭa9���odM�����M��@o���f�{y6���7�:XĐ;"Q@�teJf�ŠP����y�Ab�>U�`�5/<5��~+����/������j��aXRRga�1f����8|K"�sm�ә��17ԩK8T8���~g�uŢ,2эfqFB#5;�Q�J��u#3S�}��yX��6㍼��L����J'�3{����l�����2�E�; �A�Ħ�N�>�q��L����N�Q��� zqy�r���}�&�����[ț���ﷃR�'u�:�d�J�/;U]�ʨ.g=�p�A��<r���)�\�v�. ���~L)��K!օ���=���w9�i��Z�]D|䜸kq��"Gw�������|E��K��m��:��+&��X��lsynƸM�e���!X �Pk���l-�,tc�t�ՎЉъn��8�d��͕2���F�nj����mEk:�'n��$f �LkB�ˑ��䓝��B[��Z/�.��P�#3�]��,���y&֤��#3����e�{�V6'�A��~�հp8Sϓ�kT�u��@�@������='����@t��:9V���q�C�q���,Wu|%���[#3N���4r'b.�z#����Q��)SU��#3%�\dI��i��Q']?��ݓ�4��=���?aT'��!Q5|�؋�V���Ï,�����]QY˔������P��C��h}$���DJ���njl�����J��7d�N�0��t)yW�>G�.�O#9ì=z��-v>m��/ʷ��j1`3����45?��IӥR���٬:&��l�^�4���I��p�9���½���4@�̶Z���3�+�/��u]k]V�ӰB| �#3��[a����B��#�5�o(�|��J�}�g�89mA�����m��&�R�=�3�6�߃��Tq��Π�.5Y��#3q'm��m{��B��E�8i�d&���!z�Xm���SL%ZW��p�i�K�W|���D0��TT�9��aĉ9⅙X��NR�L��6��<��v낞I�Y��3L�s&ƳqcjP��9��h��(��Qb�;������m�<���>=�On���'���i%0��f4٧ԅ&�M��-�Z�͆�0Z���#9����l���Q�m�����#[�RE��W�q<j�^5#�[��H��E ��&�2fF�y��B5�1���r�Dz#y�2�x�m-E�����7sh�28����;���w�/���[�F�����t��XY���ݧo���"�_�����+4��Ǚ4��t7��]�����~���ж�Ri9�a�����nR��ffysp�@�EK}�'���{�F��q���+��mlO��nvk�3��w��A���S�K��,v��0>��&�ँ��{�t�u�xC��j�x^1KW�(��*R]\���|�~?�|b�e_6֠fB��-��2[`�x#9@��̲�W~���g�{8]�v��i�����rc�{s�#*�U�>\��G�W�73�o����5ݥ'ໄ��$����;���d���w9*=�d�*?�с�<��#3F}a���d#9���;?@Q��M�STu��D���5T?���h;����^�O�~�">Y"�d�p|jj�m�&����K��90���䌧aW9w�1�p�ހw���DŽ�#OV���qB�����&�zt�ny灲)IQ�%�ar�(AF���%�{� �&�5�U�5�h��D�p�+P��b��q�A�4:4sUo#�8�0�%1RnLD�6���#*��1�3�$T���#9��6=C�M_��0�Yi��d�R��/��6�h��:�G!Fm���3EI�Z����>,�.��$�0�Q�~�L�5ΰ�ŝ�0R)�0�#3T��dk�W�"B�_r���.��wn��Q��:�+��>�H^�e�&^`�D�G%3�`%x^~�4!6[�`2���YGQ�E�_t�&����I=�K܂̈́rl�d{�Ŭ_#3��� ���� �϶�淟J��s��Y�SI#u��)���F�P���-��u�#*�Ywr�G�CM�<�Ԥl�Ѳ�Si����z�+U�N-<�����:�����.zt��G�)X�ޠ�5��O���xCl�(��ld6��Ԧ�84I|���6x?��G����w ��'ܴ$���Z�Y��Dx38/,��9�\�O|2ݧX��Oն��#9l(j�j�wI7(�R}2gVU�G��s����HZa�hXyXyu���k�Oצ��"�!4�~kvͱ��Q�3���h����#2�9�4W=�(`�#3{R{���gh����F��T�]R�����=�@�4���3"�x`71�TJ#9�M��.J����%�1U#9]Q�۫�nMF_��f�FIo�,�1ט-Q���DV�YC�Qv�� �s�!�4ո[��#906��Gy��S�� 2TO��jan�k3]��2��4]� �+���Na:n��r�OWo$�H�x��W#9�咧ׇ����K=��}��6n�N�tL\�語m@���F<�E#9n~��6���Q�{l�;�t�t�&����*��h��"Bj~��9���o=m�H� f%FA�a��9[ô⠘��,�?��q��_�C��zdόa�k ��V�t�a.��N��-�i�)�El��6�G�>|G]��ih�iZ���������x��6m��e�HBs�SAd��-�%lW9+S8$g�k�o�;R�Zv�|���O�:��4Fىv��ߎ�(g���C�ռ2N#��u���tc�����t����t���d��r�NH���:������T�,�WE"řr���#5��f�WK])��V2b��Ɨ8@�%��)��zzj�=���v0 ��2$ ��4-�Y�V� ����kn�HA���N���$#3��Aٹݍ-�0��-��W)>�v�m'��r���g��bn�[@B�j�ޡ�f�u28H�Y��ɮ1�6<�0D���n�H�R�wۓ*f��6��9�SHq����'տ���O|�/,���FIN������ښ8x�t(���M9�?���hwg�r��D�6�zl���d#3x3������o�j�q��z.+f�i�_3s&p�t�s(�/u��w;��~)����H@���#3�SA�����.����b֯B��f�#���?�)�2����}cϧ�g�j";�N��^���r��K�U9B����e�������{��oF�3��� �?6� ���E��D�O���R @}�I�ۨ�=���"�G�h���3�ǐ��o�\�t���0�y�"i�fز�Q�f�G��ԎlE8��yB���څ}��e��i����l���J�{,0`vy ��L$Gd]���.����=9��n��S<J�fQ�M<���#3�^�p����.a+�p�Ow�l��\��劙L��ޞE������#3��;�dM,��H��3��-�4�d�>��Q��L��� P�"�A#9r��R;�Y���������BM�C����������"x��շ,A���M@W_�iR�X:�N��C_`���w�E�b.b¡�$�����߂�DU���sY�-�y��SBj�>�W�����{ѬU���ۼ����q%0���q?X�= �y^������D��g<{�I8�w�D$�ã��R��`��b3F���� |��~��܁���8�rs��Nތ5�����j����g�j�U����Ĩ�&���T�G���ݪ�W�b\��*�R�}���γZ�jX���n��Е�:q�p}��C#9��F4�p�P���t�ζ����Tp��^�kFo�^*$���rz��Ol�b,�pQ#9�]�/l��<�Db#3(-i�\�rɢ�� �E!E��ގ����#9e!O,u��#T�������Q�|d��pm�g°��F���=�#9ے�tWN8YI��,3VUc�B�VX�Sϲ�_��[7(ZK���&�f�����\�>�R��P%��aG��!�y0���kA��ܳ ����5���Ud�Y͆�j0�Y��X�8it-��%�0u�E唰\#��Ƹ>I�]��㫰\��k�,���!M����OjC1#*��^��B�r�p�`��8�����h�e�U��Z\Y7AӘ5�b� �h�"wB���J꽇�Tn��L%h��B�<� 0�_{�0W\�؝��R)�%I��D�Z��㱯���S>�u�u}�VA2�ݢ#*r���3��Y%��ѕ���_�I&5��Ӫ67;=q��e�E�3SO5�""��'��sj�^4�����M*�aFf66��`U��<E���PZ���AZ|Y���QƳ2�(i����P_�_�����vz���\�קT����w�Y��L���h��EO�#��X=K�M[n�q{�dJ��qn�A�/�5��JN^bvӎغ;e� ���@��ࢵg��\j�Ŋ�d'����g��!%��U}����GMC=���=�����'���w��{����r�OM#v��h���s3J��<�����U��q���B�v�hT[?a#3.���Q��%�{�����m`�g� �`{�m����,�d�#9�s�������}Wd��1u���w&8�9D_╮�o8����;�5�� �U���h{�s��_�J�Q�h�9��®s��O�9�njKWM��NW�4�n�?4x��sy�[R�E�TuVl^/_ë�c��ʺ���E�#3��˒��b�,C6�-A�IC�M��l��Eg����}�/j��)����LQ���]�"��.�J�ѐN�#9�n���STy!H����.{ͅ��G�����q:.Yh雁t������惄�B3��sd��ֺ��J���9λt��#*_U��~ǃK�q�V1ѥK*�[z�*�Z��v�����6����{�庯l-�W2&ʍ�g��E����_(+�,�A�s�Y����۞N}�� F�N�j���/�A��EY��l��-Ս,U��J�H���F 2�i:V��'@�������(ϞBT`�y������s��4�{��g��u�<#���9�@�tY��mQ��-l���D�8b*��~Q�9Y�n�x��;��ذ�Մ�����諜�JO��U���l2�#9HL�G#9���s��Wc���R���v���g��(�#��tl�ߺm.<J�j �[9�X�V�Vkb=���ߝΖ�҃Y:]�����0�gDg��~���W#91G�նz�qVZ�]%P��6`K?�����a�~{���0�����1�X�ӥ�z}5,�rT�Ƃ�DP����T9��:�pʶ�J!l1X8F��1����m�k_�n��K��߶�����V6��iP�Y��3�4e�����d��C�Dݝ����el�Zpt+l$�>���k���S�ZSjUm/�)���5w���6d���Qu�y߾믞���w����wjs3�;g�&^H<�L�>8�Vs�{qǕ�*5�T��h_�t���R���$=���{�>*,;N�ڪx����tM�����ZhQ�#9�J���3�8#9c�)��&�-b���uimU�U!��fC�W%DsS��7��t�0B���}�g��佪�uJa�C{v�7_fyQ�?��5��o��V��v�[�%`��IE�F��qxp#�̴"��f��G^e�^��.���VҨ�9�9���'���+�?B�Ο+y��=�S���t~8{���k���u����9lP��fDt��]��Q�#9M���w���n8G�T"���8�9��K����Zog�����fS�pr�^8���#3)���˵�/�m,%X`�)��k�+)=�) ����nz��2�uy��_��r��@(��h8�_9cX�y�1L6���P���Ϧ�����G��������R�xw]Xz��|b<p_�8��{�@�[%�E�9��)t`5X�U �����*Ks�s�6_���r�� �&�#9z7w<�97�}p{���s}2os#9�O�O'�-�;���q�`�L���T��:���6m����9M"�e��/�o9�e5Z�|�jUL$���N�Rc�v�.��r�ۋ����gS�DM�b�#9w4�X���#��w��CO6\�ō ��t�+~Ռ�Tt�Á�"��ņ�E��43�NbnISٕ�]�эJ�ҏ5�H�ejᆧ2u跱Ҽ��wP0�v���#3e�Y��#9Q@�s�7wui�)�>(��X��O3�,#3q^#9�G7$��ϻ�f��{��[q>q�_m�@#9��k���#u��#*ͱR���j�S��+�S�|Z!���?�N��՜ް*��Cy�P5�Pd���_)�#9��v�W��c��Q)}~�K���������AF�JC����H��j�H^emg �͔D���#�����hq�X�&�&��8�'[�RȎi�6�ᝯ���+����k�#97�m��V�IJ�VSs9��/�����]�����d�-�:f��ë�˭�I� S�M�Tr����\�g�()�ٺv��Z�X/��4���{���s�Oߑx��J>oP<l����ݐ�9<C`�x<q������E���^�"����?O��Uʉ�3�ݭ#��bl�������� �����)__E#9�s%���@p:Ǣ�����5��p�]v��E`[V�����;�g�VUf��%���Ҏ�сr�+�����T���[2�(F`(���]#9������ܲ��bs�#���=�]��3B7��TM�.�>ΜW��G��灌���4f\�2�y�o��ل�0����=�b���n�XH��0=">�Մ��M=&���j�+���̫�������7���}T]�C�����۵��l�m4�Y�C�GQ�<�]���#9د`�v�/.�.N���Av +���M���vU������(�R)T%��MѭD��+�Z���5���w�G;�H���]V<��8��d�ݡt�<&����ݗ�sd�Y���3��=�O�5K�zRI��c�r�)����棟�+�c��o@��k�]�,��b�R ����:e�Iw���$��]]�r%Y�Nv�|����i��3#3:r�}_+�|�O]��nw���BD��q$�֟���κ)��4���5�m��lm�caۗ3����9�iQ�6���fv�#��|g���en�7���#3�~�/�66��ӵ��\mL���7����#�����=����oƐ�j����-ы[���Dq�`|C�#9�v���<���GN�Y��n��D��K��d�N��bA'���1�/g��u�$�u&�]�N�b�g�5s��$}f���v�z1@}*�<��>:"����!l����5�h�h�L��=j���0#â� �M3����'�;F��Αߍq7��G?�0r��b�Aͼ/�ʹ��҃j1.+���?��Z�3���t�� y�1e7��+���0\6h��R�e;�^�o�$H#9�m�tSaXu�=�� �� [��R��١�.x�j.���у�@�����)��ȼrg�\S��;����!����#*�Ed��o��p#9d���c���9&�_��x��7���y4��3�x_#9s[c���Wd�Z%K��M~�l��s�#3�*I>(�<�7��m��b����#̶j=���ߞnΦϧ%A�7HG�>�,q=�1i�PN�W�{��z5J#*���k�s�5)"[��]��xX�:pu����|�����]�m�G�䇷:�õP�J���j��L:m�Of#���SdK��Б�n�-�K�/K������h��3����q���~��,r㐜x�F���_:�PN^p��<�rM�!���>K�=��l�Fɇ�p�%��,�t�F�n_�\T R�z���RH�r�������>s��=J���C�����;��#)�)�����)i��P����]�z&���B�0QnJ���y�Sש��{����5OK��锫������yj���7��ә�Hb#9H+����ˇ�V���>�;N�^T�uL鸘#*Ŏ��/L�hV��փw�m�E�(���V��A��,.���Ԩ(���:#*�IA��E�Zv��k�x>\��6p�P�A4�Ymt��#*�XY�U4T�i$�[���э�^����><����Znei����!n����U=�n�4����J��N�/��ֺc%R:��3�)>�i�J��L9���#9@�Z'e�8Wku�9��˭��|@ԓ�<�?�(�t��y�:��a���(.[4A��d���T�/<q���;��IN`[�H�]J�����?;�����$�@�t�m�inm#D�M�Z�N`�W�8��P�$�~��ԟNBe�l_PSp����Ӈ���E�#39�a�����#*�_���ύ߫�x'� �yz�\�e+W�F�(�!IDNaԋQ̎.��^��� !�����A��\�$/�}b��M��y����|�Qۣ�#������\�C?B�L���Ͽ��b�rψc4���?�1���-p��+�<�~�s"K;���s�V��u3��%���o��_��)��M�kh֮#9�^����V헥}�TxL >�4X��o��s:���m��H�qp��(k���L���m���ɖ/�����H���I#*��`o@�qv��g��n�Ԟ�&���,Q)��w���sR��guvZ?�y�#���̓��BW.���[���|�o����`�F���W�8B&ތ����7�̱c��!TiV�V���ޤ�TI$#3�JeB�d�k�����7|���h\K��f����o_}|��|\�RD䜖Q� )o��;��k|�f/��>!g���Z#�#*��w��9_�G�ma3אm?�������}`l��X����Lt�c��L#3�.����;�ՂE�%~����A\%�)w0��'vh TK�aP�-����>YɁđ?G��ڢ�A�<�l]r�Z����G��a�hbD#9}s������K�mZ�T��.5y�����1�������g��U���_x"�B7e��_�N��B�(�:l5GV�8�����Gk�Is�/�x���T�к�O0�E�D��`��!��8m�w�F$m����q`u#3�|g��D�@6�B��ԡ� ,��eN�uCT�����=���+��s���|�<MjN�F��Y#*C߶�(w�2`��h�,�����J�$&�#�E�|+F3Qi3�@3-J܁�/���:Ġ��X3%��n#{lK+�x�QS�C8���ӷv�g ��5��z?�:^����#35��m%z��0�Eyc�B��0����tp����_�タ{߳�|�d{�� &�M#9�CA����m�!�O*��BߕYq8(mT">д�F$�#3�����M�"��w�#9Dh�}[��j�I4*��y�/H�8���$�*��Ǖ-��kv���C�(`L$�};(�;6�G�ΠJO~��=~��9����q�|��#3��#�=E�u�%�$Ys������f>s�5�cJ���"�&<i�H�;�#:�l-�"9��BQ�o��#�={7�c[_sl�k%�W���\���ETܿ[s���#3F��Sѽ�:����َ.Ƥ;! ��0�r��ק�<d�A4�Zd�8c~=�(k3�8{�M �-6���Erl�; �0�f�E�R1#����3�P�K��p"���Vy�_o��Iא��^s�t���빀:�B��Zu�{b�Z��]Q�"��1!-�A S�W8�1��I!`@Y(VPw@���`�J#*l*��N��@?fC*!!tq���80Ë��ߟ0 �1 i>28��8N_�II�;(��q���͢�� PB� �#3Ꜥh�XږD#�a���L��MJ�?U!��&Ai�m��~_/�:m�o����ͯ2����!���� �c�P�Ʉ�(�\�b�C��@�qߵ��R����,-�:�#*fQ%�=H�Ӷ���>�&�D.Mu��Û�K=��*5#*5Q5�Fs� ���+�%�-NAևs�ߐ��+�%:��� ������\:n��/����c�<��`IÛPxJe6�W�y�N����@���0�L#*2R!�6�J\�x���2@��;�-3t\�G�v�����J�t��+(l#-����z�/0���t�|c�������t��E)����ð���'<@�B[�S�n�-��\�N��y�L�҂���<��V����n!��@�Crp}���=��B�T�[Ǜ���'����O��7X�0�f�.'8���fY��w�m|�!\��L��I��G;�!�`K�����K#*�m�0M�hK�s\�h�.Ivv�OYD�(����t_т��t{6͐o��¯�SX!�~e���zT��� �K|����L�$���Cn|�1�}��?.WmT��"��ɘm pA�LÝd�)���?U�<��m�߶�h8,����?H��T~�(!eR��we�켨�Y�#3���S{�Tz���ߠlj�����+�nK$��#|`�9`�_�rB��Qɋ�bZ�,e��������w�������E�#9�#3qnǁ'$�[#*nK� Qp�r��P#�j/�0��tng�����_8/4��{�[�����%�&⒒��dWw,/�m/�z9�N���#3����vјt��!�K�����g�Ri���%��F*F��e�Q$��Rb(^�P�,����G���!.C� �����F�v�0�w*��)Up�K8�0S���{�I#3'�#*���ó��3P������ڼ��n�i��s���VQ�;�i�`)D�}13���G�y���MT�m�#90)���(��ꮊ�r����p 7�`ʙ��<!N*R�O�t\l��вo�R@�t�ƨS@�Mc��}�R�\י-�nn�J�A�B �y;�����N��\�M��!�����z��fӇ�d]��z����t`�aZ<����#3Xvz���=�Gϲz�xv����Y�QŃ���mO�A�F�r�P`\���n>��b��]�m+K��a#9Q������UP��M��.���C��q���]�y�����Ԑ�h4<�r �PB%3緔�x/��lE���S��W�U7-��gl�m�N���h������M*�3���:�춝���!���u�����CL�v�H��1�i��e�7m���� ,����IFF<w-{P#C���s�J+��R���6ҟ����!�>d�Y�s�SW��;2#*� A�l�#3Ac�!j圉�uoS�lz�Cw��A���̾�����٘F�;�=�G�V.���*� ፞�1Sf�ZH�60�ӧn�-�|��0���3��On��_h��51�PP`��W�E����]�JL#9J{��!]H����~F��P��%1�#9#9�G���R9)���]T�ϛ�5I)� �EQ�{�fJl8����MRa����l��)Z#�*)��#9�Y�"�Jkv�ߡ;u���?�QhJU`w���~j��SL��@6��S�.���W�P��!�t�aQ��Ί����FI�=^��HL�T_������o4R{�}'�ݻO�~a>t�R|/?��F�K~U}#9�je��Y��(�$�P�?�����#*&>A@>�c<s�S:�.2�#*��֨Y� ީyIw�o�{��m���V�8\*;�{%:D�}�)n�; %�[�McP!#Ѻ�Hl��r�,�;�{]�v�o�m��״���y������꜡I�I���gq��kE��Xr�'P�����F�T�ӏwz��f#[5R�ȌbY��1��k{�����ۉDZ�yg5@�rYp��>8�����!���|;�{���.{�0���VA���E�>R��"���w��(��z������M�#�_���0R��:�<�~oٴ|�F�h�n�E n#3�,R, �����M]��,��(��z#9�<oN^�o�����2@r����A�@ ����0������/���98t>�jvL2��U��Ho�O�'H�R�/Y�Cbx�i@u(e�����Z��}��#9@3,��t�Y����w�w�l�4gaؖ#* ��E�wB����ј�1R�Q&���叾#9�!��%��) �e�GE��t�s)(#*�`���V��b��(j�5J4�/t��̶Y�;�Q�a� �D�ܔ�����j$��$'��T�*�Z-�t��{I>�2��;��=�+�+ ������ ���e�w�o��l8�ƶO� ����?|�Z�*�ۥ.:,l0�E*��><��=4Nz�_�~4To��*�-b&Y3�Bs��d���S�]����Σ�M!+�AO��=��{�.l`Y}d���#�p�@ 6�����[t�|���O�C���ĸa�H)6�~-D�Cbl�/;%�r�,S���n��K�GaH�6��kO�r��QC������y���`2�%ee_�%\/b0��uy�V���R�*8��*©����h�)Ӥ�\2N�V0�RUT������pd�CFj�T2���YǥS���8���:���yb�l���쩢���y�Z�_Ν�ULBgL���8|�g�zQ�Z�C�1��i���5�{�?0��lfо��mJ���Q!#9����ɸı�X�hɢ���E$%3J�kL�)��^}7�著%UP�U0�N���sp���kg��;�H�rs,繶��\L��Ltɷ#9B��*Tq��H���Њ%��Ev{(`m�;ῲ�߷]�S�xޘ��ȉ �'7��ʆ��{��Ý�$Db#9r��60N�I�xbV}-H%�7 �]��!���;�hg��d.ô5���I�Dq#*�z9Q#9��U#3�T� ��Ԁ�F�:m�����(o�qú��t#9�Mr����N@�T�¤�I�/u��w�p�'r�M �h0�N�|�y��Y������l�&U�gQ4�v#3����|<���bυ/^�7J�:'�z#���%�y1C�5.P�1D�ŭzƯ����k\�V����KN��0�a% B� S#*D RBH")y��i�p%�s#9�I'4*�0\�:)6VP\�"m0�Y�9�Bf+�M5#9%�EJm��2&c�l##*��9��9��c鎉�v�d��5)�k���ȵ�48����N���q�[��R Ҿ��Cў��KSꕏ*���x�Mg@l�0U"2#9�"�#*�j;bZG��.��ق���S�_CCy��O#B�����"��ٙ4ށ����U�(ڌФ���*�RZ�T)�:dq��zg}N���v("[�S1C�ٛV+l� J9vƥ�$�#9�2�"5h �*��dY���#�P#3D��9����*�7� TBT���{���Q8gK�'d��~�#9�ZB��xuɐ`TEXR�M��FLD�q�ђ̔l!��^9(���5�K� �]��N�w�ʓ�Ɍc"����f�&�X L�ߧˏD�_.5�O�|�A~'T8�%N���~LY�bP�ו%�.��� c�����UX���7��!�u�V��b�Z��ĒH�m� ԓc�J�xs�$�)֬T��{^y��?m�U!R"�#9E��-�@�Ӈu#3pe �"�(M�PB0��ѕ�S�n����5���"�{q'P�RLp�R��5Y$"(��M瘧)lk��T��LZ��k�tEM�^�y|Q(PUz�V:�s�$������M�]���Cs&^#U`:SQ}<x��{+\�H:-ۧ����|,#3�)3�iu��@�n�����ӛ��`�z]!�2��«ɚ$��iDΙ�H�ED�Ci�����7��r�&�W+�KY����"|�v0u�?�G]m��%��3g`}��;�i��SU��c��wY1��I�3#3���tff��G��r�6veϧ��8�uN;�wG��{��ij�T�Ic`���y�������ͬ`g�*���#y��⦼���ا�Ƴ'��}�ƞ!r�D�����:���64�S��ɩ������N��eɷ�+��di�Hg����k�8n����|��kgm��r�*�Q#34�$EM#+�a�xEʽ�s�HH�$l~����?i$=ip�z�X���z�qI^/��at��1�tر��^�����2Mn�oTw�Q#3�c��H������C������� ���S���1����O�m���Ux��x���T�=.�A�yh`��6L�b#3��H4���Q�5�!��&FSV�/�������Nm���o��G�)F�$��D��ť���ֶ#3�)f�-;Td��!zX@�V;�ᶱTÈ��*D���f�ۄ�Ҕ_,��K{���7Hpp��,#"�8��IJ�;�Y��p6(1���Q�6k��N�85_:�[�^�����c[�;:~T�0~�:�Er���MQ�G|�����u�P��ѷ�� �9:�Y�1-�HS���{Ym��:v��(_}ʁ��erGɃ�j)�T}�8�G��DI϶��Xn���T���.Ҡ�i4�"�j�O�������N2��S]Ae�:�v ��6�1�#���EZg�Sq2G¥P�[-����$=4䠢Ŗ\f���Ǝ�o ��N���ؚ�ȯ����N>��Èr{�Y���:MJ���"0c_��I��`ƙqBȗ��w�G��Y!D�'"H�_#9�=1�΄��@=W�r��u���E�=����P�$�:b�/vٺ��9#9$����M�7}�4�!�� ]�b�=�ۓ�9��3�V(>Q�a���A��U|��ZƐq�$8B�T��D�7�s���e5���;#9h+�N�ئA�V�)Y�rP��aP����!��!���~K��3}�aͦ,�k�^O��'c�i��ޯ�"����r��#9: g* t�z��e���=�I#900dh=t����d�#��i!dK�5C����&N��f��%�ڹ�D�R<��yMQ��Sc5������mXQ�T�D�����CNJ3�=u�~8�I �ۣ$�:�#3@99�<�@_��w��*Z��C���m�=m��.��/�`�Ĵ<�#*�GʠOM#9��r��N�jKN��+ � z��g7j���l+����*��k�1����E�eP;�N�-�؝q�uk�>�����dlϷî�̉�/������c��yL�8�` �!�������DC^+|�JNi�.�(e�#9c������Z:�?�;�O��}�(y���,��dM�8�����v��C]�!���S���~�L$���f����N�|,�L��E�Rʂ?��0�扩�U�BZ [��/cE|J��N���`hgD�X�o#3����2�7=�_8��t���c+�Ђ���$iΫ2;bb~��%���,t[�AK��^�<1�� �N�#3Lzs1B�c�8v���:>f�)*���s�cx�*�~ �-�z2dq#ꌖ�Ln�� ��L4AO��?���m��.�����Sl�A?/JAQ,��兹O���V/�N�n�* ^9ݳ��Z�mΉa��c:R������U,� ��z���\æ���ɤ�#3�V����g�B\�e��x�o9�@�"\��#*?����og�����#�e��V#3���c,J~N�{K�13/ƣ�W��7;���_�}��W���1N�����!t�UX���R"��~y�7�9�|l�l�0���>��(��L�l���=_/�Ҝ�ަ��rL$<�#9p���??�$�}�P��T!�~@�������=58�����@����_���ВQS#9^T~�A�_C����R�j˖���>�/��/�t�m��+ם���t��A������G�>��SzG��� :� �)5Q���v���~��eM�=�.�9�UΌo��x����7���#9�1�G̳��%�L_Y�ֺ�n� �a�"�tGe#*JggP�܉�WliP���}8Asպ��T�?����*��u�j�Ɠ{�v��V���K�`Z�]�ӌ4�=��A��V�^#*��#9@�+xT[�G(m�.G#9�e�͝XG��L�}���?�'l�e����G�+�i�����#3(�ۙ�[�K�@�ª1��7�|}�5�Yi���}#3{�!��:~?F��jL�d�$��P��Mh��<�~?��������������j�gG�ҿ��X��R����OSb{�j(��-�H��p�/�B�>�L���?1r�O����MY�?����k�﹪�S}xq�h�Ilz)TWe�������?^� v�����O-�?�4�:��Cc�/_3��_\�}x5�iDY�㣫O���<:��A1jy��h�wz����j���Ʊq*���i�����Δ�#�g��/+ca�#*Q�4����e�#9�7Vy{��>+Y���v�w��~���� O������/�|#3��6ε{D�ϷO���!L<D�x�0$AFKbK��{�����p\�+ŵ���i+��b�� �{���6��Yȧ:�X��� nz��z,�l�GV��~k#�6��#�b�K�4\���hX{@��G�P��?������۰C���n�O5m����#Ҹ�(������m��2�(+�!�C�:-�������_�wU����#�#*��r��mp�P��'���u9��YD 2#*��yuDEM%0�9�o�@����7�H'�×w�y�ydEJ�%�j�t���n�Ts���� m.Һ�����"#3��ء4#*Gv�Z�H�)�{7��!�-ON�À��nÿ���\�s,��/�W�/^7_�֯�Ʒ�W'�Þ��K��U$�n>��LD���#3"�1��7������I�*7�,����f�Z|�` 䢺�`�����)�a�T>�,���$���W�va����~�p���%q#?'Z�B?L-g�ì��B0���fB�f:w��*3���96��V���b�m#9Q�����9��x������?|��?��m獊S�P2���g#����N˩;q���\q��`����T!G�s���g�9=6���rs��w!<��촮�}}�P{�*w'�z}Ò1O��Mr� �����������1�bj6r/װ�U����A#9'TR2�ן��(�� #3��T%�6�/=#3���6����z4�����%.����p��Z��e?�ǟ�k���7 ��P�1���� ����v~n�<.}h)6�|�6 Ȑ~]s�f7�wgDf0_ٷGGO�?$a@��� W:���#*י����`�|��7lÒ�_t$������El��-O��D�n�"F�_F7e�/�P#33��o�0������a��u����}%&}/�#*���y���}\%$P��>6~f�BnL�W�]��03��{agHuͬ_���k�'�9����*1����C{��)UR�0Є��H�?S)�!#9v#��>��{����6�?�9�X����<dql�C`��PP�6�).zE�����7���s0q83X��USijx1�����ɞ&��^Z�F+��}G�#3�BKaχ�f���$tƱ��R~��N�����������ʾ��ń��;��F�u��M��D��tg��z�l�h�}�r7���]Uͦ"��n$�dE[�'�m���R��RZ\��-�{[ɶ�:�����Q�F>�(�U�{��_{��>�p�mVbA�C+<?��4,56��5�#�WY����$m��x� ����q��?ܝ��A�?��_4��~��r>>W�970�̠3u�N���pϝ�oǓ�W����WYR��:�ou��u�,xe��\j���Uly`���i?�g�Q�٦���f��Q.���`�Q��A��"㧛�הA���#*��/~5�����&V�e|���x�4�U�~���=��MՔTQ��n��"���Vrѥ2�3�d�,1���k�2�(�W,�%�M�I���T�ܳ�&Ҽvߣ�NO����xj�st�ٷ�!��~�d*��6ˊbR��cc�B�X���}�w���|��3���:�+9n}"�=�����Vc�.�wĸ��;t��v��=BX��Ҳ���w��#9x��:������ݖ4h4� �t�g���!.�l3�+�>�;ht���&���i���b<�Ԧ�S��V���\������/0�X�K�:�=��}�u�DJ|)#3j��BL�8@Cn�=(�Q�Z+�h��?>s��� �!�g5�T�������4�l<+�Y�7�~������x�_Ƿ�!�!�j���0�����i��Nj%�$���U��}�]'m>5����h�5EÁT�}�xe#9|�:Y��l�|�Q����O�GI~�U4�\7���� ���؉�1�k��̾=9���elQ�����n��o����Zu�#9�Dt�w}%㢑���A���[��s$!�zlc{�B�P������NOs�t���_O7�g�1�fe.$A#*�F�Y��K��:�� *�%���䷲L�����ʮ�Dra��sJ�9Q��k3�H�s�+4.H@��lt��|Qh~ܺ"��X��`G��s��vC�yW=���J ��H��������#�rl�;Ӵ#���VS&��L��oB���$ WA#3����W�bC����������Ť�k��`P٬T�*�b�Cڙ��JS����.;h���.�1�V|~�3n/'��峞N���f�A;a�\o�z�6�9*"}�{݂�����_K�[��"-?{$��ph�8:1M��gȹ�3IQ^�&�Q�= ��L}t�~pD��;��+���գ��+��#�k��n9�����m�_�G��ŞC��%���K�%���#95e/����ָ���Bu�t3���]���7�3ސv�k�R*6��6��c��#9���W݆<���o����L��4_��a��̝������8��g�?���GQ�^C�������Gd&���_p��.ָN������5d����skKGt����ўah������;��u��i�HB8U¸��BY�1����=�#3����Y�����\;(�{XJJE!�a�ެȜՊn�aJ��Ov�����m|�}c �:��9�ވ�E��K�:��2#3��2�wY�1ˆ���#9���#��g'#����sD$s�#9��'�*80v��/9�[�U�QAI)�t@�J!�<J���P[�*�6JJ��}���*�6n#*1�)b$��]�_.����S�=�^���mB��h�3���s�g�d��ў+�`p���9��A��2���m�����R�.�{�(�ÿ�t2�E|é�˫�pl��u��CS�[�TTB��tN�d4Y�qߵ��:O7�Bx�;��;m�wO?��I��3iW(z��#*̍#*Ȃ��V#�%����<��u��L?.�ܾ�{��j������e�)CT�F�A�t�D�3�a��4BZOb�E&,V)i6����G����ǥ��C掹�����#3��y�a`pq��0�� ���of/���aF�(%�XCI�3�"���dm�6"d#*����x�J�ȗ�-�#��Q֫S�/�!��Q�ܕ��;���A/ɛV1#9{|ҁ��s�3�r�1�H]p6Al���"�W�},'f:�t�GE���pX���ji�����������0=?iX��[���y6b��<p~U�3냩���ӣ���خNÝ���a����5���z��ʙ����_�"@�0�1D@rS����G���\��� ���7�_W�8`��^���n�a�l� Q��>�u����^n���N{#9E��̲)#*��wW�����<#����qO�#3;2T�F��'��S�=t�ÿ#S#2Օ����Oe���V��m��I;l���e8���Y��0�GN3�ٕ�5��z�������>����ë���˷%{�C 1Z����;�?<��~&�x�������O��M���u�G�������Q�]��]:��y�6O������ܡL<h0��Ɔ~R'��8~o�_�m�I|C){�lu��%��:1�7c-s���M;Wdm�J� `�O�S��dx��E���(�E�؟/�O?�YN#9�DƎa�CڷX��H.)���H$������1@w���7���� ��s#*�f���'�&���~�QE#9#*��z��� �����֍ݡ?W���17;�;j�Q]n�<�8���ox��:C�.%����0����g�+���$?)i�n���t���$FC��� $J�)�r��{��gG*�7y��?l�fe�!����YSm����C�Ov��qv8슑y\��"p���#*� ���^h������#9>��ۙ�$e���ո��8;�'�x��ҋ^��>�:���]����mr��)�Dd&�2�V�����^�U�q�y�<�����#*X��˖Ĩ(0ÙĹ#*QH4<@���#*�Arppig��2�C#*�*�ǰ�e^'ep�B�{��H��f#9�y�xs�_��^X��7ͱ:)��r �K�m44�E����=4Ff�k��[�>�;9�CT�~�r#*����$���ł��ű�����{���f�� �����C嵺�r��SRT��,_����?��i��{QC��k��j�,��Q�~D+&ѱ2�@�Y��(��݆�l�p�M�~Q�Dp�}��l��.}���/��w�l�L�,�&�T�Cg��e;#8���n$�c���Ѐ��:�#*���j�9jW$��O��zD�e{푢'���6�[�`������H`���w>��o-qx�Y��w:��{4ۣ����Z��I#*�T-o��<M�?L�6�;J#��<�U#3���I�=��g[��������O����y��-���ȉ��ʬ�̐J7�N:#�]�6�B��O�ܲh������:�����G��U#*����Ua��9ާ;�f�D��)�(p^}ʓs�7�4��xLo�!�b1C�t�X{��0�#9GSwdlf���f<Y�o:�'�#3>�[�Ď����b_���h��\Ag^�rм�Wɿ���s�`�5o:��SW'M6�%��*�Tz�qP[#*im(Ԑc3␅ ����ʾ_�l���%�0�P�nD��rɏnG2������C�0sS1+mʗzH�4+����q@)RH�c�04e%#92��G�+m�*7�yw�\.1-��P+��b�#9�������E.����\�Hׇ��#�Ŕ���҅��~��G=q�p��R����9т�[C7��{YS&�K��-��9�|��ip�N�k��vZ7s$q�L4����A8�`i�`� pYG�#*�_�"_E����!&�߮���]l��0�DQ���5�z�M�jjJ�D�������Y�0;5E����c[�z2�n�"�[��U���{��꾯���N�K��6�[�Z��t�#O��=qր0(J0���T3u��d���R�U\6g�w^ܾ����RJӲa[wϥ��9���J|_qN;�a���d¡��| ���[qsF��٦���%��g����T<.XC��q/9ŖZU�����AD�'<���(Sn`��s�q�4t��Gج���U+�o�]|C�gm�;��a���'O=N�L�\���W`�� ���e���A��q�'���P=J�ΰ吵��̇A��}��\�w��iT{��&Ԫ2���(Z�j\Q���&�~20��>�>g��ᚘ�ǪO���,�E]�p544|^�1�JN��z��Ӷ�\9*g��.�G�G���"ޔ+C����&�{sl����W�.��c����zɑy;g����n���#�#3$�̔��F}�)���.u�,�S�D�,��fXd�/�=\h6�i��Cb��m+PS2|��n���IOd#*s��#*�`���f/#L����ھ��=[�py-Q����{�_N��l��r�9g��Nj*��y�a4!�5:rlQ�!�3_$b>j�c5������l iS��0�̞{Ҿ����ϲ��KaX�#9�C�!6˗%�ݴ�m�alb�~O%��(��,`��zH��f�H�E��IԒd�K��F�,�R��$���l�x��+�(��HAȪ9F�.g-~:�A�k�щ��@"����������/ 2�SX�9�l�˯ 1@�@\�����#*��3�-ɒ3�0�,�k����&��d0�JDp��c�^9�14&� 4-�b�����6�0�h7e�*�������=��nd뗊�I�@�\HI��ǓG\��_�U�7e�\6�"��/F�m]��$���-̷�n�,�ڼ�����k#3�h��q�^��\�A�[��s�J���x�M�#`�v�rڸJ�wa��9�.����"�Y�V��#9X��c� �;#9n��2�Z#�C1��|l��g�Z�Վ����?q��+�ӹ��g����̢VK#9f�TH`���#**���Q"�*�[%}x4�oK��ݨ�����Z�YcL��>�][Y��@2�T6�H���8D�&"���6��[f���_e�Rk� ��a8��OIFAjo<�jI$�p�go4��D�������(h#9$@���!�0���u��}yU`�$QAK��� ��p��y��;�"("rK�,�8<\U�.�ϊ�?(�Q��f�E�>0��p�)#9>���ٙl����i�5��։c*ׁ֡v����Ph�=q)��Ԃ:���l�y�Z���5M��u�(]�0���Q���x0|�ڃ���k�Ќ�\M%x�(*7e|�?�2�%۠n!��Z�t&�eۆ�]���zE��0�Yl՚{-��p��w���62���솰�z�,�y�#9�ֳ�rD$1a� ʿ8��t��`1�t0��;u9O>�O�=�������2܇=Xܳ���p��6s������h(@4P�D���T�~�\SA�#pkē�$S7Ii'�Ց�m�y!�lU9��I#3x��ɓɁ�� %F�xrC����.(�B��"WK��|؇��k#3�-�@1#3FDtu��m�^�%�B�d�OfBu9裝�g��E��q�p��}r�*Aqu�Ќ��鰠�DA�߾��?x��0�=�.���T4!�bS�3e2��x�:�h2Q���L���2)!�t�2�|W��&����،���IZ�6樝���#3c��{놑ѣ�Z2��Z�\�� L&��G����c_��1�Qƴ�hǔ8]��T�mQ����C��4� v�Ǫ��bߟ�:f���F�ht��I�U�Xu��k6_S E�Ty'��=jx"��Fd�-l���u7B:AiAmoB�`[mX�D����w��N�1�8�Qn%�i�ԖZ�P�6�YA1��:ĴpQr;n�w�F5ׯ[��`U�E¨��'D�e���Bq�3�פ�.���"���K�<I��V��i�B��đ�C8���Q��[���F'�Qn#*xDL`;k(��3^�@A��9��ߕr�9W�@�#9���DO��c���V������A�M!�K��[�����&�Mʀ�8ptu+*��#*���ߖ�_���(�>߰h�}���b?�����@w�vx��W�^C��ͷ�Tt~5L$Vt��FX���0��RA�8h��B�暤�@�7��튍u�Esk���_�;vv#�T����x˭��P�T,�l�i�x��͑jh���X����Ї�����]a�9#*��Vo���y���kN<#*}3���ܛB�#3N٦�5�y��^_�W�wO��<�п�|'��C���!�P��.�00?��~0�7�mt���M��gR���C˔��R�#3�K7?��������)UU���/����o�,#*�u��U(��02��JW!�Ƚ����z��z���ח����)�'���aC�#9@�@�ǬR���L�(b��f��S�_�%Բ����j������x�v��ܙ0�M�rb,#*��v���#3�mg����ެ�{�lq>�e� ݡa��N�M�p���Q��70;��pt�#���8*�S46��p��G�1+��ړ����y�,<q(�C\ѽ�*�W\_�J0#*�Cl�Z���tyUN�3�k��`��;����#�$:�|�����[�����W��#3ࣼ�#3�#9�������?;��ȇ�`�"�C�����8%��х�\��wxf���f�[X��G��0�@��P�7HA;��߽��u����=�" ��w*�=>V݅8���3S:-p����I�]�G�7�}<��Y.�N��7?�< k��pSR��{m�B���Z������h�q�P#*)X�p��W��%;R�������9��}�o�W����y�u{�62˕���(���ռt���r���=9{��j���\�f�ήa �P,�*�d#9�.����}�f��5n�})j#3l��l� zxй���H[���>�7�������:�P#9.!f)K�Ӎ]�rI����,#*?[a�����E9 ��x�L��-Eb�� p2���a2u��������MѲ�\��X��3>ZT��r����������;��9��t,x�]��7����&�p�܍�7�)�Ġ��Q�y�p�c�.� HRϭ�T�hD�@�ł�#9D��G@�^���KJQ�$��l��Pu\�N��k�#�J��;K\̬��U\0pqlF�Ы�a��z�I-���|R���41�'��h������+�q��xe� �?��������r鷣�ι���&��h�a5L3̳��ƵR�f�C�ş�μ`w�������j+���A�8�?�����5\Į�H%܄���B���Oӄv<�?U�ˬ��d%*=1����j�X<<1��>-�� �&$���3�"�H�JKC��ژ<))Xzr=�P�U���j+�W�kv�9uϧ��L��цר#9w��3~k�5k?A���-�#3А+dG�ȟO�w�8���#9'���{�=(�t��O]@��S����B �֥��}�Na��g�|���0��W�%C�����s���g�ʪBG�5��t���P�Gg��zJ�J�j�����sq��!�M�6�T��u�!��R哗*���X����k�I���v�?SݎRˎ�lY���$�RUS�I$���į��5���t���)�]��8��>/:g�^��p�# �ï�#(m9�Fk������jY�OJ! J��@sGp#4�=���<�����}���:~��~zo����1O�8��I?a�0���2�)_����}�?3��3��0}�ǿ�`cڿ��16��u��L9�[Mo�h�#3Ь��lP+-"���H�zz�X�$�m����Y��?_�~���Xo���G���<n,��jvi�-�x�&�vwμ���s��n�v p��A�O��$� W�c�{=M���,"F#3�gW���U�l���p�1l #HB �6�?��.����L�o���&�t��;�5~Q#9#3?O����#3�{�:��$(i�^]jmw�O����S�������%��8 ["�!���d�9�8��#*B�~Գ�f`6�����D?���0�\��5��o�-h�\9�f�SMHI��De�#�3Sz@���#3��n���#9�SX�v�Ot ,<��R&���_Pk78'_(I�.�ҏOTS�0<�����c�FɈ@�5$�B�������}��B߁��!��cA�{��ІAw��Wd�����#9�?o���Co��ƺz��&�d�LȢLc��`ޚ����Y���p�nwg[�g��,e3D��6�F�OZգL�F�n�Vj�O��N*n�l�]r��Q�n�^��I3uk���Z���y������Yk�c�+00��e�1 `��=S5����xC�]��1՚5�m�u�cQ����W3������Ţ%��}Q#*���T�N�#bi��dz���d�?i1�J��&6^�mC����c�Ȅ�N�S�z�gP#�"JnI���0���W��Qb�쫈�'�e��{?������:)��;9��C���-����M���!9�#R>ǐ����i.�|/ݩ�����#1������ҝ�ȝ#9�ܻ�k " �-�Rm(2d�?�ۍc97�����U��W��lF����)k�ݺ&W�f^%���%M���)5ӌ�]:��~E>G�btm=QI�;��vE�3+�\�/~Jn����f���G3�ӣ})���<�$� ���~�t�7jSr����I���D�����l0Y����h&_�>53���r������/�7�}~�4����Q� ��<i���ЊJ��J_��&���K��_��������ߦz0�]��|�G��Kr�%SE-HT$!!��#b����{&�[�#3n!l�|Uovj�T/%(4��*&G��n�Y�gS]!ťxm>�Vx���Ξk��x{��-$���������}�of��$��y��(��@�[P��I'��O�XKb����b�����&�������!|CG+#*k�;�������b�+�?�o,#*���r"9�#*@#*l������v�T/�G�o�9۠zva�$ �}�Ëb�鯺�'�+��ǹ#*l��Ah��_q��c���ȸ��?�OT������&����I�G��W�6��`X,!���pȡ"B�;sAcϥ���8僟u�,cN@x�~��;0�ڧ8�����������!�#*��"�H����Ǵ&S$�Q���)@�p��]�/�9;�0#3�G�ӣpB�q�O���Si*~�A��5���<!I�H�+ � ����i�;U�#�. ����$�So�˞ ��~:�8�A���#*�)�Hh�C�>�����G���`�����?>c������&?6~��/�'ء�b�2���@ w���#*�;ɸx,1/Z��+�h}��'���=O?������U�[��0��|T��f!!��d�I�@�����~#*;��`�X��t@H����JE$�;N��O��cq��B���~2��cD�j�:*4�F2r!k3/�v�|�ȹ�t���A<�D+����#�\�+�~S�RV �:~��a�<3����|J�����:��'�H���C�ʟ����L�,O�*�^��9����r�C�r��ȺV�O�d�<u�q�VD/ej"4��IG&�@e�%�mUM(�xlk#9�&$hJe��TN;;�(q5������ʽk턙�� vō��;��4LJ0�Z��m�ҋc� s��+�o}|}i��C��8��x���"�#*H.��$�ZЫF��O�:��J2�/��z�L��`Z6:UIV��� �'ë��z� :S��>�ޣ�;Dr:�ytN��D�#*��m�=����KlzC@#9s)�T��<W�>S�:_�?ǁ�@�ó�����?����1�ȓ2��[#����������4D���*(�([��Dpuwe(�`i��x��`i�$n3�-P�hx��k�{}���<���5�Oa�Q� ��)�dhU��Fm��=ȕ��V�Ͼ���G(��(����W��;Ȇߔ(T�#*��c�ED7m6��I�~�����h���g#9\�vmP���N��/�$\�#*k���;>�I!Gg"t�73k�+���zwX�^h�ڗ�����v�=���s�L����:@\�,)BB�B���"��3ꕠkE�#*�=��@��� ��o���2� ��(��*������M�U^�U� UE{<��� �3�a�k�`��٭�a�]˗#�[eb\y#IS9��#*6�L bl�E� !�{ ����#*DP}��RBn��FѓE�av/eI<b. �1R#*�(�"QT��uL�pH�qm#*&�?̪��K�λzm:��>�o��l2�_њ>w۩�J�U5��;��T#3� �e$�v�rv�0�Q)ئf�C�jX�J#9Nd܍�0�~�����;Ut U_�Eû�rK�z'r��0+��!쭿dB�5���z�|�uơ���d�2Q_�ʣnj�+��km�*VVj�j-f),Sh�"22ߙ�-��=���/���p�2���=��>��pJ#9�u����$Z��")g4���aI����0���3�7�s����0n�#*iЅ�M*���@�aH@��P1#3%wt�`��q�J �_J:����J^OD�;kǡ���]!%�FGQ��:y��p�aދeizx�#3v8r&|��I9VȬ����C�i�!�������(������t��By�'m����1�B���8�l-�*�G3n[p�s����{L1Z���<4��I"�t��Jb��(��NCz,���=�Gi@=ʼ��$��~n#9��'S�y����[����>����Ԩy��(Iܕ���ZZy��ԅ�l�!kģ�[IVI$}��&��t38w�֤(a���]C{�pK�HQA�ET��ϕ�Yn��ӒGaDs�'$/�_�/6("N�!nj�C$i�7�AN�(O�o����������G�;�2F#I����q)c�h��$�#�'��1G�UI��Q���2{+>�g_��G����B0����J�78�[,�c$����0��[@�T�;;4�L�P237��?#`�����Fcg�����~�I�B���?J�^_��9�VW�B�y�&�#9|�p���%�#*�D������E�'���S�E�n|u�d�v��?'������A�J�EQ��3�B�#9r���|�T�W�'Н� ��XQX�hM&���Rd��gp� �{�R@�R�W�!p�d>�uP|���+������j����ZE)`�\\���fǁ��\Ng1��@����wvt������n�>A(#*�Ӓ���\�%R����Y.)S#*���=��������f�F�اX{�K�����Y�q�H�sP#3 ��"�D�#3��@o�K�s���p�"�x��2��t�QU�S1�C,(���>�0�!@��g7?Њ9vx��ED��T����o��qVq����j#3�@*�J�8i�!�T�}�Q#3�v����S���B��E�"�3�!�~��F���F�<c��#3��{���I6�Cq���i&r��70li��yމ&�v%�8�(��w_�{���s�q������!�:���*�*�I��#�+��U��ԍ=*h6���#�Ij�`����=�%��/���+�â�˫q��7���*�8�Z}�ws'vE��RI�U������Nu'`|vHA_aA�u�Ϯ.�NȬ�;��f}ZvZE*!�~J���w�<�e����r�܀ �7p��61���[�`�iC��SPt<����i���$�mR�����p�s�#�����^����&��;rx�r2$�2��i�a����"��K۴�6#�� H?����e��7d��b/�څ�<�Ê�P��'��=c�#3��KO�j3B��Q��X(����bbnp3��'��u�U��qGَ�����@��M�������h�f}�Sd���H�Q_k��ՄV>۳?�N���C��b�'��w�3����x���������#9���C��Qy�k�cW#���D��?���~t�j��3�����0l��+���X�#*s�����g����7�5�moN��#K��Խ:@���#*���+)�B�h���bվ�0|�u���GX!�(4�$�H}X�#3�x�4�����T�X�{̊���<ـ��7���`���($��)C��5���_�Vߊ�WA^�)����w3��&`�*� �gY���fmG��o��ٰl��֎�ʱy�(����+�rY�6��I�M��Q�+�q[�신mb�Tݒ'3q����ߐQz�K�<�� �V#*�Phxr�������P(v_����"�x@DDd�����Z+QA$>���وd�f������u��䬁H�����&CL�4�33�U������4����>�!P2�i�4Ol-hj�qp�~������W��R���p���nޠa�Y����`��^��QF,2��O��~�@���/M��^E�vwϠ���;�����G��+�k��?->� ��?BC ."�Y ��OZ����l�qP�?$a6��ݿ��<�#�3������ު5��T$$�������P펣>A#�C�d6�_�Y�1�i9ƏoN�/�y�c��]$�""!�/��BIG�Հ�럽�c m�t��������lnjq��U�0[�#3�3g�u����PhM���*�m��fJHF0"��Ԓc$�N�������#*���P��xS�����UT91�#�c�y�/�#�O���T��p���T�Eh����`�7 �7y·�����bO��AĢ2 �w����#9��G�-�/���wtK$��������ȡ�Iz+��9��J�U�ڸ}��L��sd1��#��d����4vR�<�v�Ǽv|�$g�����M���J�G���cĹ 4U7��~�|�){��[;z^%j�#9��̖��B��B�O3�˓����)XK���u�`uҐ���m���#90�"L�`Q-�d���H������_�$Dּ��#3{��#3|��%�Tb7=g������H2����#*7�f#9�σ���]#*h1�A�q�����(�������竆����ޛv���У�7�`�߯#�>��K���o9�L�d���T��%���W�Ja���xɠ��0��n��'��L���Ԋ�PҩТ�N���4�L�1ƬT��!6��|Y�f�!G��3�&ʑ��u�-F9�A��4�� /Ӑs��XE똵#3n��L�9��6Y���L�LU�4�=��[`771���%X������,b#3��84b1�`T?*�)�����o�n�ȧ ��+��S����֟�Pi��z�F*��� y�"��zU��(�I:��*����?����o�pM����ϘB�j)��%~��H~�����ӥT�I�5y35��4��-��(�5���"BNs%��=<@K�9t<#3Nڽ+ 4U�#*��T[_���ـU�7z?W��Xˆ��8D�TB!�s��h�b0�w:��̔py9�w���1FѦPGCv�v�J0��F#��;C#�]�[�{ѼC��ΠA�@B���0��BEߤ~��4KI#*�(�OӇ�Zg2Dn����~��;t0�׆��{-��5���#-��¨�&�B��Q3��`�uF���� SP=2�>�#*�f���}0��CL�W=L3M�3x'�J�_c� kx��bh��2�2�b��2m�|����P;8i�||��?If��5n#oO�8"�6~�/�6n��I��f�-��ϭ}\떷C?���տ䝰�_i)�=��,z��2獝�v�5]�Q#3��#33fgČȥ���.ͣl�9��R��ڋ2NJ����M�0�#*�A�cA�%��&��Eؾ��ם��8Eb�m�{�u{��#3�~�� �Z<&*����l(��s�R��D�С����v0�yc�'���u0�#*����w�����R�1��T@�#*�"���K�g��m����=��b�1�pz��F�� &�~ˇ��_G݃���#3���7�bA"���||SH4E�ej&9I_���wד�����k��Q6��P����$���E!�"C�`�@�A�EØI�vk�Zح-���������Ͱ,�Yo��A�ܢC�����@ѱç�����w'7�麗#3-t��3�-P���;��#{���A�Ϋ�7���?Ѓ:OI� ������k�?��.;�"ǣ�Y8�K�j��#9v<Ks���F���iW�(����D������Ńsm�<:�Ի0��bpv��S�G�d����1�éc��E��6���^�U+����\)Mv��M��e��b#*-Th6J+]�ѫM :a�����=̷Z���*��Y���*g7��t-3���R�8��^.ʚ&��1�:Q&aB�PQX4�]���\5����l�.��JT�<��J�2�j��SA%�w�k�8d[���Hݱ#*<4�߳�z���"�����I��Ky�)�&��z�o8����i�A֜]��˂Gz҆��E_�7���u�6���|�����κ��;n�; ���y����6�bdޖ{skC�T���l���F&���Ak���`D'�y'zo���[�ؒ�Uݜ���[��0��C';��жÆ��+���봘Zu|�4@#*�#�t~�'�}ߞ^�s⏋"�lv��b�JS�-{T���ӂ�I�*�����>i>*��@�$Z��\�wl�^Pv�#9����X�Ċ=T��t.��M%�ae����B��W�ؼJ�@I��Roz�?�.�]����8\�ɥcN�8�$$ߒbх�n��������m�-}x0��/5)yk�#�JyJ� ����6�m�p��i7�8@#��� L9�G3�?&��n#*v�B����|����Q߿��"��`)�����<�����0��nyHo] B!z�R��CƮM�Qb��b��Q�\��9��Mdav�l��d�_2�4���a�#9@�K#9�_�d>��`5��L3Y��H���)܇J�6�O��1����=k������e8G�nX�C���WQ|�c�W�g�GQ�I ����|}3{�1��B�ۊ�3!�nM��^�O��Cû��+]��VO/]|�vI�����K�zn�CuL�q�����룩���eb%��Pt㡴K˷�"ݩ����L(����:�e)IH���X��#9~3ٷ^QX�B�6T'<9���$7�Dw2U"�6�+��^q���蘫�o�9��ZL��q}p`�X��d�~ح2���G�d61A�X���̀H ���}���������}��կA�!����'��}qn\&���a�"�=W�O��uvhzv~�t��,R}pW�->��w�~,���nqd�������׃��<���������4�{RA��1�omUU���s�`�>c#3��#*p��n���r+f����G��5#9wh�]���Qi )1B#�v��l��I���*U��gbI/��$��C�m ��y���ٺۂ��v�b�;4.��q�E���ˑ8����U^>�ݐT]9w?�[�Q��<y�\��7#*ue~=����]y_t� GR6�E�JIX{���Ė1�4:���h�a=�J�R���wI�v��#3�x�ll�(��q�a��:��l2A��o������hY���or�b8�'3�s��b_���v;#3v�o���mc#3��P�`�Yrz:�}��a�O�bk�v��#3Ӂ�c#3��՚)��Mꥡ�����2 `D����SI,B1�p��4�X>��BN)�$_�$�x��Ɔ� ���f"�%��^y�ж6��q���nWB����mU��U�e[�R�4xm��io�}�����H�����G�$)ן�;Y;/����ܟ������C�����ʹ�ϫw�������Z,�?�^���Z6pҋY ��m��R���2ԕH846�0�L�a��Z���?����R#3T-����ȽW�?���j���e,i���,_���XA�[;Ά�E�J�Y?O�������P�}P�Qj�۳~�@�<N2'��航������T�B$1{���/o{X��I��ӿ����,?�����e�UEb$&�o����:K���F$��#3�B����n�Y���O��k@M�B#9 q�O�*�/mVڶ$ք/eN��7�[��b�� �4XPjlr��R4���{�Q���\>�)���^AQ��#32��d #3.܍mo�h�#3l[}Sl�r��U�±���L}�M�1�1�!ß��ڈ�}^k#ۧ/p�Bn@r�� �����38����p�!F��c|�&���$�u#9B��i�]�}��m���C�kK&���<�K#9�_�w�d���;��dCYd6 �t��#9��H�K�N�$#3+�Ɖ�KCb�+ö�� �0�UBF#/��L����nO��Ʀ��8(u��]�V��V��0���L�:݇r�R���ky7w�d�#�q�Y��ad$[gB�&���Hܵ���um��^�K��p�'�:�Ԍ��|K�J�[\�87�2pWyCŅ2{V�r�,x=!���L�e�v���d#9ț#�����g 1�h����ށ���xW�����h6�p�}�h����l>��"̦vg��.f�����G�l����ǻ�ϿïbB�B�d#�$B�oz%�����&�n�k+,�{D�R������˛@Ξ��R��=����_P&iW�d'�T`б�0�3X���Q�� ���nPj�t!�,�yGP�������H�ov9�v=�np��x_#3�2�qî<�*r�<F�=M�smT|I�Bu����>�MP���x�K��$ܗ���j�@lU�;��ǥ�Ih�&O������MնА��P���la��Hr��1�N�!l��zg�o^ϳn^�8A��s�C����X<X��{0��C��`�*;�xb<7cS�!�|D�=�x̎<R��c]V�өAY� �7;{w��kO>�BY"ݷ���г�r ^v<�J'N9�yGst�'#*�Sl�* z�0���F8N���h<6E�gJ����hp��'&0;���L�,��F�M��>�#\����t��p�r2px��ѳO6�s�P)$��S#*�i�K���F��5t��M�]�<�#9i5�s|8�HL=�7r�b��4*H�*����G�b&���+V]TV1�@��hgLm��2�<S���i�.�H��C̢x1<0r9�NoE���hX�M�I$��5��J�(�38躜�Tq�����c-��̸�3&\���f5�fY�$��<P��ճ<�ل�P��;��f(�T������z�k��4�/N����p6�#*B���^R?V\���S��gJgH��v���8��:4��Mkr����A���Yg�ź{�lX��3֨d1�Q �&��p�M�`����\�݀cvp����ii:h�b)G�V�u̔&�į��?aW�`�q4�6�����6I�R#*��L��pһ����AX˸-�#V{߲��kQ�����BŚ��[��sHƶ0>�v�:����c���=l�b*�D��׃��ɧ$�q��SE((����?�!D9ͻ�QV��ey��X#�S� W������r>���zt-%��p��e�r*��ȵ��x��#30[�����Pb���'_�o�{0�#8���<y(�#9'�#��!Կ�O.��F�t�;s� �D�[!����ڍ��\&��q��1ע���*:@�py f�'6���ݶ,B@"l��ݬslyeˑe���1�;��\���(��BjqQ�E�r��d����Ut���6�"�N�)@SIDV d!�7o2GyD���hh�(B����l<����D8Fli��Ad�#3��$*⦲Ěk��I��L���c����csC�˸Z24XID�L`lÁ�غ��&���D�p�v�1w��p������C; ��pl��DzQ�CF`�L�t���z1�jzl#;+R*�GZ�H�F%J�9�� d��� ���\�z�>��C�#*R)Rx�Еw��GY��Xx�Nf�.˻$��"Q����pA��PR#T��R�z�Qc� C��R�L�����m$6�&Ì5��7#3E#�>a�3!�O����уI�#3Ƀ��I�!̴ֵz��(�屼v^КX�N�F�m��%Q.���:3��q�� �5����X���v`C�d #3��Ƀr��H�AF#9��@�s#3D.�,����C��G����#3��U?��#9~�d�׆s7k�&�YУ������E�L�J[Hm^��R�Wv�#*��� �����\˔��9��Q������E\S�����A�ʗ�M|^�ҭ����^h���#3��"β�����;й���V6���RWϵ묞����j�֞oHcHhbI#*�Hn��4��tv��w��}��&�eY$�R�r܉P@�9c����F��0����R�qAL��&�HD�]��z��|��KaI&)=鵛gԸơ�b��g�e3$�����0��<y���zS��.�s�t��|k�-Ti��0�*_/=�����[�BG��ƌt��3�m��C��X8.�2�#3�N��j��7#{����Tb�R���o��q�V�z���~!���d�� cŲ�<��4v���r!�UJJ{�8#9!`ʑ�>^�{גzx.#9뜁H���z����O�e���\�!Ե��������)�_�mg7�6֯��6�����ٛ$�:����(;��^C�=��j�PA��m�ċ�:�#9t̘�~>i �)�)df%on�$��-��e*DN����0��T��ǁ&��7�^gƪ�2�#3ky{`0�#9#�ެ�����O�/#*|����9�P�d%LVpcǿ�XI��*(���Wޒ�E�q�#�� b%E�QAiA|vР�oCБ|y�M�u�X+/���;�$#�S��C�-G�!"8�K�~��b �7����S���<�R�+����=OY #*�tQ�("6=֯d����dA��j�AJ��`�=Ԇ�#3�0"$ �AMw�#�Qk��wb��Fwj��ߓg"L���6G�r��T"�e"1]�Hԩ���C,�E���3�&��B��H0.�$nh��D[��gy�R�2�=�}6O����'�U˻q�*�'p� �KABd)aA�{�!PQ��p�P@j0@�a,�����&l������V�%�Ju#*�#3%��[(jd� _�)[�f��p�\�FG~�GX#3��^���ݲQ�¯� ��{�\�C�(�V H$�nx��ް�#9��5������Y��&G���c�G #*�"�",�#3��em|�Z���+j�*�m�#9ҭ��֫��d�b*,V ���.����_Y��m3�"���X@pϢj��%q�A��������x�V�e�a�2�3� ��� �I���r�H��h�?̣�X16ײ"�ױR�L[��o����7��k�(�ݠ����-���ͼ\�1nq���VR�i9/kt��<�I�^�V� M#9��1ڂњ��/�M�hd�m�W���m�L�ɒ#3?�R�#*�#3�^��#9��hx�aО�/��O��������6ӄ�$(i.�����gq���;G���1c-���=�g�n��I��[��|����l�����n[�'[����!TI ��"̵M>�z�47����]�� �3[�j���k}:�X���$Bi����ΓJ���#���1-܂���_����S�Q?�z\;����0�\Z,��CǕs�(l�d�Ra�����VFѢ%*KM��"pt0SK#9K���\�S#*Gr!�k��/@b�Kѻ(�������ʸ���o������o#3"Bo��#3m֞���������ڐ��U���|�Ip<�k;x�HK==��?Xj��@@#@B@�|CǃߧG����߲�i�䴮M[q����_͇�m�ix΄���G���Ҭ�F#3����İ����h;#�w��S|�z��4�=��! U*��������tMPJ;v����[.ǗT>����| (#3� |�":�3p� 1"+��X���+�);cL����#9��ץ���^�%�d�&JS�a�4C����J�A�ϋ_�*���#9c2F�dU�T4���yo�wM��_F%S�Q)�@��[ 'H 㟒)�*J�� ���@�'ڌF��E���ɶ�l�6jƒl�J���ͥZ�ҩ-$���+YQJfUi��լk2BE�9������?�V��}y����bE�#*`�� #*s��� �521(H$.�_�m�vϙ�*�>�ɋ�+w`E���@�����늣�D�,��跤�#�#*���;�#*�E1�%`��e;�XO�'��L��!���ВE`Bg�6����ǂ�!�t�l`6�4<��%�Ű`!3i���BY ��Zf�hi��O\����&ڒ���2�m��l�@:�T�@�#*7#*A����e@�<�� �|a+`�n��X�#�,D�+���(��Q�,��D�]N���H���g�Gd��%J��u�Ƙ2��@�!��K�Ʃ#*��ml�Rm4����\�(��V�m�nj�L�)P�[3��-��c��E�}�����w��W�}=��7.�4H*����9��� j#�}v�__1���q����()����F\"o��Y�'�� �z=�#*��H#� �����T���������������-��*'� "��9q��� #*,w���/#9#3��Vn�%�Q�w4E[I�҄`ϩ��*!#*��UL4>Ý�q��<<;��M�n�T����]CCt��E[�1������>���nf�� _���b��so�������C��̠��f��qWp4r���!h��:�+É����U�hE�����4�P�#�\���ooNg��EQ4�k��:A���C�PC�l�Bj�6���Q�r�d#9d��*[_�0��GI�5�6D#9�#9R�&I�.��??.��bw�g���� ����(��#*�Ri:��>f�VΗ�(a4Bث+��ys=D6���!y=�룘w/�9j��}�<��>���A�U�%N�y�5ֺ5|~̦AUBMRm���#9B��Ѓ�?W��<�Q(h�~�Ů~U��<�59�P~}%��]\�w�G�~�S�����r�\dI�|qx��0@�s�l@�E-�l.�D� L�8���}�.R�g�AcYm���3c*�M\1���4�eP�W8t9��p�q����gi�=9��c���EX��dGi6�cʺ������)3a@�d>"H�� "#*���X��=��E��~�]4�Jk��r��w��M� ��࿇��+ߕ��nr��q;%#*�ʣ��x����Ⱦ`UJ%R#9��F9��kDp�`'�(�����;7��;}\�s�5�Pg�F!� K���Rz$D��cm��Mf]���֬z�%�s�� e#9(�}���% n(��Y��;��˘>�i�#*"u��g�"A ,�G���FɏJ�,���K)���r�K<q���/����r(ݗ����� �|���D���;+�x#%KM���.L>w��/�[�8��cs(�*���� ·�wY�����4>m�i����&�����o����q�sz�G���Kn:v�˧�c���p�qF;j�t,��F�Cn��P�(��}��H�'mO9�:m��G+�6#3ץ�^��댩7<� z �A�-���nu��&�ڃM�� 2�d|6�w�f�#3ߥ��w3�S��(�ջ(R�n����Z��-F�� �G�F�q���{xb�jn�Q^��Va�L��{������y��,�2��2c@��#3��� ������s������!�9g���w�1����(R~���n�Ѷ5v�T�z���ݫN��YR��������O0�K�.Vr�sD!� �#P�r�<Y,���l�����^���|�ٳ�P������l��ff�V��o�Ԓ-aLeP�Q%���[�� �APbAD7�d�#*����C�j���i��VeP�t5�un�6���=��͉bN#*�5I��xn^L��>Ikg�,w��gV#*ᥳƲ:$�]��6�� ��㪁�����GC�q$��&�%:�"�T�b�0�vvxϫ��"g_��Mh�Yw^+"0F;4�Y,�n�Omc���ǡ�EJ=|7�Ȃ!� �HOS$��Ξ��?G��n�cn��SQ1�0U�t=�2X9M���v��$'E���:x��3n�ĻaG9��<r@AADmI��`��!I���؊�J,��r���!֦�t�Գh�^>���5ԑ'"wۥ��GO���T�`�%wf�}�eV., ��t2�{6��ȍ��z�=��p$��d�f�lNA��Bt��+W��-������˪1D���.�s�43d��\�G]]M��rh��,��ԌR5 V*�#9�(�X���"!%CK���X�"8\��2Ƥݴd,�i1X�a�2@�3rH�ئa5�Qmi�_7�5��pA�ȣ{#9l�Ԙҳ���Sk��G��xf?>��z�[�)�{��5�֑e#*���(H��0��E���������!@BHA��� ;��.C�g���{�� ���Uwl)i�AaL�vV ��3��%�6vՠ���S�P��#9g|uYV�}J)���F�n����IEݗ#3Sh���L���+f@ePOL8#Q-��{@��S���ǖ��A�R� ���q�#3�:"�!�Ա�YTA`h�r#9"�D�R��@�i��K�R@(4��,)R��7i9�~S4�l`�a�P#3�3n�N�``q�P�@�̌FD$�j���F���=�/uŊ�e$v!�����wT}�{1������&��wj&�7=��ܹ��u�k��`caF��;1P�D�E7?����b�W�m)c[bf�UT�����& ��(2$$=Y�#9븸��O��&_'�"�+j^��2X|�N����60���n��'z0<GD����b�}'��W����D���g�՛�`)"h�f��H��BHa��~f���@���"�S�}]��<��^�:�Ä��oE�t�[s�S(mb�A�G�"Eg�����?���ӈ�}_J\tH@f#3i�^��%�OY#9�E��c�o�s�#3����h#3�!]��DQ�> �3�g��p�.;�I�(D��������\uӳ�+���B#3��|�]˜#�ҐS}I��q!$ދ�����F1?^����?�]p�Yԡ�����*�m������\�KGr�AjNP8��d#3�wE#*�sO#3p�O!�j g#*������b:D�JnA�,M�I�(��rK5P��B�o%��JN��R1F@�$�K dN/�s{��_�>4E[9�U�h�oz� �.#9���4!(�.�Ef*���`����7�cq�$C�H�d($l�\C#3#3v�B��QB��A��enQla���l���&匐���d���h!���F�,�#*���$PchF���r����j0��b���^�F��ᝆ��ݻ����O��T��"�S��ңJ!,x�����'�>f�ʅ#3Bm��%D��Xx����X�d�@�� D�n��o�^p�o���v�,�"�2|6������w��s?�E�d,��}�G�4� ~I8���Z������?9k�$,���ϳ����_w���kf�vm6�6u�gLx�;|3X���1+3A��7j`~��y����8Љ��lQ@��DF�|=��� �-@0CPz�N���a���֠�]!��R��oN�9��h�#*{:f�J��IdNM.*�(���Ec���A'ș(�&K)�`��6>���aETq����� �$�!�uAr@�Il��L%4���gk��{]�u7�@f����[H���0�ڷZ��j�*��"K_Ƶt�BbN~��E ��@Ʃ?��˶�d0Sd�D6�RD�!��u����U4��� <#3M���,V�^"�"���s�F��B~(�E�\`<9��S��HJX�H΄�m����FD���Ǹ����j(v��(b�����l�!I�yT�W�*�А�5�$��N��:BX�n�[Gj��v���R#A�Ɔ���-�n��_8d�A��m�Yϧ9,��$���&ј�\�#9�m#9���xa���]@x�D�Ε_��BϢ��ҽ2��,��������� �\�͒�TRk�����<�Ac&����Y�#9b�0�G�}C��#36)��͘�z�̍b�i�9k����g������]5�k�yE�!G��)Pf��R��H��Κ0hf��U�h?��o�[�]i�y潥5ck*6J�P�Ƶ�R�#9돢�,���M#�3g46p"�#9f5�0��c�U{NX��E�B��l6jV�@C#9��QV�#��w�����#��F��+|�o2|�w�LG�=��z�F�mP�\aa�Wsj.H.��Q��#��T<:��U�:�}e�����$%N��G9��������M��(MӾ�Om-Z��tB�]�#3�ڃa�$�*��L�ho�H��9k�x�\U7ї%e(�W��;[dv�d�u��,!�*�&�#3�Y8 &�6F�Mr���Y��e0�% mZ6#32�#9!�&��,5�022l�9t��#���z�fpq��-�)��]���d�'�5*)Pv�-�"����J�-#3���#3� ����]�#9��d3+�B6����]���1�yWR��x���n�rx��V�c��#9�z��E/z#l�oOP@.Su9r�ia���:2�2N�<KN#�xS�'8B�*�%��h%mK�#3�,�=��tL��ͤ6�#3H�X@�U�O�"D����0�k�1�=��PZ"�E]�BE\x�!���v�P��r�x�bl�Vd_�(t␛M�ij1(�GP^FÚW�]�ʃ����wX�<C�t���z�dMr��f]� D)����#3�}��Oc�X)v�Q5Ġb�H��k�>-4+.b�$��n1>�k4�8#3�rϗ�O��f:T<a���ގm�z���ږ0���3-]b #5Hn��>#3��˔r"��i`�#zO�����|PC�C�S����ng7�l~�u��}��N����^�=,�� �@`dM�">a9���mh�S�� (��&�1'<�4�ϗ����Q���fXD��15B�Ǝ�$�b�hC@���B�A�e�̸������)�� J&xsM�Μ(#3BP�X�F� 1"!bo"a0��^���%���r.9�H{<2M�c��T�<Q�?��#9��b��^��������DMs�x㰄�M&��O����Ζ��Yq��h�]�@�x�8�9���TF/�p8�a7�EǂO�*�4��ω��U6�����ɡ��0d�\Q!$E�t��ujn��?'o/����$�MF$�S6�}k����A`mF����ksm%*�ŭ�mm�m�[����մY��W5&�t�Z��Db����5�9q:H�_��rȢ�����_3���JYB#**�O��;Op�m���v`�}e�<�b#9�hDFY�%2�S4ɟ���J4���f*J�Ԙ�%������L��SDL(���+s_��&��Y&�L���b�Ĕ��m d�$E"���KK��#i,�f���0ɵ0�4j-*(�E3)�Q�(�%i�[!2�I��MAJT��4�i�I�4��&�%��>5�.�k�t�o&�+��Ph����#ʸYZ���*_[�����Џ��k�M�n�#9z��%���0ң�,`0vn$�� a���plY��&��Y����.r��9#���m��]��D����G��~�ĭ�`;�8Q.Xހx��Y#3#*��[�h�d<�&�>8E�^���4�]"�u�pߊ/A�P|�sn��H�e7�O]Q�����&X��������,.�q����a�L�!5�-��������W�c$ъ��F�RH�Y�R�Tb6c-2����on͵�>��#3��o*ŀ���#*�&iO��Y�<�ʩ���=z0�i�;D$}L��#3����'�G�%�w���|Ā����}M\M#*'���؟<�G�J7�M�OHƢo�=R=K8>pځ̬�gu��P���haz�݂�%���D��j�������A���Y�#9´�" D�#"H\(1z��������N�2�ھ�*��+�����"�$�{�n�I*"g��SqO���b�xq� F�����D�X�4b-i{ �tI-�ۅi���q����Bi҉]�+�{�1�5k��.R�]i����e��Pӊ#9�+G0��'�ɇ5�7��e�$�Ա�U�k|�kPK����溓k���sID��V�C)�:(�Q��������5�.�l�6��� ���"�=K�{�v�-�$H��1�䙚��&�B#*��u���e��~��fj<[T�wC�)14O1��W;�ͅ������'=u�q��j��9Ea��$��x^vpf3.4�E7{D�;P<���Q>�|����E��G!��#*2T#*������L �^��u�X����K�������v��!RB/�6��I�!��GP;+��<�41uA�[��gU�~a�+Ox�b6% t�<��F����6V�_���s�^�d����#� PS�ڡliWh�>�s;�Ǹ�����#3�ͳ�6�����<@�^(�*�����,��T̉�Lԛ����dyL��Q�\D��4WC��D`j��J������ �j�o�<#3�#*6l�d�*��Ua��r@���mJn�m�'���5��#38�H��f[ɭ$$�JP���p�'a�jN![�2$���3%�'�:N��'�n�&s��#3Rd��i���3��t,�3�|=5UjJKa!����"���u�f�fas��Zч1��%����d�!�R�R��3�'����_H�����12���w^��M��æ�5ݤ�c\��^Jrf<�;f�H��^k*��� ��YJP4$��OU�F�bv��(Ⱥki����[�{P#��N���/h�r�]�u��a��}�m��M{5��ē�V#���z7�~U9��栙�_A�:��#*�2��M�'G� L`�x�L�YӺ؍H���M����9�e'Kp<-���A[}�u1�v�#9��4vL]e�S�4`�i��w|A��:�8+�4�(��w)�SX�0:a�(���i�̴��9�d�N�j�REITi�Eû�c_V{��Oh�M���Y�Ӄ��=5�c�#�0r��OKl�=��E��q����;�5^D X��}�4eEK��؉�F�҃@���Tñ߈/�(o�^��#3x>�^��w%�xo6���a 7Q��f���mA�n�S$1's�cQ��6l��zȱE-b��frkY�8ה�S:w�;B��ڌ�d�Τ�Unނ�%�#|O�m�G�J�T.��6�巇�.-B~��t��%&,w�m#��j�;�PFvcK.8$�F�1���ۘ����O#9�\�ڛ�hIBgdw�r����=]��^�*�ɒ�&�1��w����#9/�Lm5�j��L�i��gV4BG[�:�ewZ�MQ�f͓�CSD��Ћ�#3�ٱ�bB�2�kfb�����f.YcD����I��4�u*��,X@8jSmb��#9e�7�4V���WnusG�C�*�/Q���pf�"����uF��FD$$�L�&X|Af��W��=�Nq��~��^ȋ'C��̕�<��WΨ��~�I�:��a���5f��f�z�)�J��)��\x�3�.��;[4U��:�[��i��a��fD"�a�:��0�:oNKC���Sd[]��6s#*L�$��:�Z/�ѳ��U���Vv��:��nЄ�1�f��u٭D�c��XK��h����7��K�xH�6:�b `�U�>G0�<�M��xޝ����ma`�-4C#3z1ss�u�����P+�Ɣ�H.1q!�1����UT"YF%3����I��L�`Z����G�a#*���'m�kb���8�p92���#*���� ���cj8�&��7��#3`>)xݤ&�.�>̖aoh�.�3Q���͖#3�7�p��}����Ջyy�Y{���l�TvYǢ֘ƹNqm>;����Y���n�j��ή��!Ņ��;�Eڜ;|>�oY[��&&�fP�d�x�6�1o ��Mr��`;9�a<����k(�p�G�Sb��&��|�7]��ͷ���k4Q�[�C�%��ޠu��n^|~9��ȍGI���nOU3/��$�v��)6XH<����R2�*#3箟tK�2�Fe�$�������,�m��"�4H�>��f����cn��e�2�a�4�8d�G�N7xš�#���i��$�#3���FǜL�%���+��8Y��Ǒ�]ne1�d��N�.k�fλ��fH�奍ͿJ���:�6����We$>�u�8Y�U��&�d��G������=���M�Q\@媫�0���c��V�Ra�騒�(���4�v=��7�"aN�(�J0�fD��� {yͩzX*mBp�"�8i�($��NV�3L##*�q�F��Xrm\1�&��ԯ�EKӦtWC*��(�T���Xk���a��p��6�a��b�]�ն�*���<�&A���Ki����M���x�"��`T�m)L;�ڎ�؛fG�h�P�hM�RA��ëӃ";f��m�K��0�v=Iۃ�T.��A�E� j0��Ґ#9*R��@�|3+�R���!���Asɲ�v}�D���� �`�2I�O�p��<��6Y#���,Zd����uH�q#3�9��O|[�b�h�s��H��lLb���0�i0�bg5�� w�t��V��=d9�$���^��3O@���ɻ85dц�kfa0�A�&��)��((�3&��gJ*jV�S-���I���09�Zb��)!�t���KH��#3��J�=Y(00u�9�W�8�#3Yl\�D#9L������Si*s@��p��7#9�����p�)R�f��E(�+��z;)�6ʹt`��N�L���c(3����3љr��C�(*"!������#�҃��5�]�N��0�6L>�8�O���#��:nu�P�F��j��fcNn'��[!͎ �@:�б�!�Ũ m����h����2�Fv��b���j`ӗ�U�#3��ߊ~�@4Lb�Ő��]"�����.�kz�-8;Ö���QA�t�z殉#9��í/�V@��ѕ���c�w�w�c�y[�e���P��M��S���Gi�3P�4�p"������a�Na��!�]HSo*5B�E#324I4���(��1�H�#33�`��$���-�,i�XlkF��͢gw'�\$�]�����#�$�#�jH�cf�������-�*�XŬ����;@��D4��#9PB��`qԔW:�t��X��gű26�D���!.���4��ˆl6Y��r�iS�L�������a6���4da��3!���vf� b��#3V9�b���P�(�7b$c��d����f����2�������N�Ln:q�-#�ɕ�E6!`h���F8m���\L4�cwHsC9�8�q�I�x�6a4�Ttf!�bp%s3T2Kߪ�Ť�Рp81�MT2,�i�4�.f:��2�j:.�܄��ظ20�C9,i�a�#*��KRX`���m6RC,1�[sFY͆��q$�H�s[��0��ܹ�WY���*�R�Lѓ5f��U�T��P��#9�H� �m�f�@q`�#3*o�0D3,n�D~)B##*A������&���r�( ���y���뼫�X��%��":�����A��gX�0����S ��W���$� #3�Z�[�h�x�[��m����@G����4�@��IH;�i��l����M��ZO>��?w�}ލ�ه<�bjvD*�1�?�S�H�w�Y�zmp�R6ԏ̫ܳ��k�����kF�vu�QE�v��\��\8�V]"9y������J�e�PTŔqk�/d5n�eT��ң��ܖ��7�n�20��u8%��e�xn�`����{@�۳#*E��P#9d;Nh�:���,�1@��$#��þ�!V�ӍJJ�e[�"d# ��9��CB�C#z P��� Ce@�L,`���c����3a�l4y.�HQU� V���1�ץ$#3�6�U�w��W� ���V�γw�`��W�����H0�¡�`�AU@S��2���F��W�ך%���0�GC#3�~&����"�C�z���a��v�1�J`p^���J/�`���~é�����P���E����|#9~�?D���{t37/��%���L������h��a�s~���=��W��n��s�&���{�F^d��OF�T*�����-y.U���w�c[qW���-�t�GJ&Q���0s6�B�i(�m�D��G��͘�Qv��Αs.�2�d���|��8���D�j4x��CJf���CP�=�쟏�$� R���M)(,U�|��_���*�-V�Be$���ţi#3mh��"��������"� ""���=���'�.{�)��#3#�����B)n�:7�y.Bd/"�x��jxAi��S� �Th�2�?,]��ָ�FDCT�d�5J��#*ݩ4�9کKb�"riK9��2�o�`�=���v�e�N���8*��ǜ�����K�<L3��Pu'TŇa�-,lW���,��I=h)��z�b� �l�8��#9�0����4B�Ɋ�p��R���8��I�e`���O߶�/M�rۥW��Խ-zi�V"�ų)K"4�X&�#9���Ō���q�����+�P��9���ih����M'�M���ոl�W�ϯ��㉑ӻ��eK��!�N��4 j�b���c&�Uc)\��8��:hw`�t�PrC9{�)s#9ɨB��I��D��;tCR�.^��!�Q��5#*a#9^p�0H�a4�1#*$A� �$V�-�-�������Fm��X�~���9��;�����H�bKƮ�[����^V췌[xl���K�2[Yj�a#9@�U~VtU�b�P4<Pɯ� �ۏ��;�d\�r �ҙG�b��膵K0ʱ���f*4~�:Aha�V:�����V����m���\|��o]�g�R�f;b����`����4�{@�rD�-W����D�����ފ#3�P��C��م����B�4CT��_Ӹ<��:Ψ�W��fu�S1���)���X�t|�Ǯ08ю�f�ocsv�ְ2A�Zg0��(�~V[�}���eh�����N��l��I1��ؒݜ}=��� �9E$n#��(,v��J�H2c]M�&$2��(�;;��Z ��J�ypY�.ݘk��#3�tG4���q���{!S��)q�v��#3�x�g��F��l:�t��,��B�^7n�l2� E�� (#9A`#3�i�2D͍2��a��C3#*�.ຨ�2! *��� ����m�~�f��Q��#9��h�P(�b<�����=����H#9�6dϵ\��R(�=�����Pa�>�@�H�oT����k�;Zڒ��C��7D��(h��WY���& "2�x���/���]�����.:Y��kƾ��QmE���MZ�Q��Z�j��jZj,��G�mr��A�7�H��z��8�����Fo�s���r/�R���r>�sN���/�#9]i�oY_�KqhWF���IQ�����/ $�或��k�Ƴ���UNCQ��s0鴥�[�'̧�����i6P�AZ�*A�%�.��Uu�*�f��a�ތ��.2��3��p�ĜdB9>�X�<�ɜd�r9��k���G�ѝf-� ���f3���m���M9�L�N�tD��t8��8�k�T8& v\4�Kt�m�528�S��i�S��k��&'��m)�7\�t��Kx�M�G�(�3�����.^'�.���ۙ"ӻ#f�*�}�Hy��Na���f�]%Э�ɴ��ѨZz[�NM�yC;�d�N5���j�|A����3>a�"Bt�WO���X�E#3mC�`��q�����f�r �`͂$"0�aĝ�c�l�JPE�P��b,#*�Qi���~t�#*Xⲑ����T��XȪRR��)p�0u@hX2�����6�(1$�4�I$Y�@�X.�#9T�GwH�����"��7B%a).��G8,hX9�"�b�cY*#QIZٯ�s���h�v�ͺ���6f���:V�e���n(BYGm�/X��,�r��]m�\9Lj��FD�bC���[u+pخ�FѠ�eNp�ɴ����D B�b��)[2ԒR��m��6�e�S6�m�me�Mie��V�Y��ܯ��X�d���b��6��TZ�%ET#3-�\���f�#*4Q쎗6[ ��;(u@Q�K�� �ʂ?8�����ى0h�B�'l#��O�aTB��`T��G��(ca�|,�1:FC�#3?c KC�рB�f�>&߳4���P�X1�m�_F~8�?-/Ϋ���Q�s#3`��;�z�奍���b�� I#3���&d��c6�M�'�O#�tn��ԛLP!���e@�`� �R-I#**e"6AH�6�S�#9�ɔ0`P����oh���{�_-L6�!e��ؼ�}Xl�,�S�@ᾖ�p-�"n�om.%�#*��@���*�ԩ��| w"@�?,�j$����o�w��^;������|#9� #3�2�Ɔ�Ǘ�p�t?�:�� OEo\0���z)�@��K�7G��+�^&�x�Ln�#9Ѧ�:`+�a�IW��!T}n��$���g��b����0����l�N_#6[�$�,U�s.�(D�760gM�����/��@V��D�Ѿ�?8��6���UY��T��ȟ�|��l!]G����$��c��,�d�˕�$_�#9�hQ���L���b����IY~�^�[�N�Z*�w�>y��I��D�K۵�DL�o�mR��Ԗ�WdƩyJ�ɦ�إ-��FƤS)f���d�i�Y�)K}k�)d���ݛ�n�M�(��6�6��Z�'�(��jWu�j�{N�5{���SA�S*��-JkRU@jhƓ*���]m�Ư~�k�]U^6�Z�H�am5����M�I�fɩ[2��W�*&�i��a��T[-��zv��R�1�D���g���w$�Z�;&�̳]Y�J�]e��,�%�[\H�xMv1j[m,9p�1ǜ�1k�r=7����X�<9� ��,#�A���|���q:�p�U*��^Ќ�\^E�I4NN�>�0\Dl�2/�����>s(ک�ŴaU�������ň��RL��kQ�#*,@���wLԴ�XM5�m��F#*!B{t�,ޱ�Hv2N�Y�lҶ�Uk������Y��v�Z����k�h(���TY�k�*%����P �M�vni2R*; ��{6��d��f��R�3��U�BQ�I����M�L�ɭ��ѥJm��CI����щFQ��$(��m���-%M#33̦(,F2�QM��$�F��IZ4X�b�J���M�)L�5���J�2Y#jQ#3��ͦd(II�&Ra4�4�RʳlcTIVD�����Rd�f�ieX�%�JRk)��m�&�j�kk��ҳV�I����� mk�͕ZX�ڲmm�U�����j�����*�5�(��V�UiZҥUoh�#*N���*;�5���OHsv���~O3��xq�JC"���A؝l+NZ�=64�6c�b���0{$���?ъ��Q5.�C�"�a#*�D�Ľ;����y�Rhy�OG�R<�r7��uKTI}�q��N�U��D��{��#�=p�Ş�ph]�+�xwc]:���k(&c�][M�&JQ�IC��EJWi�u^���^��+?��j�ߥ�c���(t)�#3�`E���X!!�!�p)��kHƘ���a0JSu��>���R��W�w���#*T�M p~?� ��6냅Sjn��� '`�#3~�<���} ��g���&�u4��FL���'��#9$S1<�(����};5njo#�u.�J��ؘ��/0�`�;A&�#3ԝ�D>�d��E�7��6*��7P -ߨ��3�ۿ�Ȅ���T� ���P�U.FƩ�)i�&�+!_c��=NC|��$����M*�f>wliI�� �tg)��s1{�V�#�Q�FO��a�b�x��f���XP�e��`��#3J/jPtR6W�0�Ų���������i�F��#*�.�#*�M�5T`�|Ү��=Nέ�Z��#ȳ�-�=l AdA����K��5�����J+����z���=hi "d�^!�&yL2�c�V�N��� ��%�>��L��s��YT�b��76٬��x�^BBa'�:�ځ#*Cװ9M}/�r�8�z��y����o;4���u#3����9x#*j��3�x��4���H~�����E�*堳�@�,PP��Yf-�a�����,`0i�TPț)2~�����MWZ���H��ʠ�kKMkM��F�hX=�3S�����#3#3�6C�=�,kCh��6� ʹs�bkX�c�*����e�)զP��l�E͉�D6'�hn��ɜՈ慊��T1��*�ȣ]�I	��$�eѕL�Hk�Ht_��l�BaTv#*,����]R沏B H�#9��Ź��N�5�,�f��ހ����A��bV�eMTLX�BU��g�r>p|'DZD��=p�*W����'A�cs�a�BHV2#�hfo���=�����w��K�KYK�h-�"��Jp���m��}C��+h����,D�����p"��;g ����'������/,�Y�!i1����Է�h`��/�W��w}U�%O 'kY��ik��qɹ$hXK�8B��J�M#3��Q����M)#9M�2�,���Y0n�����P!+]�7��[�e��s�����=+Od<P=��'o��lOn��ƀڜ����O���~Z�Ѡl��2�H����QW#��B�jWϣh��ߴ`a�7҅�D�+h�#3,X�T�\�`^�_��5��J���R&.R�CLB4��Lb 4Ԥ��=���`�lnq"��@�0�:b�p�[�\u�z�0�e�d1�iB�h�)��MW"���y����m��='��\����5$&Jq%��j#���Z�+%��i7��tQ�|UA���w�ʅKՔ � ��W��N[mnƯ� P��dP�z��V)�Q48:LQ4�k@eIh(D�bB��ϧ�v���;����{�����gQp����G�c�8yP:Cć�!�L������z,�n��X���������b�};�Ʋ%�����M��f���!����P;�������J��U���.���9L�Zr큞�k�u/|�.D�P�bK�!���1�;�(��%V"������^��<ONӆwu��ٞJ�Ɲ�t&nyр����0R'h5@�Q@�#��D��?�{e���O'LeH�,L�)#9���Nn�[K�V������8m�3"AR� >���A�T��`$"Ƞ� c�g��yq$P�#*�P7'#y@"l�R!94�<B"S$�A��cKyl��vr[0�*l][H�;���ʘ�3 T�^p�Γ4��NEb˪`��.�������t��Ԟ�;�L�|'A3��W2�O^���(("��J�>,ݙcg#9*]��ͮa�������,��7�#�q�krY��<�A�xy���X�i� ID�A�g#3kᅱ:�צF��Ԛ# �F�I�Z�#x�e�^�# ��!*������o�-F4̊���[㎛8/��z�(���o���g���B}��(t��Ʋ6�Ex�`drp��]���,'ǭ?���5T���՟X�P$o|��y�ב����Sp(��ZkvR��nB�M��<�@�HF@ ��2��-~����k *���#9�0�?<J�U �����lY��a�/#*�)#9�0geT�(� �u���˗x�K6��L��bH�z�oZ]d�#7Z�i]U�Z�ŬZ��S�����Yx�wn) mˑ��ʚ�hj�D�)H� #3&�mת��y�Nc�#*��|v�C~�T�����#����E�|�55���9ӱ�*�k��O��w5�DbNv|:�e_�J���k�C(��*Å&�CLS���J5dګ#0��� `�֩��l6[o���-�J#3�k�T٧gi���t\���bK#Qj-F��5\ƍbJ��MW�J*�f�^�k^76�Ϳ��NeS#*�� B1��4��b�O��5��Q&��|��҅�O�4����p*��ȭ��i�D#*�D�M�n`��/��HD���d���{��+A�dh�`��x�/9�$���A*I�Ca�0ŋC�����dev�l#*�'ÂK`�7���I��r���9Cd!Y"6�Am���ʩTe��ʂ�WK$���3#9eɋ"�����;�4d;H�#3T@���6�m�֍fc,��*H�(#*#9AMC�|�!���5�a`�ٝt4ŐЎ���]rJ�K�G�DB��҄������c���t����'NZ ��PVA�C����"#9�1�Vt1����9���P�D=~?�a�+�Q�u !�.����3v?�%�`�T@R��7���5h8�X>6����J�j�F�t��@7 ��GA�n���L�d7�_3~�+Vv��'۬υ}��z#��?;^A($k(�#� �f!���~Ƅ�_���3�{��#9��g7����z�#9i=�n���r-#9��ϋ9Aר��Ө@a$AL�@�c2����p@ 'd�?0�P�N�p:q�5E6 �s����HE���p!����!�"��H��qRU)QDJ"���P �h�@�Axb�PLJ�#"�Y«*Rz�6B�����f1��� ���� ��4+�K]#9�3�_��u9��4�}�>���P�=;U��O�y���Ԟ䣨9<M�gc�"�äz$�$@�% #*�~%���}̖�-%"�iyHt�{Z��>{%�)�a2�_*~{�/�T1��h� ��&h���h���P������&Q@[x�׀����rdP�hf��|��%6��NYxe����d��D�"v�B1�X��H.���K���mW�t�0���~�E��"����"�v���Y�(�����H,TU#9��5����-4:�f�(�6�b�݄ƍ,e����@�2#9<���x��K#3�c#*���Pu�cIgL���ku%�op�Ux���"�(��k�8cg$���!��L�#92dY�L�[\K�0#H��`a$w��&`QMJ�Dl�F"ڬ�Th�i������Z0cR5 ���ƺ��꠶#*F�B�.j��\�m�ƴR3����l�E�h0�#"�f�3�Izj��sV-�c^��dڼh��B+�23���=�!`�3����4f�--`�R�d��.�;����0��"�U�taZ5�:��X��U��]d��Gl�nx"1^N�ۖ�ʹm+�4j+Erܾ#3�yܓ=u�^7�x�����[5�-�C�.����Ap�jӴKƉ�Di:3���a�XH�|8�#3j�Ǝ���B�ԛ:��Ѫ��.�H�2� @p����r�3���єȼu7�#9��,dt�ќV�q������(h���=E0N�����Hm-�I�0!sDڞ�N�.��=*�?q�Ț�J�o�]�]yF#3H�Ɔp�O���R��1Ҳ���ۉ˗������:#*�t( u�Ъ �#3���~0h��I�S�܅�Fe�U��VV����#9�N��n^��W-y.m53I5&�弚M�TcJ�2\�I��,V(�[I���c[j�Wr[d�#��Q�0��Gdn�$��F�i-��l���ך�����0)̰�Ԁ"��#*��*�?��x�����.����,̼?'���+Op�Qc/��h�!��ت�P�QBQ�����Z`��(@UH����T�������6���VO��{�W>���$#*I����GUL���C��ЩKe��Rn�iT�[��kκ�Rʂۻ�5�V�m�嗧DQl��J�Q�X�������L�D�/CLR�55���W�o[��,Ĥ����DF�D�BʛASQ; ��G�1Ez�#Ν��c���bM�Q��I�W���0�b�"0�+�,ITR�G�4#*���� e�`�ɖ@2��9$����F2UW�Ÿ��#9lO�FDX$�51�Ju#9R��ސ3#3���e���zÒؤ�a=��#*��\q읳ʫ������8�v�{6��>�,@�Ԫ��@�,�}64��9��y<�$�!�y��bt<>�L��Y\u*l�ד����NW �,#3�m�v���b�EJ@���ip�z8�&W����u�%`�{�R�l㷂.�<Qb��V��W�[x�����HҖ��m�G��+Z@�ŤЁK"D$}�7\��Mu�RE$&�H����h/��x�����a�b���r��"@B��0�Пg̼"��G �#3*���/�١�Ɓ��z��YZ2WI?zGӈ}�Aۤ�ͦ*�t(�w�i�ݵ��G��ܕ�n��U�0�H8T�|! �;fd���W "D`�����.ن�CF�K���CLGr`����>�@��� (�m�J��b9#*?�r�#*8|���=)$ �#9��E�&�<�b�7��h�{�Q�-o_zde����҅��j9D�#3z��\��X���Jr��n�aj-4I`fO�����ˁ�Y��Q��Y�#*Σ���g4�~�#9(jcx,����T�쵥QQ���l�X���gN�ž����0�LO�+�F�4��L ��# J6�HJK�3�b�*� !?���_�s+遨��Q��n"0��X:��(;l�����@,�ع�C;/�fJIa�:�^Q�/�U[���]Ϡ�[5���x�u��OH�z�re��S%?��<Mm76�uy���_�JRZ#3��"��m�!#*֓F��f��jmYjMCQ-FF2��r� �h�S%5,�w*���4��I�Eb���J�R���Z�M�����I��eJ�Ҵ���١-���6*j�e�j�MR���6�#3���U6V��_���Vߵ�"?�h���8��ؐ��D0������D -E�TAh��P�����W6ݔ�#3^aQ�o��oY�jS|��KO�����;���)�#3����BA��).���-{}�m���ޔ�[��k�`�w�L���(�Y#N8�I���O����0�̏נ�I�D"<��I��d�˙�j��#94� ��=)��A9D (��#*=��CC؝�O���'�i��9�@,E��#*�P*x� �{R�"��*{ʼ�ox��q�#*80c�ݦzq�xp�Yq����H]^GIjG�ӿʦTm�#3�C4#3�^��M�C� �d���>M��r�r≀��a`h]B�"j|�oW�"�'p4��y2A�@� ǰh���j��i�s���>�?A���CG��#* ��匠��7/�,��Ίc��pq��K���5O�stWJEk�Ei$4��$p��I���;�9ʢ�,�X�K�O�.}�6�y��FϞ���2DE4ڽ����f�@�Z�TÏ�)�I�t)�yC�e� ��'s��>0�#*N�+�kPyq�q�����Ũ�V4�M�E$Z�Ylk��aB�����7o���O6�#*��sY{�;w���&⩝Yć6��a�)U����˼��&���.��4�@����M=F{7���Nt�E�X�!V #'�Q��(��c8�����N�Y�&I��bi]�����;�������,����-|:�nW\�i�;A�$m�&����IJB#3���X11� F����!d\UU)� &�#*`�(^���hB�Q�`�է���u=R�5�&?B�Be�& �Ҫ(�A#3��$�D�1JO��vGS�cG24H�1C슺`�H�>>h/:�E#�<eG��s��s�2���.D�s�&Λ��Ck�+i!6��)�#9L��S�*I�:�ZAx�%�T����`�n3��� ���2N����:#9S&<B#B/6�F�t�]^]ڔ�6���SA��`����O$E�r]�z}�虪:�w��!�_2�'��aꪡb��Qb hU#k<&��G��Cڟ�1ܫ��Q��퉮"��B�y� �揽#*|���k�w�A�7ad����pf@r�gO-���Ed�*��7����g�����yb|HsUBtv����t�yw�梭�����[ޅ.x�7�)����<���t�g���ҫFpj����,�ָ���U#9A@eA��D�.�bo���#�]�̚�"`�ѱ���`�DqM7FI$�Z��)���CǨ9�c��@�ό\���!_L�F��d_T5����8Ѣ7���һ�R��P p���Oh�X�z��"|�T���]0:s~�������;k��^�rk#3�_'�N!��Lσ��Yv�� �[N�1C�j�.,z##F��`�R�H� �ߢ�ş���DƆ��^'𢵍��a�kI����ÔA�$��0���+I�&!j�#3M6Ӫ��풃~f�״#3Bɡȵ)�֭K?>w�Q�Fi��zU��X�q�o�!ŗ�iY5C�����5[k���B!9a���Ӄ����(�q��3������c)S���mȷ�l�PP�h#3$�8��I�I�B��A`�#3!Ih�XpK� d��'a�a[���Py�L���#*Y�@:�&�^���*�s&�>�݆[p�A ��훡�3#3��u�7�b!��Y���L#*HEDP�4]a �0�ӞJ�(��l6����6�L��M�J�Mk�A���6A��Gh�0{�4���f�vo�x�6p�����&�"�_o��l�$��#*F�|�L#3�D������)�����&n�^+���ל�n�6ҶZƒ�lkF�KY66�1�L��5��W.������P�(�!`����:����h��}lXN�' krJ�4SM$$��U_��&!j2���[���S�V1"0�l�$Fm����X�����ܗ{oii担�\1cXd���#9A�� l�#9d���f��F�J2Ǧ���ww�h��Ǚ͎�3��)((D����lI)� ��VuLX�����9���6�E-�0��#3�3l��D�H�ݵ�R^�#9p�6��]�@�T��G������wnT�Ͳ9PêPnb�[1#*7(�x'� ���o�/i�L��&Đ���b;��D\t��1�SÓİ�*�o�J�������([�ޟ@���j]���t�h�#*�#9Я�Ҹ�eV��)�V�w�uv���:�� j�F�}���X�3B�ZKlL�6-&�F����E���eu֩�|�E^+\j%D ��gq�)����?[�<�XJ.n�mS�9o�M⢠=]ֳVB��C"�<�{yt�;�~Yt��.���W��1�&~t�^�4�e�,dO���ʪLbzg���Ua��a���uiv�f���t��Ԟk[�f�L$��A�K�e��{.��L���8<6f�!���&�sZR��zm��jH�@�:�<�I��B��Vgy�# �q�\yu�k��h7����gI��@Xj3(]��M̘4%a�\���lT�0[E2� ���_w�ն-ϑ��B���Y�q���Gz9��%��2u���3'��[\����8JyO��X�h ����\��s^{Zҵp�<�_�)�j#�/��ȣH`#3�����DS�N�0�~b�*B@��v�`i�5y"Swt��0fo�#3>Obc��_)90.�l�C7���rێ%�]ೕJ�B���:��O��f66v��1��JX/U#�G��/����c|���L�wL/c�B��h�A�)�����`2�AKm�#3�������\��[�4��S0�yҁw��D=�`�v��P#9��.�"�RQU2� ��8��,@YW�dҨ����#9DY!/�Th"�!�7�v^�E�W#3�p������I-G��,l�]6�UR���s���h��!Au�d�eqR$�`�i�@N�#��J \�A�(7��>�d�!��QD�8#C��(��}W��ˌ�"���S<���Ҝ�ģ��>i�@��{n��5LŬZ���Ї�W�B#*�~x?O�]X�7���Wz�t�TC_�}m#3:���Hn�V,����&���q4�#��PbK����T8i���0#N����$�[~��i�.�>��XHk�ҙ�!����jOA�BX�� ��$ zxġ��D�����N윚F"SP�ir�2;,�V�#*#3���b�F�����J#9K4�A�UZkU�lh�f^.^]�Kun�[�,�bSR��ZՋl��`�uS��Q@����J�^��cP��en�9�.EI�A#���dB��jD1Bk�Ӟ�����f�}���djC���!`���<�N�S�{T��jE�(]�O�!i's ���d�<h6�Bg5�#5��XF�Y��͇s�jΦ$R�;,X!������#9���O� �i3���ọ#~��7#3���'��d��\�=��@�{g�w����UI�.j����څ��[��t{uy���������n���Z����Y��ʯ�����SEX��j��r�7�6�����"}��K��}�i$S6�O�!aB"(Ѯ���2*0�/�|���?������`���8���Ծ��$���N�m�k�,'�C���X�wH\���%�rQTA���ؘ^0��?)���V�l��7���z�a�#�k&�`#3B#9c,҇l8x%���)`��I���k�0�<C�}��š���X>���(DI�'?%���8�I��v8�h�C,��� �'{v��Hhl�t�!c�#*)�*0�f��˓��|�I;hd�3�;��7���(�����k�#3���ѳ#7Tip>�����K�"OPhx��\����#3K��x��h �i6���b0���<`�����o��2��,2V1H��Z��Xg�6��.�@����j�p�#3���O�̝�(�$�u������S��$�x&{y(�8�.�� � Ii�����6f�^�B9i��f���]#3~�ݍ!�2�p���G%�[a������"*���d�vh�CbZG��h��C�#90�����_���IA�^SQ�B���g�媼C�d<��R���-��������a�� ^�*�OA�GBfyt)���"�6vn���(2�%M�#}ME����sm�[F�����F�Q�l�ڊM�m�����*��c��Ss��i�jh�;:���i�r��#9HE��b0##9���\��E�ڈT�b�vm8M�ݿ~��A�pw���7N��"`�MQ__����;�%o�s�yB����o�����#*z�ٯ���4y�FSc$$����A�A�2�K�^��~��O�� ��wƿX�PR�#3O5ly��<Qs������9�#9J����x��WG�ĩ�c�����̧v쯥���#*vH?I�8�߮�_"C�F�C�C٩��#3��Ԅ�#9�v볍^u�������^�AKBl�5�J���^��P�6f�s��zN�(�(2_Ѻ���C(i#9�� X�rUT���2����������N8��h偦�<X�ŕ�Vp���ءL�z����#3 ��]�q��� ���� !b�J�j���-#3\{*��-�d),�1��c��3�oB�0�҅�#9�p�����>���c;�I��h�|��>������cי�!�M".�uݽ[䠥6��Z�۔��|gլ���GL��=?Q�l�6�$�������Aʘ���� �L�\�9F�L�@e��j+nQ�ݗS䚏#3���1z��`v�W,@&(*��Ǔ��8�D�@Q<��'���ъ����<��9� ���swF!D������z��5:�s�pJ��faO��n�ihUz�N�5��fU���jјAIL�2��#96L\ �Eڂ�f�}p52��9#9]�B@i1��T�a\1�TH���f��5M�]�nVλJFԤͱP�h�]u��0&}��<������8�#3&�7��f��0c�I��B�(���qR#*2��zv�I��c�n�Mb`�0�$B%Zb%�#�p�61#3�� F����OU$?-̄5,�`~������B�2#9@"#3y��Ս�����\ٲZ�T��&Fy��"J��H_��.FJ��U���a����t��CPE#9@�TV#*�#3�k,� VcT,qu�<��53(�0l&��SSC)��ũ$4��be���&F�SR���ڹ,��0o^������ӷW�i^�vݞ/^�M*Z���j�{]{=���i�����MȆ���T�lJP��h^ �0�gaXD��`��x7�l@�5���D$�mq�M���1�V���N\�Z��i��48!�h�`k�UkH�li��k":���q��y���&�؍С M�Ѧ*UE��2�0��c7�$�E�j"B��J(���vr�ĎX��G�VJiQV��w�ʰ)�)*��EE�!h(bEDZ��IDJă��FC %(,�%�1#9Eb)45.�v�Y��#9��i�n0-��$I��i%ehC�V��c*5�Iꠌ1���B��.q�#Q�7�x�cy�n���djq�ڡ���ǔ�KLMm��s.#3����5d�/����>Ʊ��6�e�5�F����#3���M��ڙx�l���j���E#�[ҷ��:N`(��ڙ�����#3.#3�V��}�w�|�K$xj�ͭ�-��`p�cM"��[f7���1*�;aX����)�)��y!�#3G�xn$�O��7�B��q�h��v�������`f=���i��驴��I#.d��'Y}�\�'�������ADV���|�XWL�}2,-t�Ɇy��� ��c�dhU6��iu�*�LJnoY!�&s�Y�l��=P�c"�,�]���Z�(�Ԛ"X�0�^�/�Քe�t�,E�l�6d�ށ�)Eݑwih4��(��=D�(�c(3(Vݹ���G��t����Xi#9i8)DT@ƕ� ��4,���T��,��HF-�h44 "b 6b��K(������$��.3Hf"�B���;@~����<O��A��#*�婷��S[bX�ѪO�0&�����7�oT5~Ȉ1��*4}�E��=�)��5����(�Z~��d��m+�D��bȧ��S�(@T��1P/4Ԃx�yCɽdsՅfOW���q�m���M.���D�[q�9T�/�Q�7R�&i!\ސ���ʥ�R��#9�[a.����R��=��a��DBIa�L#37�n�SHB��x6�&��gr#9�Uӡ�62u��7��ふ�Z ɭ8�`��"s7�p�:�lm��i���è����'�����"������U��O>�,$c��7�uK�he�d3��SG�v#3���Ѳ5�ץ�x��䢌߮/8J!cO��10�=������h<�1��}�7��j�2��,� |���=��Ƨ�'q7�п��u&�qcg1rp�FR���D�'�1��'�������c͗48���B�E��ID!#Ջ@k���IbB(Ȋ�20�7��iK �D #* H0@$6��ʔP�2���'�R�G#dR&����t��*�+nWM�KWx�m��u˦��nW5;s!˶�Z�xf���F���Snqݷwjũ@�4�%���*B5)��^y�b��U^5�U��6!bX��6�߃б҄rE%���vY�*�#*�Z@4#�1U#9�B�i���#*W�H�!H�#*�"���R_-���ܴ5x��ֽ���D0�B��'����#3b�t�WK�eu�f�[�kR�X�"�z�QJ�U����iF���,m3EF�ET[YKAcF��Z6J�̦�ɒmMB6��H�ƶ�^v��}7E�4���G������_�Q��]q��R#$��*0E\���ÆG��c��/Z�K'��R���B�ȡ�K�я]��hǔ qo�Nb��E�!(�L��72���6h�h���U�#9�O���-oY�[N�κ�v�Zۘ���)-��\�:���km6�W���eb�U^y��6n��?�!�n�ĘrP�J||�*��S �y����C#*�@�#3�GB�B��tF��R%F��I#*�"2#3< *��IF㳧�� H&h9��6�P$51&=�����M'�=aO��O����k�6�ŞX,p\�9����Q@�����ީ%�� �f� �i�#�aꪏ��;V4i�0�f3�}�8��2��&���#�~H͒�9S��8�4�2[85������]�&d�9��&�y<�/aI�/ ���4C��6N�� ����c��#9��a#9�C�>�K���;�7�B����U�hĘȞdqq�\���f[�����~��Ѷ�U����8h�uKEdsA���/q���a�K���x�P��W�I�B���j��(�!́�#*�ǒY�<��M��>�q��Y��l���z����T?ެx�LU�}&e�ꕵR�C��؞F�Q�C�P���ANQO���IklZ�S-�4����6�#��1���\�I�\� �rh���{:��j�-�ڹU�"�)�Ǵ�����:�.H����� d�@�:l�"��!�[W�b�bą�#r S�U�AK1kR�kc2�yy����y5��]SD#3 �>ҩY��0��1)4Ҕ�pH¥8�l���0b�+m궷�J�ْQ��ڱ�$���E�"6L��4��F����(��#�%X��E�A2##*d8�3�Ƙ�h�3Q����PF�vƵ+���CP���9m%�- X��a��#9�Q%TB�B�b���@<FQr�MbvT��MP2iT���h]��,y�|��T�I�DP`�IIJH���Nw�fv#�JB���~��I>�����X��n#3�����رv��۶����ؐr�c1�-F��|8g�D#3s!�杯P*�o�Z�F�W�&"U�X;�#*�"���x���}$ m����U:d\��#3��?�>9Qк0�-~{Q��{��8��_� �/3��I:3^�'"#G�K9���}�ɓO���~X�9h����SD����udlF��A�2�˗��#m��v>��&���=]5�,��ٗP��!�{B"b��L�;��i��#9Cg�l��Yk�[����9%!� ��?�P�}� �$���B�Ȼ"�P�)X�0RH�,���{�#3�4�sl,�@)x��@ip��^����� r��NI!.Vs�~��N�ڵ��5�Qå��X�*��-�����S��s�I '\�](�Uݶ[�����L�`�� %��`*�B��Q��Lg��,�]x"e� MTI@���S)���a�ھq� hͧm,�h�i��m��d;�^B�R���dQR�ȖDF�T�Z/�YjM(����p،%\���;��yv㮺��:b�wv�r�oM��l���۫�U�fX���Z��E��mQ��[�[&�)ck�S�вm&��tn��ݙ�\��R��*�.u���E�j-uf�@��#*�u�-���K(��O\��wA܉G���� �����F�=#*w��oxxB�Q`�j�� �#9's,���/�S����g�{�r �p}E �< ȡ�-�z�G�'�5#3~ʶyd��m�m���#9���?Wps�u��,���AW��&�0EZ��Ͳ���D���B#9e��P��lm hС-O]?�%;!" D"F*#9�������{�ڊ�F�*5Rmb��J�#9ZE��D$G�}�ЁI�!�s�ɮm�.�ڜ���K5��&��y6�W�S�y��\�04�"�F�2BXq"U���jr�����SF��Z�Ќ�JzWJL�4�#9�{).�(F�(�B0%NH���0md���^��Z�dj6��R4�]+l�L�Q�b�1� HG:#3p���s ��~�A����M����&w��(�8`�0�b�J!���}`6�Bu��^#9*� �,P"�H���*kl�M�ڦڦԑ`��տ �� ���#����T���ճcM�LՍPD�NvW�y�#�R;�������i�Wd�M���������FkCfkl�%&���A?�H:dm�2v��-iv�{b�AN[�YGQtm��^Ӽ(jI&�ԣ���~F�s�Y�M�;���ݾz�ْ���d`?@�25?Ib������~�zAw,���1tj�/PD�!�v� KY�4-R�.�#MG��Ф�BHN#3���n���rk���y?��#3���{��#�y3^�`����,p�Д�(]�@P�C !R �Y%��`�Q8��?S����lM7�A�M���j���k%�^mҷ5�IW(�X&�m-Su�f3R�BWA*0�1�3�eCf,uYhXKE�����;��fR#*��c2�)x*�"�2iG�T�I$��L�$�+����Oo��`�i��g#*�����!tT�P@�{i���<.�Z��d���#9�4i�&��B��?��q��`���U���0ZKJ�) (�t�D*H#3���d�#3)#CSv��ߠ'b��Բq��0P�c��a֜:ʉ A����!�*����~5�Ȱ��H�D+u�v�b��� $5�A�<d ��3g��N�Z�����SwABH"�1]SZ���>~ֻ��K��ڸ�KRղ�t�wU�@#��T�+!"@�*�%���T�j"كdjB�B@�NtRYՉ�Ґ��0u%��3OBsp`FC�T��B���[�B�9�R���h� �.����4�J�,6���tb�Y[ִ���#3jk��x��K&I�#9�F�WY��Ʀcm�!+��*���Cl��V���û��˼��U#9�����#9�i�|��y҇Kʇ]t�=��w�<R pSIc�W�hw܃�#9�~�#*~�Q��r�&���$��#3�OU8H#�b�"���PR{(i����*D�o��k�����~���Tג�o#�`ޥ�9�P&oz։Hx '`7�����'��ӗ_H�v~��BV��=!�AFHX*f�?cZ��'ϼ�~(9��~o� �:�����O\��Oɗl�,1���NWJ���%DU'�y{��c[�%��oE�>Й��(P�6~�c�e�4J�*;�lP�C-�7��#3)� �!#9�S���KS�#�5d>�s�ϙTn:��c5J3�Mr�3w�DșC#3��Vf��Z����\)�#*c0�cF�������ӹ�OP�[{�a�篿C�C��#3���4Q�%Eh��&v�W9�eN�̴}���$s��UO�c�^�ϩ�{PC�Z*��I��ݙ�$p��Y�T �VTK�W�7�����䘡��Y�m�VЅ��9Ƈ�v�����Θӗ@+��7�7]�ή��ƽ+��Ȭ��]R���m�A�e����!��f�G3C&4�0�e�i5�j�]�����uL�K���r�vUzZ����(h��n���ޝ8�o+�L�hMO#9�x=g����O4�{֓́�[����r�́�]} �#=����2#3������w e{[�+���oaNP4qL�n#�>һ<�o*���������(�K��G!P�u��b�������ގ�t�#3��8�!=�dH���!���?��<����T�-��WMC���^'Y�tz�$GF�h/�:�r0�G2�f��زe�,�\�������#3�9S]��#�&���$�H�f��(*��%���*�&�h�(6�T���ջLÑo�Qn��+��p@���5����Eŏ��{Hy���u�II#*�Am�������^�"�2����3ǂ���ZK@����K�C��T� P.�##za�:�#3��s��.�D�&ɑ�i���M����~�����V����&�����?}�{'RKd,�Y����mv��#����zQ����^�+��l�AA�cB!a�v�gc[�2���q����-던�~��?����ȏi�!���Gf��MVy��aފ��(Q�[%��VŦE�(.�����+�c8c#Zm��CA#3��oagn�Ř#9��2s��GQ�g<�3�І1#*^�{R��]�i!P�f$!.Z���8�C`X���銬5���?��Dž��)��Ҡs��k�g��u���KM��}�#3��Fz\$�a.���T%3h��I���e�:|4gT�d�����5�#3h6�r��6�sE*��_?w\n�:�ؖo�&�oR��:]d���<ES�Έ#*��Wv���C~��t�W���#*p�[z�M-زm)j������$>H���0�A�V#3�Ă��H"ȑR@��\#*�#��ã"�{+����zS!��(q;"��8��ΐ�����{Ӷ\@>G���`[�x�q� �:��[������6�G������6����ǀx�����e[i4�#*��A�յn�bZ��Us�F���@����R,*~�!�I�9��XD`�� ;�TUI�?��� ]���S�{�"����N�BgŹ�����n�ZQ�t�әӕg��ʺ ;R1!2�O����G[k�V6��Rk�E�6��� �A@j���pķ�[�f�~��|��!�@o�7�6��VmB#*�1XH �q�Z������fVRE��)�� H��G>����}T�@\�?���$E#*(��"A@�g�Bdn�1���?�x����P��81�����h�f}���P�~��x_O�y#3����|QA��_MB��g)�5��5a��v�_�t���kK���Nq�5gv�*c�ϕ���V�W�� I�����%k�-#9HW�1���g��~��K���ڊ���"��s o�o�2�2A'2�&�2�{0U���fR� �ک�eV�6z#o#3�?<�'�������B�T�RB��ل�t#*5�.�%���#3�]<����,zoXʪq���:o�#*�S�Tn�~��[5#*���-ci>碪l\TA�p�|���m�q����i#9A������7 �5!�PT~]VG2�Rd��Sّ����פ�w2UC��0��\E`,�#99�n�-rϏ]3I1����S% (ȣ���D�����L�U U#9Q��2�ҘB*4��a�(!c?F]L(u�p�_��bB�Y1�#�����?#3_��2�ni��NW5wOZ�T�k�6�d�,�m)Z��zt�`guo`��G�tX�q������-E���ʚ�V*,m_g�|�פ�?/��#*�FeRDQ�4PJmQ���єb#JT��B�&ʑ�PTE�T��'./�<`Hw�z�lI#���/��}Y��[�ͮ�K��q��N�a��6"�Ƣ3��b���F&F�@8$jBa~�KW����)@�4*T�}��^Y�c�L�TB��"��U�:��J�|���r����L�u���Cm�L���_�mt�j�r�����rz�9d��9pbj6����]���A0�1�ӾYp� ���<�~'��wb��ӕMi9�3>i��k��z�V6�\�r����$��B,�g��T�;=�$#9���|� ��$#3�ؕLd���3�su6z�گ7�aoI��6#*ؑ#3Rk�$��#*r#*��Z�gu��-Wk�K�p�Ac�,�r$�M#*F�#3VlT��C�B�� j�R+%�aK�P�(#9��x)[�R�PI��������*�Da�#934��j��m3k��2�NAF�#*Dg.{㭢��ivfP2�}��S���H"�a8=Mu#3��ƶ�'d�Ȭ�T�a�0d���s�"�=0����/S�O<�Y�ci���X�e@#9�D3�rz#U%�!�\"o��c6�H�� [y!��[H�m<��^��l�Ql�8��iF4"���oU��ԁY�`BI��w6Qu�x���y$D�GOF�*�1�,�EI&� �����hU�TF�8�L�X�-�4�Q�Olx�F��kM`� "Pi�eCbzp(�U�Z�N��*vaeu����T�К �uH�� am�v"6#9E���)e#3�-�hf5��i�##«�5��h�V�lΏ,sw�ұD�`�E\�U�.�($MI�)�M:m��2�[Y�,�A��٢Nl^�r���a�7�m�7��R���;#U���B�I�@�������xM�a����]���Ea�V�mf.��]A`���lI�j�����#3k��f,�F4mE����1�f�ጒ.�kRPnr��nbZ@�<(ӄ}2#9�#3/)�Tp`V������81`KV��*�#*�ʆ&�X�\�@�� �lh&�b��f�)i5!�b��Z(ܐ�Ds��aQ�������'x��^J*Nj�\3���2�*��P�ɑ�*ȡ���M3d�U�H1�.�P��I��hU4�"1A�ƍ�$�TPl�+���lU�70�m�U�DK��A���ء)�v2Y�R���(.���3�D��0i�C�P:'~3dY�~�5zN#9f����M�gFSE Aj���+#3<����1�4PQ�'�F�h5x#9J�>fU��ٵrr}N%n�$1Ԇ�2#9�����T��{��%�� V�1k�9cS�\'��&�McV�`��DM1�#3Rqb�rî�44hf�)W��a�r�#9J��6(@��K�`�#9@脱%(Ȭo i+ua#*�I�A��G��"R?����Ļ���x�p�ݼO���]1�2mw������Gt�M��[�o�}U��(�j6��ͦh�L��Ƶ�t�ȶ6����=�R��L/A���)����_�����&QDb-DD$�8�6>m#*.��ޯ�d�!~M@Z��:�'w��m�U�F֒���mF�1X Q�(�H�r��{9"{�T)�v���Bsu�볌4�,�ࢂ0�'��a�bs��Q�\���]�i �`2;#9�#9��&,�4�]��"����{k˥�H�BC=*B�UA��chv�@�b��05��6b�1�`Oإ�ua�75ݘ�Cd���`T"T��Z���4��c���6��0��L6�fF,M�K���5�^4�G�f�� tR`6���vRc�p�dY����~@�H~-vbŦ/����ߝf���'��r}�<tJ�&�nb���EKU���ςv�@&���ͼ��J�pV#9"i ;�[��#3����xe���@��Np�Q���=g���,�K�À��vF���^��i#3m7Nׁ�S���6�����,S i����G��#�Y9q���}��C��W���8��Lm34�M�*%�oIf�Z�ux������[�Y_�/�y�#@wcO@T�#3DT�@Bx}I�A��ST�o���Q9D�Kl@�U�&�#*�N�e���8(TA7�w��]k-�8��O���>�N��X@�x#3���M�I�#3p`����1J*,�~�W�Z�k�g�F�����B��#�oN#3�&�}��W5T�%�Qa?6����H���L�l,�d�$Bkm��A�����x����.���^߷�x�k�slk&�[٭�n]�U�k�bر��n��mt���6��[\�Kr�rӻٮEF��FьQ�Q\�Yݭ ��"���N�Y�/{������Y� �L#�g�{M2���!�c�>&#*�W"-���"|U�튫g�>���"�T�`���ƫ���h��iz]�D@>���_x�D3�����t�f���O��%��L+�D�6�6&�$���{�Y���M ��,�)T��2#3J�V#*���K��cO�`#3� �#*� �"(" X6��6J����*���U#9\Ļq�EE�*�H*4��-U%��ج2�ci&V5YK6�V�E�<��%�h�; �����:5��Hz�����1j��3�s��#9�*G+���}q�f-����M�!��j�v����EJ^�TT_����_�#*$�H1"$*��ܛ[f��Nï2���:�zN��#*�ACtE�$�H(��U#9�����f�$���FZ4�hmIF�T�&II+�X�j5lV�m�-+L�-�d�d�%��=�ۑ� ��:�d�,*���A��H��p�����l#ʲ�q�9��z���^g�uW�q؍0.5QD%DJ�$�����+!	�16� cH�����D*�F�т�C!D�F$ƈ�(h��AE@ �]���E$DZ�C0 �~��p�#��R̩�˧u�i��ӻ1p����h/T�[D#9#*EX����5��*PQ�"���0��X�`!0���:v�������ݟUis�E�)^�IR AO�Fv�̙B�>)�}Ë�L)�����aq��UUO��xM��-ȓ�e��0#@���1*!H�8>��˺�{�kB���D#35s��쪵�#3A��6=��;T��iL$�N�b����ۦ�I���T�f��w���F���kZ�\�W]z���J�}~U�C�����#���*^���KC"̑�$��u��d���}��{��d^��A�(V��-�#w$µ�����Q����߈��kI�K4���Eu��*5�.j��Mێ#���-yɥ�Et����b���F2V�Jk<������;ys���c'��[+�#3�,���{���8� �.#3g�����hp��t�;?M�ϋ�� ��pP�#<K��S�a���K;�u�(%���#*�0z�����Ѣ��3U�ɬw'�tz�|��b6M����OqW���跰\��q��H���`�i���<��f�^��otv�M��ų_"��gs��ff�ӆ��xf���=s*�+���E�䫡��� �GV)�ZY@�H�p��J{l������e��7����٥�'Ĥh�������I�v��uߎ��%:Z�����z��=7!I!&<s�[����`S�H��7���<d��&N#3����/ �6��#*i��UkQ�8�kRXu�}QrB�#9����P��]�Vn��l!� /�������H8�9�J]�Ck�H�>�ͪ��!s.�#�{KM������e��_�C{�TQ��7[��H0�r�^|}�Jj��o|�:q�]�?EJ���q�^9d�#3WR�����n�I����A#9�lE�PG-⛲ ���T�-��?\u��3,�ݞ]���l�^7/��l���x�_��n�3��$"�Q�N��v�����C�탁��h��#3�de3��~��%ͣ[VO�pWq}&���7���1l�2a$3���F�-�Mo�'#����ي#\�4ΎԪN)nh��f�UbURi��y�ʪ��-g.�$��Pt��cZbi��$�n DŽrmL�1:,��7��F��8��ʓl�N�6!�Z8�JȘz�F����g�ɖg���n-�QZڢ֢)ٷ���������m�vl�9�w�[j��#9w����9Z�Q�sr`�x#3�9��IƟD$���X�ֳ&9�D$�3�P?Fq�qi9�8�cm)uU�w�:幩�Q�jP�w��H�����"��vw|&6��[+��>/9��WW<�u�QMt-͢���)r�n�n�;���WG���%��̎�'�����)���u<m]G�>qՖ���fzx��<h�x�:�F��Ky��c���:���h�5ZxG��K����'=�����+n�*�ϳb)��u��:6�n��Y���#�~�0�n�.�w��O����^�(��hvc�Y��_���>����u�tY[���{��g�s����6�xpx��q��wb,���&�m��B��6�v3��Ƭ�bd�el1��s\�7�#3�a{NF�(Ga̱&�u%������N�=xrO�]�28r����֣��#3q��J���P�l�����cf�q��Q�>!��Jf �y�.�z�U���b����0�@�F�+������P(�y%�[p��a�;:6c86yS�Ɏ|��������L�(��ԡEL�ӿㅂ�R<�n�νk��{�T���Ѽ�X�w!!��F}N�4�YjXw"ZA��0�t���0��}��6+hV�a��2pw�`xn��U'��=7���m�h�P�p�6�s� �#3YC�`�z��M�sgN��H�Ft�"Gt�!���S�ف@�҅P���XET#�����lA�-�Ƽ�w����)i�R:˷H�#*:ϋ���r�:�N�CU49�x�.3X(�"�{�k�4p�&WQ����20���7XØkg(Q�j�}�B(pI]�AB*�h�����9����3�������Ң�d�v��%�Y6��EAc��E���D\{�K��o?)�Ԗ:ĩS8D�f��Ƌt#a�[���t����v�ߥ�Z~�v�����M����˧=#���'W��X梄QX.��7sDӑ���r�O�\�i���i��dq�n�[�4o#3̜u3�6Q�I��PP�<��C�v �2`��[�#9�WUI�j��t��;�J��u��Ą��Q�cgh�?4u�=�x�_+C��"�9���g#3������>��<�o�|��O�v��b�"��,�|���:wo�%�����w��y(��X��f��ӥY�D�#����1n`C��4.8z�{�R����ȧ���Q��h���լk�^Z�7A�+�17|���\m�4��-&z�x���k1��݃e�t���L���ƚp.�\�G2v3�`T�+���4B�HHj��*Q˒�`�l]���]�q^�o����C����6w\<���S�����dw����qgfO���hw^;����{�����:����mC�t'{Fժ�yM���Ё�Jt�L#3X��0U}f�m=�]�ֈt)oHʶ�^��:9�(j�H����*gpx���X9rL�b��5��`]M�+!����*�����s��;``Kº(���8P̏�f�*Ӑt}���1��#3�g��r�=�^�:nD�0\HCLl\�x�%���C#9\�~N.�0�4k(2` �n���p^�HA���5E�1�N岩�,��T*�rQԶ��&t�\�=��I��WQ�#3J0�YN �\#9#3X���,6��RI�)�#1d��=��+��]�;ð�:���`��M�6c�3(�xl@>#k�Z��&@�d@�r �`#*5�Y�<�%�oVffE.)�-�BhAvc~%��˓7���7�E�k�Pi�G�Q�ڲ�I�m�,E:�2#X�{�#3��{#�~gO"h���"^Hu��Űt!�Q�#9�yh-J�$�vq��V��U�l6^=0#99q���C�jDN��ިDb��;�d��pt�>�[�b-��_��X��~v�伫Q#!f��3[�"�#3#3�j}�hͧQ��J3+IZ6[�f�� h����бƐ�@��x���N�ȵ���V�pTJ�X�UKE#9��t�F�#*�k�m��Z+[���l��f��;3)DQ��#3�i�ց��Q2��ƔTE#9�2�(�#�� ��x�9_L�͇;[\��q,�ơ�x��.]�3��s*H+#7ѾH����zW�^*�]�#*�QOT�E$��6�@�`(�k����m:n��ik\�|3_e�<r�je)x�*�1��K+ud��/���`�0��m���a����#3?�1h�]�2���4�O�7�Q��iƌB��q<5��*�TB�^�� b������U�e!�)TE|��Ԏ�t�5�D�`�����cH��L�"kfQD��(�de2,Y0�"��4�hf��Ɗ�Z*>%?��3�jr��r4���=t7�r�jW�f�G!E�n�)dĆ\$j<1#3��ܸ1Lԭ�&�c����2�Ԧ�Z:���Y���Mi����M�kT�7 �eǒu�֬z�qs��V�d�bC��ȅ�5����4��8/%`�m�5f���$Β��5��9;7h��iF1����xlT��(DawV�T� �I�8Ƙяv<U�1CC�d@Q��۬�!�H���ʧ����+&JV���[1�L����:��n;nث�Dn#3a�1�JD�8��n�4k�i�<]u@1r&�H�iF�0T���3�s�]4��������-K�֑��ptC%c�F�Ѹe)Ja�h�Jhqi#3&�LMB#9��ѷ��o&K*��oNv����O�2�CdT��ux1��qkd��5�4Ea�j�nƮۺ#9�~O��J1��1�N5'�t䴶��Ԭ�(~5 �M��O�#l�#3�G�^8�ލ�+3QM�����#d)�zs�j�59 u�#���8Q��X��@�2m��"ɜ����'%SѢfqmPS73N�2�b�{yN��Q��Co�l�q�C�g[��m�1�Q[��?f�Q�aJ�}@eA@�c�r-H�vQ��&����cՈ��|�YLf������$)��o̥09�d��f�1�+��x�l� uE#t��w }IfǏ���L�5]L���7I�"�fx��s2�5�Ɖ�m�h� ��л%����lz|�C\�X��#4������ �:�A���/aA7���6*�QmJB��/=j�ʟE�ޒI{�ܑ�x�=��5�})��5R�(�R#�u,��n`��vy&�9����C#9O�DGi%��o%�ھ�4��s���ډIH� >2m�����Ϫ{�`�")�4H}&�.w��c8#3�lb�Sv�UQ&Iˑ�D��YJ�d���oPO�W���eӜf�l�N������ϩC_�b��#��zB�H7 j�{|����;x%H�������g����&��rk6�<���-?����lʩ\\�g��os��z��z����0��Uhi�Q��T�fy�痮���r�ZH��=@r;$ �y�#35�.U�<oƊ�i��0��?<?C��顫<���<���Ph#����y�!�D��nb�vtֺRUڦ�ڦ�^]sV6�#Z�^-"�B��(�E~e�;���O1'p�{���z����c��?`��(,��a��m��1�LbȚ�RP�L�)l[%AV�IEQ%d�B�6TlQ�fЦ�$ғd�)I *#CZ"�JD�d�3E��)Tх��m�0�J�aRI $QO���;�r���e����|C�����ކ�~�4c�ɷgt�f��{@Y�mv�#*~]#*��l:�LOt���Y��0K;be��*)���+ ���}V���⭻��$¶�b#9���#*b�mC�d7q�5�T�#9��ݡ�CF.���'8i�#I,��ԙ>��0�?��/__�������y���$�B�4Un����8s!L��}=D��L4b(�a��XUatN�[[���zs���{Ͼ0/U����x��5k�9�,�i�T�=+�#*}I��h�E&�&�j�Z��}#3Z崨ԡI�ыX���j�me�xR#9U#�K=�~&r}���^."T$ �()�H�x��,�y������.�B��}�H֟��vj��W�E֢���jH�&"(�ك�&��h�=4���,@F�DL��z��m�/>I-�C4K*�#9��a��\dQJk�~6��z)7���Lb��D�o[��l�<1��wy�PĊ�P��&FEb���vѻ,�{Ud�{e��&��%ݡ�Q�X�#*K�%���m�kvE&bk�\Lߋ��5����9��l،�~����b�H�jfxlДa�$;���<�d=Ba-Ր$��U9D�Q!$9@d�(H�9��9��d�$�H� ͊�_�ƷɀzPSMR���R����>��,�ѿ��^�◩�A����ϻC_��F?����.>�'�������ȹ�B�N���ȓ���@��7'P������پ��#3"E<J�Z��d�1+�fh�e�������C�,�~J�r>�$d�%�v(x|:lO�����d�g��~.Uo�[52UQJ�m�]B�������-M2�Qc�R���B��F����k��܉f���"���(�Y!�(��p�#9C���Y�#9HK�2e����nko�j-�ֺ�{�G��3�Ћ��:l���W@�T��v�}iԝV�(��>�Eu`�n��� EY̻׳i�ێ]�? 4=)8.�Shm �0��HYd�Q*�Ne�]�{�9��/���gΰ�yށ~�qN�p[Ⱦ��N�ɱ����s�U9喅����#�R ��B���pwʤІ?Z7Ot�[�����~TQ�� �*�L��^���ľ����Dh���]�*�~�/���1��b��=� ���]"�����4Rb�!�:ݕ5���A�g�����#ߡl������yxk# �_���f���#�� }_~�p�k��c֚2@���2����)J��)� 9�<nNΛR>7����d���<�>#3�X��p�;I�bK�~%د-CV�ߗбG�$��&�%➠��}T�g�g��٬ڝ���1��,�P,`�YHm���Ĕ4���m��͢8!N ?�X�e��m�)bi��N��UcnF|p��%g:$�8�)�`&P�5CHfo��.����]�p5��r�%��m#38��6g%� ����#3�#*�m@8��nw�?<ꙙ����2�wv�ҥ�5�BY �e� �����jz�� ;P����܂�C1�>d\4�f>�GN�=���#9�"���*D`J#3�C�����!QcV�(�m5�l*@K�e�%blFR>������4�H�3i����B�2��`l�� f���ɶ*D@E#%�q��ާ��f�4� p�E �#9b0��:ŝu��&�0̔����Q�>~Pglg}�����H��g雇lѓ!h��]�d&E���YWZ�L�-$TL�O�F^Wu�m����'e�x�l뛪�v�J����� �^z�~�љY'ǻ�K!6�EtI�vkbR��c�o����~hZ���3�Ĥj axuGz�҅�"�j�Q%�VLREL�#*Q�m(����q�ECE2���$֢QJ��D[Xb'(�+X�y��!�Z&��'X3P�:ݖ$>�*ؚG�R�A�:ꘉ�Rp�c���G$)�^�kTb��0�nU�#8����e�be3 ���9����!&Z�JN�>,�}�%�;!��HC;��"���Ƣ�3m&X ݶ�i`�.G�"��j`��`�F��%���,�F�ә� ���`�]�Y�\��#c���CI�=��C6@Oo]6.[d���Ɉm�*�ܡ��g0ڛL�i���;Kܺ{[9�[m0Zyk.e�F��V��z�a��c��lL��çq! �Ǚ���͋���Emo|k�������3Huy�}�[���eZ�o��g3�)I��$:&�}z̡�B���o�jtq����v'#3t��닖9X��7I4��:MK��'R%�sj��8�r�T�5[e�fFʈ�ΡL��@�Ő#3��|9֭���N���b�/D���'eR�t]�˂�ߊ뜢C}�F���&�!@���#96��t̓�sYs=85�˦�.˙���`q���h��7N&26�T v�S����b$#g����K��i��t͑E[8�"��Յ�0�/0�F�bt�hfb�6P�,E�*0U�l@�ٚ�ܠ*�"��#3PUr��:wfv`�BBN���F���#�#3�n9-l1�K�� "e�d3ҜQ�49���&7f��灍��u�{k&/��٥T��!���{�lr�b�s-���\hb�|�;��^/9�G��NI�0}���i�i6�j#9fÊ.h���g��.���@�����l�w<�6�'ˬ<u�ȃ��q� ��t�mt��1��,̋��SWː��Ǘd�aK��!-��ɫg�F�e����:�\E�p����yp��fg`٦����:-@�Ƥk1�oپ�2l��ESB��V#9��p3B���+�1�5��bS$5��q�\8��}��r�1z�˷U*�i"q�c��kP�dg��$4�8'3S�pd��$�A˵���0��)��Ƭ�T��b�inz0��j�h,V"ޘ���T�s�A��3�v#So3P�O;�� Za4Jjrs�p��fxLc�^ ʪ�d�ۙ����I���Գ�� 靉�fH1'L3��FJ�P�v���'b�5!V(q�NP wi��嶗���|���L�x�k��|��L|d�Q"2%�4�+��;��`�H�3!�q��X��&�ۂ�3��H���~I#��$Pm��=�3$pcghƒ�*�5Md��#98��u�%=�3�`cLУb2*��T�Tu�I��8B�C�30m�[F�"�#3L��`Гc*�D3�ar��"d�G ��i̋�Y����oʊF+���)��4��b�B���p�p#3����Q+@,�'�-�oq���!������"I��!S*��vI.ФzC!,��;PȤ�P��s*A�U;3M7� �`�%#3��U���H���Ml�]�1`��SFΦ�;�Y`V���hQ����a��H�V�)#�C8��3����@�ps�;������T�#&�4�#3�����#9D7�4�(Q�h�ah3B�jQ@PDB"I�A<��t��ck��eTD�T���v���=c`�:��R;{T�HH��m����/�z6�)�u�>�ŽW@vBݳL��_{N6`bh�����h�Spň�әe�o-�#9�8��I�h�GuЩ8kK�Ͻ��za���Q#3O.�0�a����lD26|��}=��#*��Z�(�}v�/��HĻ��m"�#*W��p���0�P-�4A�P��=v�D�n��'�з�.$����ʑ8r�2��"diZ���d[�J�h���"�$M2d���폹��0�|r~miGR!�DNq����+�#9�6�T�}���W��x�nh��<��f�����M�����Ji��E}k�ꏨ#*��2����59�p�2�Λ��ǹ|?$@�d7���|t���'�Bi��UJ��P�F�E#UQH!���K�U�̈́�%�F��� YX�b+iQ�"]�<]�o,̂c��cp�D�H1U"ckl.F���P�KJ[m��$r⁉$,"&���BQ���b�C���Q��Rf�#*�Lo�Q�������8�s���֮��h���i��h�(�:#3�!t#*&jb���!#*�k!����ϻ�� D�{%��%�k�����T�0�P��i�����=n��CY�ŹF��DN��#3���I:f�"+��#3�]�&!��W����TF�0+6ÕA�r�%���Q:\7���*3���4�<h;ڳ�d4hꨚ2���1eW�d/�p��Pc�ǧyY%� b��8� ��§�&�i�ݗ/R|�5���#9�&#��[�3>q���.Ɉ��R�@�� �J�|=�O0A�=��x�䐁�@�OY��h���л��l�z̟��(q&�1�т����eF��zL�a��I��[vsPo4�37Y#"�H�u��7[dž=�T`�U�W���]~GJ?Ck�&�6��*��D�j���5RV�PĖ��OZJ��T��V��k&��Z�V꭫��SRns!PKы*�E[$T.B\0T�n%RzWr/�+"��#9���ɻe�B�%�QJi��3ڀ���{��k���8�z\�n�ȣD@Y`�0&��Ow�{ý�S��p3@�b��#*H�Ȩ2#9��N[��4�O.Tqٟ�*8۵��Ѣ�x.�+����Z���-(ʌ_���P�V�����l��"��kwW5�%�<�I�+�.f#3c+H`���D���M!奴JH�2EVdA����7� %"�H��%$�t�"oDd)l�VJ�)q)B�N;y�5�����-��m�M�,�#9��#*���0�`@&Fu�H#9��rRf��R�(Cm̋0�-i���o(�=%z�<��^�{����Np��֫G@���2��\�l�+�}%�v�_,;C���pø�#9����p(F@�ׯ#3����.�|�,�*,�C���#*�������Ik}�V�z4�0/9����a`i`;���LH�W��h��I�#3wp!�"O8�<�N���uDW�Ḝ�cb���kJ%���^��*5R�E}]�,,u4)L/Ǐ+�ꜯa��� �Εm����#32��>��(z� ���dAdz�@XB�Ji`�UA���C]I{���%�6>Y���=)�/�z�OR#99x]o'�T��� �ZM*Y�,S�,�AU�6�XM�"��e��QU^O&�^\�t��ʱ�c���22N��Ձ�y'�8�Uӑ�������x��#êp��&�y�\�m'W_X���L��pѐID]��� ]>�!#3<9u���6�DOpp���p̊�t"R�g�4̂If,���ё5�l0��/P��YDX��N�&�2�F���$HB�&+|)����i�Z���5EC�ó��D���m-��sK0�ݸ��p$���Ie�ݙ�ț(5p0����F��� Z,pt��F#3���ABiD��|U{�����Hl��U&��3�5#�h"(�1yOD�T�JBi��"u�C�u�&-#9A#3�i%6���"Y%p��3��*Z�Ww�*p|Tȃ��`�-V���L�� ��TkA��Z��b�Z�a����2�?S.Ɍ�J���,��L`AqȊB�>_�%�^��-�� ҁ]�J�]@W�#9,�Bd{�@Xć���<C�/w������/*�.ʇ�r�SZ�)���l�[䶪�Vw�Q�t�_���P*���=/@8��hE��#3�'� FqY��D��j���o�B�"�҂c��A�A��.�Yt��)�Yȡ���1�������MN`y�>��<�ۄ;J$p�0p���ο#3æ� ��X���拗p�� �Cw_��/����~k��Z�1�#*� ��q盧f���P�S��kއ�#*�~�#3F��i�X��#9�E@�u�#9�鯢7n�z�uQ�72�$��̏Q���e�]0�6F����?c�k������7����b�J)�5(�y7s\#9�6J��U��n"Y+�����+����-�6��ݵ5��DZE6�y-�w��� E_A_m����y%f�l$2i��4�*/�Mq0��w��xx�(� �QY-M��Ѵ��mE�1!=�R|26�P $X���JF�Ѥ)fJ��}~�Q���[�i�F�1j6�V��R�[�j��JY%��L0�����5%q���d\�aO"qM�W}BFD�@����Zn�1M�ak-b���#��T�%��D��x��m�R�����mU�!��#*^܅g�|�{�ϣ��%ݝ���_#*�k�qJ2{��y�Nژ��T�rQ����'�H� �#*z��a�C���8�5G]Y�a��S�����-��I��qУ#3hdd����;G��i�bz2`Ld*�u���`D%��@�ޭ}�#9���Q$&���#��ђ�#*�T�Or�@$ �P�Q�k��v)mI��tmT��iP"BJJX4� H��665�L#9#*�Ք�����#9�m��rT� #*���Ie��eկG]!��|�-�����/nC��#3a���, ���- ~�������U�k谠9�@�}ȡ����.��8�jW_����f07����{��wG�8�oE�N���nzX����/�D�vŹ������b#9X��ɶ�I���;t�إ4Ҥ��1Q��T�l)hߑ��CW�Xh���`�dT��Q'O��}���$#l$��ZČ'�[�tO�.���(bdE�46�(�,���T[�>���wm�,�+ ��eU�f�b��ʱmF5��(U��b6�a �F�<8�ɿ+s_,��%|�����]-�VY) !ˆ$�&}I(a#*Q�yP�|1f�n$ڒ�Ʃ!F�)�����/��ԝ7��BE�Z�G��Y)�e�lT��#��b�bs���c���0@4�#9&�Ϋ������4�M*[�����1��D�1D�*�D�Y-������n�3vfUv������$�E���v54J��]�m&ʒ�"`���#3��#9�����D�9)V8��mF*65F��a"�oo."�)�U��MI�����-�%X�И6�j�e-y��v��E�2�]4A�#{7�Vlz�`!I`�A-�2i�#3l���^uU���,X�_2Ȩ�PL�(�#*�@��yd�mG�i��[Fj�V}�2� �/|�1���v�H���(l���w*�״�u@���e��]������\<�%�C��f���;�"�����&�z���X�3�]95����K�wk�<��D�fB�vL&��;j9}#gk�##3wr�Ɉ^�2�W\�;>����EW(�g�7ש1�\��V�MN�1U�Sp"��>9�ڬ�����2�_�GA��W�#Z��O�J˺�Rzk{��lI�$�#*�.\H1�7!�dI���&yɫ���B����$-��S2Lf_#9��z��T��q�T7�y�&5�"�g�t�a7VC�@1��>^#,�iy�<� B�=��O�Q8�y�M���#3h-ZN���QHX�G`�iɐ�3=��&�@���!�v��!F�(3⚝�Y���������WiPd�b��貔۩���DTb�X#*�'�Q��/�lŜ�E�t�~��fwr�'WwN���6�����iu4>sꇢI1X��X�m6u��:;��պ��#9%��`���s̪����z�k��j��'�Ir�DV���v+�V��mAn�2U0�9$�ʄq}~Em��\#p�u��~�)�h5��B���N&>r��o5�7�#DF)����A{�M ز$�C�Qh���sWwvV} �I�c����о/�z�V`"ω�ˏHْl?1������`��af����y��j ���-t<#3��M:�8kP�&d$4kF��f0�d1������D<�)':�n�^��-���!��+rP�:����~#*��0�WߔBЀ\�����O�`YT6S���o]#*#�,�#*�#�0�>��7u?��ǧJ3hE/ J��>�Ƙ������ՃL��A�W�;�x��?������/����>?��������������?��������~���Wv��������|���������ǿ���b?��������������������������G���_�;���W�����g�/�����?���^|?@G�T���0#��#��1��2Ȟ�lC!ͫ��yH�� �yp���`����J�_�s1P��A����BJ��a��a0�x�����ù��I I��>��T��+�h�#*k���;/EPC8�;c"Q��Y�5��������xq���l(���\8nL�M�͐�����7ے/g��ȿ�e��Gn:�j d��<�a��ו�5�Y�|�aЙ���/�K���Oa%r�?�=w������+���k�8�#��8y.���P�p��Rڿ��u�J#9,KhL��#��9��#3\�)���q����FQ��b`��s!)U���ٙ�\]��ojTԑ#3��3�KL����!T�L�N��*a����qDh�SUS�ѽ����&^!ݰ#�B;;��4+�ˉ)�cM,�����q��$Tq�ma�n�ëN��YB�f�3A*� ��6��K�c1��i3�#9(~|�ad�����#3�-��}�Y��Ţ���D����2��P�cK(�^�d�cUp��CAZ�e�ʙ�CfrvR�e#9܅Jc�Ҁ�R$Z#1�\������m��B�$�A��f:�:��O�� �EQa5�lj�0��ԝ��u#3���G��[1��#*�� <{fǚ�;j��_��y�?�w�Ɓ��\]�j״��=L,v�k5S|�bQd�#9Du�OB"a��a�S�iȴCB�W��EөZZ)`A:����%����X'ݳF̰b��4p1��!�3DE`�ي�XT/�w>�|wjf#*s2���k��.\��ĥ[�#*��(@A�%7��eCEP�1���d:-**�!�$���=��{�6/���ݳ�>�$�ј��:�y��|4}^v��� ,F*0 ��������A:���^�"��V�;����j0�I�ԤLm��Dж#9��4�V�����$H��35�]�u�W��@��=�=Z<��������#*/�T�i��)lRe'C�(#3ʔ����:������G�وi��W��Fr�IP9�f?��D2��5ǻK���*�ABh�Q?=���$��hei��N��e��6Hd�ӆ�m�迅#3��|�(��4��gF9v���jo�A��)*��0�Lc�e���C�OMdq."��|���-9���g-]�2��%�1�D6�G���a�!�Z�W�9\�ŭ҅t�44l�s�V��=Z��X)5[}�챯�Am�5�lm+U����m�(��oSF�&Š�^��r�{|:��Ϊ�vm�唰qp�71Fg�d7��N��O��n��N�N�"�#'@�x�ǹ�me��#����R��x��.1�&�%Ǖ���IGP������ �_�#9�^4�@$f��R���珗��;�Nh�Gc������\T=*|�#*��`�(� @"�ڎ[��n��\٪�-���������,�f�K{ok[_�DH��� ���w�����٩�?�h�b�����0=3��Q��2ˠ�m�-�8�@�d�4��V�O��k:,�'�ؑ������G���7�k � d�I�V��{ )"�/���(�����z.�5���La?������l'������M�����Q�h����TPw�>?��g��Կ_�1v]����i�gt�t����)��͇��{�n8A�=e���<Ð�1��������/�s�[)�@�G;���W����a���NIC��٩7a�S�p��<����3 �R��+�R?w�Y������"�ScعB�Ď��{Dx|�@{������RA�(��(��E��t��'DS8&�5\.2�`�þG��v�;h��VV?���7�n����<#D�Z��A��xm6x�_H8ExR�å��� �.BP�N1`�#��K�CE.PZ�Q9������h+�i �o5L{��y��*�s��<����V1���$���A�x�mr��T�P��SڗO O�u����_�Ȭ�����F������������/Y ?���"�(H&��#* +#<== diff --git a/waf.bat b/waf.bat new file mode 100644 index 00000000..dac6143c --- /dev/null +++ b/waf.bat @@ -0,0 +1,101 @@ +@echo off + +rem try fix py2 build +chcp 1252 +set PYTHONIOENCODING=UTF-8 +rem from issue #964 + +Setlocal EnableDelayedExpansion + +rem Check Windows Version +set TOKEN=tokens=3* +ver | findstr /i "5\.0\." > nul +if %ERRORLEVEL% EQU 0 SET TOKEN=tokens=3* +ver | findstr /i "5\.1\." > nul +if %ERRORLEVEL% EQU 0 SET TOKEN=tokens=3* +ver | findstr /i "5\.2\." > nul +if %ERRORLEVEL% EQU 0 SET TOKEN=tokens=3* +ver | findstr /i "6\.0\." > nul +if %ERRORLEVEL% EQU 0 SET TOKEN=tokens=2* +ver | findstr /i "6\.1\." > nul +if %ERRORLEVEL% EQU 0 SET TOKEN=tokens=2* + +rem Start calculating PYTHON and PYTHON_DIR +set PYTHON= +set PYTHON_DIR= + +Setlocal EnableDelayedExpansion + +set PYTHON_DIR_OK=FALSE +set REGPATH= + +for %%i in (3.9 3.8 3.7 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.7 2.6 2.5) do ( +for %%j in (HKCU HKLM) do ( +for %%k in (SOFTWARE\Wow6432Node SOFTWARE) do ( +for %%l in (Python\PythonCore IronPython) do ( +set REG_PYTHON_EXE=python.exe +if "%%l"=="IronPython" ( +set REG_PYTHON_EXE=ipy.exe +) + +@echo on + +set REGPATH=%%j\%%k\%%l\%%i\InstallPath +rem @echo Regpath !REGPATH! +REG QUERY "!REGPATH!" /ve 1>nul 2>nul +if !ERRORLEVEL! equ 0 ( + for /F "%TOKEN% delims= " %%A IN ('REG QUERY "!REGPATH!" /ve') do @set REG_PYTHON_DIR=%%B + if exist !REG_PYTHON_DIR! ( + IF NOT "!REG_PYTHON_DIR:~-1!"=="\" SET REG_PYTHON_DIR=!REG_PYTHON_DIR!\ + set REG_PYTHON=!REG_PYTHON_DIR!!REG_PYTHON_EXE! + rem set PYTHON_DIR_OK=TRUE + if "!PYTHON_DIR_OK!"=="FALSE" ( + set PYTHON_DIR=!REG_PYTHON_DIR! + set PYTHON=!REG_PYTHON! + set PYTHON_DIR_OK=TRUE + ) + + rem set PYTHON_DIR_OK=FALSE + rem @echo Find !REG_PYTHON! + rem goto finished + ) +) + +echo off + +) +rem for l +) +rem for k +) +rem for j +) +rem for i + + + +:finished + +Endlocal & SET PYTHON_DIR=%PYTHON_DIR% & SET PYTHON=%PYTHON% + +if "%PYTHON_DIR%" == "" ( +rem @echo No Python dir +set PYTHON=python +goto running +) + +rem @echo %PYTHON_DIR% + +if "%PYTHON%" == "" ( +rem @echo No Python +set PYTHON=python +goto running +) + +:running + +@echo Using %PYTHON% + +"%PYTHON%" -x "%~dp0waf" %* +Endlocal +exit /b %ERRORLEVEL% diff --git a/wscript b/wscript new file mode 100644 index 00000000..ede9efa4 --- /dev/null +++ b/wscript @@ -0,0 +1,160 @@ +#! /usr/bin/env python +# encoding: utf-8 +# a1batross, mittorn, 2018 + +from __future__ import print_function +from waflib import Logs +import sys +import os +sys.path.append(os.path.realpath('scripts/waflib')) + +VERSION = '2.4' +APPNAME = 'hlsdk-xash3d' +top = '.' + +def options(opt): + grp = opt.add_option_group('Common options') + + grp.add_option('-T', '--build-type', action='store', dest='BUILD_TYPE', default = None, + help = 'build type: debug, release or none(custom flags)') + + grp.add_option('-8', '--64bits', action = 'store_true', dest = 'ALLOW64', default = False, + help = 'allow targetting 64-bit game dlls') + + grp.add_option('--enable-voicemgr', action = 'store_true', dest = 'VOICEMGR', default = False, + help = 'enable voice manager') + + grp.add_option('--enable-goldsrc-support', action = 'store_true', dest = 'GOLDSRC', default = False, + help = 'enable GoldSource engine support') + + opt.recurse('cl_dll dlls') + + opt.load('xcompile compiler_cxx compiler_c') + if sys.platform == 'win32': + opt.load('msvc msdev') + opt.load('reconfigure') + + +def configure(conf): + # Configuration + conf.env.GAMEDIR = 'valve' + conf.env.CLIENT_DIR = 'cl_dlls' + conf.env.SERVER_DIR = 'dlls' + conf.env.SERVER_NAME = 'hl' + conf.env.PREFIX = '' + + conf.load('reconfigure') + + conf.start_msg('Build type') + if conf.options.BUILD_TYPE == None: + conf.end_msg('not set', color='RED') + conf.fatal('Please set a build type, for example "-T release"') + elif not conf.options.BUILD_TYPE in ['fast', 'release', 'debug', 'nooptimize', 'sanitize', 'none']: + conf.end_msg(conf.options.BUILD_TYPE, color='RED') + conf.fatal('Invalid build type. Valid are "debug", "release" or "none"') + conf.end_msg(conf.options.BUILD_TYPE) + + # -march=native should not be used + if conf.options.BUILD_TYPE == 'fast': + Logs.warn('WARNING: \'fast\' build type should not be used in release builds') + + conf.env.VOICEMGR = conf.options.VOICEMGR + conf.env.GOLDSRC = conf.options.GOLDSRC + + # Force XP compability, all build targets should add + # subsystem=bld.env.MSVC_SUBSYSTEM + # TODO: wrapper around bld.stlib, bld.shlib and so on? + conf.env.MSVC_SUBSYSTEM = 'WINDOWS,5.01' + conf.env.MSVC_TARGETS = ['x86'] # explicitly request x86 target for MSVC + if sys.platform == 'win32': + conf.load('msvc msdev') + conf.load('xcompile compiler_c compiler_cxx') + + if conf.env.DEST_OS2 == 'android': + conf.options.ALLOW64 = True + conf.options.GOLDSRC = False + conf.env.SERVER_NAME = 'server' # can't be any other name, until specified + + # print(conf.options.ALLOW64) + + conf.env.BIT32_MANDATORY = not conf.options.ALLOW64 + conf.env.BIT32_ALLOW64 = conf.options.ALLOW64 + conf.load('force_32bit') + + if conf.env.DEST_SIZEOF_VOID_P == 4: + Logs.info('NOTE: will build game dlls for 32-bit target') + else: + Logs.warn('WARNING: 64-bit game dlls may be unstable') + + linker_flags = { + 'common': { + 'msvc': ['/DEBUG'], # always create PDB, doesn't affect result binaries + 'gcc': ['-Wl,--no-undefined'] + }, + 'sanitize': { + 'gcc': ['-fsanitize=undefined', '-fsanitize=address'], + } + } + + compiler_c_cxx_flags = { + 'common': { + 'msvc': ['/D_USING_V110_SDK71_', '/Zi', '/FS'], + 'clang': ['-g', '-gdwarf-2'], + 'gcc': ['-g', '-Werror=implicit-function-declaration', '-fdiagnostics-color=always'] + }, + 'fast': { + 'msvc': ['/O2', '/Oy'], #todo: check /GL /LTCG + 'gcc': ['-Ofast', '-march=native', '-funsafe-math-optimizations', '-funsafe-loop-optimizations', '-fomit-frame-pointer'], + 'default': ['-O3'] + }, + 'release': { + 'msvc': ['/O2'], + 'default': ['-O3'] + }, + 'debug': { + 'msvc': ['/O1'], + 'gcc': ['-Og'], + 'default': ['-O1'] + }, + 'sanitize': { + 'msvc': ['/Od', '/RTC1'], + 'gcc': ['-Og', '-fsanitize=undefined', '-fsanitize=address'], + 'default': ['-O1'] + }, + 'nooptimize': { + 'msvc': ['/Od'], + 'default': ['-O0'] + } + } + + conf.env.append_unique('CFLAGS', conf.get_flags_by_type( + compiler_c_cxx_flags, conf.options.BUILD_TYPE, conf.env.COMPILER_CC)) + conf.env.append_unique('CXXFLAGS', conf.get_flags_by_type( + compiler_c_cxx_flags, conf.options.BUILD_TYPE, conf.env.COMPILER_CC)) + conf.env.append_unique('LINKFLAGS', conf.get_flags_by_type( + linker_flags, conf.options.BUILD_TYPE, conf.env.COMPILER_CC)) + + if conf.env.COMPILER_CC == 'msvc': + conf.env.append_unique('DEFINES', ['_CRT_SECURE_NO_WARNINGS','_CRT_NONSTDC_NO_DEPRECATE']) + else: + conf.env.append_unique('DEFINES', ['stricmp=strcasecmp','strnicmp=strncasecmp','_LINUX','LINUX','_snprintf=snprintf','_vsnprintf=vsnprintf']) + cflags = ['-fvisibility=hidden','-Wno-write-strings'] + conf.env.append_unique('CFLAGS', cflags) + conf.env.append_unique('CXXFLAGS', cflags + ['-Wno-invalid-offsetof', '-fno-rtti', '-fno-exceptions']) + + # strip lib from pattern + if conf.env.DEST_OS in ['linux', 'darwin'] and conf.env.DEST_OS2 not in ['android']: + if conf.env.cshlib_PATTERN.startswith('lib'): + conf.env.cshlib_PATTERN = conf.env.cshlib_PATTERN[3:] + if conf.env.cxxshlib_PATTERN.startswith('lib'): + conf.env.cxxshlib_PATTERN = conf.env.cxxshlib_PATTERN[3:] + + conf.env.append_unique('DEFINES', 'CLIENT_WEAPONS') + + conf.recurse('cl_dll dlls') + +def build(bld): + bld.recurse('cl_dll dlls') + + +