From e188badaf29a1a02307f93864eed6737096bd9a1 Mon Sep 17 00:00:00 2001 From: Adam Moss <moss@lindenlab.com> Date: Tue, 3 Feb 2009 17:56:26 +0000 Subject: [PATCH] QAR-1177 maint-viewer-12 + uploadfees-viewer combo mergeme svn merge -r108355:109316 svn+ssh://svn.lindenlab.com/svn/linden/branches/moss/maint-viewer-12-uploadfees-qa108314 Whew. --- doc/contributions.txt | 59 ++++- indra/cmake/ViewerMiscLibs.cmake | 1 - indra/llcharacter/llanimationstates.cpp | 12 +- indra/llcharacter/llmultigesture.h | 2 + indra/llcommon/llbase32.cpp | 8 +- indra/llcommon/llerrorlegacy.h | 1 + indra/llcommon/llfindlocale.cpp | 6 +- indra/llcommon/llmemory.cpp | 30 ++- indra/llcommon/llpreprocessor.h | 11 +- indra/llcommon/llprocessor.cpp | 37 ++- indra/llcommon/llstring.h | 7 + indra/llcommon/llsys.cpp | 11 + indra/llcommon/lltimer.h | 2 +- indra/llcommon/stdtypes.h | 2 + indra/llimage/llimage.cpp | 2 +- indra/llimage/llimagetga.cpp | 2 +- indra/llinventory/lleconomy.cpp | 12 + indra/llmath/llvolume.cpp | 84 ++++--- indra/llmath/llvolume.h | 2 +- indra/llmessage/llassetstorage.cpp | 3 + indra/llmessage/llinstantmessage.h | 2 +- indra/llrender/llgl.cpp | 29 +-- indra/llrender/llglheaders.h | 210 +++++++++++++++++- indra/llrender/llshadermgr.cpp | 2 +- indra/llui/CMakeLists.txt | 2 + indra/llui/llfloater.cpp | 2 +- indra/llui/llmenugl.cpp | 16 +- indra/llui/llspinctrl.h | 1 + indra/llui/lltexteditor.cpp | 2 + indra/llvfs/lldir.cpp | 7 +- indra/llvfs/lldir.h | 5 + indra/llvfs/lldir_solaris.cpp | 53 +++-- indra/llvfs/lldir_solaris.h | 2 +- indra/llwindow/llwindowmacosx.cpp | 2 +- indra/llwindow/llwindowsdl.cpp | 103 ++++----- indra/llwindow/llwindowwin32.cpp | 2 +- indra/newview/CMakeLists.txt | 27 ++- indra/newview/featuretable_solaris.txt | 6 + .../windows}/install_icon.BMP | Bin .../installers/windows/install_icon.ico | Bin 0 -> 25214 bytes .../installers/windows/installer_template.nsi | 4 +- .../windows}/uninstall_icon.BMP | Bin .../installers/windows/uninstall_icon.ico | Bin 0 -> 25214 bytes indra/newview/linux_tools/client-readme.txt | 6 - indra/newview/llagent.cpp | 22 +- indra/newview/llappviewer.cpp | 28 +-- indra/newview/llappviewerlinux.cpp | 14 +- indra/newview/llassetuploadresponders.cpp | 12 +- indra/newview/llchatbar.cpp | 3 +- indra/newview/lldirpicker.cpp | 7 +- indra/newview/lldirpicker.h | 2 +- indra/newview/llfasttimerview.cpp | 2 +- indra/newview/llfilepicker.cpp | 68 ++++-- indra/newview/llfloateranimpreview.cpp | 20 +- indra/newview/llfloaterchat.cpp | 6 +- indra/newview/llfloaternamedesc.cpp | 14 +- indra/newview/llfloaterproperties.cpp | 4 +- indra/newview/llfloaterreporter.cpp | 5 + indra/newview/llfloatersnapshot.cpp | 28 ++- indra/newview/llfloatertools.cpp | 2 +- indra/newview/llfloatertopobjects.cpp | 2 +- indra/newview/llfloatertos.cpp | 38 ++-- indra/newview/llfloaterworldmap.cpp | 2 +- indra/newview/llinventorymodel.cpp | 7 +- indra/newview/llloginhandler.cpp | 17 +- indra/newview/llmaniptranslate.cpp | 2 +- indra/newview/llmemoryview.cpp | 2 +- indra/newview/llpanelavatar.cpp | 13 +- indra/newview/llpanelgroupgeneral.cpp | 33 ++- indra/newview/llpanellogin.cpp | 23 +- indra/newview/llpanellogin.h | 7 +- indra/newview/llpreviewgesture.cpp | 58 ++--- indra/newview/llpreviewgesture.h | 3 +- indra/newview/llresourcedata.h | 1 + indra/newview/llspatialpartition.cpp | 2 +- indra/newview/llstartup.cpp | 115 +++++----- indra/newview/llstartup.h | 10 +- indra/newview/lltextureview.cpp | 2 +- indra/newview/llviewermedia.cpp | 8 + indra/newview/llviewermenu.cpp | 5 +- indra/newview/llviewermenufile.cpp | 85 ++++--- indra/newview/llviewermenufile.h | 48 ++-- indra/newview/llviewermessage.cpp | 59 +++-- indra/newview/llviewerstats.cpp | 9 +- indra/newview/llvoavatar.cpp | 42 ++-- indra/newview/llvoiceclient.cpp | 2 +- indra/newview/llwlparamset.cpp | 2 +- indra/newview/llworldmap.cpp | 11 + indra/newview/llworldmapview.cpp | 112 +++++++--- indra/newview/llworldmapview.h | 5 +- indra/newview/llxmlrpctransaction.cpp | 2 +- indra/newview/res/bitmap2.bmp | Bin 25118 -> 0 bytes indra/newview/res/loginbackground.bmp | Bin 336054 -> 0 bytes indra/newview/res/resource.h | 8 - indra/newview/res/viewerRes.rc | 95 -------- .../xui/de/floater_preview_gesture.xml | 2 - .../xui/fr/floater_preview_gesture.xml | 2 - .../xui/ja/floater_preview_gesture.xml | 2 - indra/newview/viewer_manifest.py | 26 ++- .../win_crash_logger/llcrashloggerwindows.cpp | 4 +- install.xml | 67 ++---- 101 files changed, 1214 insertions(+), 733 deletions(-) rename indra/newview/{res => installers/windows}/install_icon.BMP (100%) create mode 100644 indra/newview/installers/windows/install_icon.ico rename indra/newview/{res => installers/windows}/uninstall_icon.BMP (100%) create mode 100644 indra/newview/installers/windows/uninstall_icon.ico delete mode 100644 indra/newview/res/bitmap2.bmp delete mode 100644 indra/newview/res/loginbackground.bmp diff --git a/doc/contributions.txt b/doc/contributions.txt index fb3f7ea466c..2b0d3abd9e0 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -29,6 +29,9 @@ Aimee Trescothick VWR-9255 Alejandro Rosenthal VWR-1184 +Aleric Inglewood + VWR-10759 + VWR-10837 Alissa Sabre VWR-81 VWR-83 @@ -50,23 +53,25 @@ Alissa Sabre VWR-1351 VWR-1353 VWR-1410 + VWR-1843 VWR-2116 VWR-2826 VWR-3290 + VWR-3410 VWR-3857 VWR-4010 - VWR-3410 + VWR-5575 + VWR-5929 + VWR-6384 + VWR-6385 VWR-6386 - VWR-6384 - VWR-6385 - VWR-5929 - VWR-6430 - VWR-1843 - VWR-6668 - VWR-7153 - VWR-7168 - VWR-7087 - VWR-7086 + VWR-6430 + VWR-6858 + VWR-6668 + VWR-7086 + VWR-7087 + VWR-7153 + VWR-7168 VWR-9190 VWR-10728 Angus Boyd @@ -193,7 +198,6 @@ Hiro Sommambulist VWR-97 VWR-100 VWR-105 - VWR-108 VWR-118 VWR-132 VWR-136 @@ -219,9 +223,13 @@ Kage Pixel VWR-11 Kerutsen Sellery VWR-1350 +Khyota Wulluf + VWR-9256 Kunnis Basiat VWR-82 VWR-102 +Lockhart Cordoso + VWR-108 maciek marksman CT-86 march Korda @@ -235,11 +243,13 @@ Matthew Dowd McCabe Maxsted VWR-1318 VWR-4065 + VWR-4826 VWR-7827 VWR-7877 VWR-7893 VWR-8080 VWR-8689 + VWR-9007 Michelle2 Zenovka VWR-2652 VWR-2662 @@ -254,6 +264,7 @@ Michelle2 Zenovka VWR-7831 VWR-8889 VWR-8310 + VWR-9499 Mm Alder VWR-3777 VWR-4794 @@ -351,6 +362,8 @@ Peekay Semyorka VWR-19 VWR-49 VWR-79 +Peter Lameth + VWR-7331 princess niven VWR-5733 CT-85 @@ -378,6 +391,7 @@ SignpostMarv Martin VWR-155 VWR-218 VWR-373 + VWR-8357 Simon Nolan VWR-409 SpacedOut Frye @@ -436,15 +450,36 @@ Whoops Babii VWR-631 VWR-1640 VWR-3340 + VWR-4800 + VWR-4802 + VWR-4804 + VWR-4805 + VWR-4806 + VWR-4808 + VWR-4809 + VWR-4811 + VWR-4815 + VWR-4816 + VWR-4818 VWR-5659 + VWR-8291 + VWR-8292 + VWR-8293 + VWR-8294 + VWR-8295 + VWR-8296 + VWR-8297 + VWR-8298 Wilton Lundquist VWR-7682 Zarkonnen Decosta VWR-253 Zi Ree + VWR-423 VWR-671 VWR-682 VWR-684 + VWR-9127 VWR-1140 Zipherius Turas VWR-76 diff --git a/indra/cmake/ViewerMiscLibs.cmake b/indra/cmake/ViewerMiscLibs.cmake index 68ee8817fd1..2a8abdac23a 100644 --- a/indra/cmake/ViewerMiscLibs.cmake +++ b/indra/cmake/ViewerMiscLibs.cmake @@ -2,7 +2,6 @@ include(Prebuilt) if (NOT STANDALONE) - use_prebuilt_binary(libstdc++) use_prebuilt_binary(libuuid) use_prebuilt_binary(vivox) use_prebuilt_binary(fontconfig) diff --git a/indra/llcharacter/llanimationstates.cpp b/indra/llcharacter/llanimationstates.cpp index d62595cf091..365fb673f37 100644 --- a/indra/llcharacter/llanimationstates.cpp +++ b/indra/llcharacter/llanimationstates.cpp @@ -40,19 +40,19 @@ #include "llstring.h" LLUUID AGENT_WALK_ANIMS[] = {ANIM_AGENT_WALK, ANIM_AGENT_RUN, ANIM_AGENT_CROUCHWALK, ANIM_AGENT_TURNLEFT, ANIM_AGENT_TURNRIGHT}; -S32 NUM_AGENT_WALK_ANIMS = sizeof(AGENT_WALK_ANIMS) / sizeof(LLUUID); +S32 NUM_AGENT_WALK_ANIMS = LL_ARRAY_SIZE(AGENT_WALK_ANIMS); LLUUID AGENT_GUN_HOLD_ANIMS[] = {ANIM_AGENT_HOLD_RIFLE_R, ANIM_AGENT_HOLD_HANDGUN_R, ANIM_AGENT_HOLD_BAZOOKA_R, ANIM_AGENT_HOLD_BOW_L}; -S32 NUM_AGENT_GUN_HOLD_ANIMS = sizeof(AGENT_GUN_HOLD_ANIMS) / sizeof(LLUUID); +S32 NUM_AGENT_GUN_HOLD_ANIMS = LL_ARRAY_SIZE(AGENT_GUN_HOLD_ANIMS); LLUUID AGENT_GUN_AIM_ANIMS[] = {ANIM_AGENT_AIM_RIFLE_R, ANIM_AGENT_AIM_HANDGUN_R, ANIM_AGENT_AIM_BAZOOKA_R, ANIM_AGENT_AIM_BOW_L}; -S32 NUM_AGENT_GUN_AIM_ANIMS = sizeof(AGENT_GUN_AIM_ANIMS) / sizeof(LLUUID); +S32 NUM_AGENT_GUN_AIM_ANIMS = LL_ARRAY_SIZE(AGENT_GUN_AIM_ANIMS); LLUUID AGENT_NO_ROTATE_ANIMS[] = {ANIM_AGENT_SIT_GROUND, ANIM_AGENT_SIT_GROUND_CONSTRAINED, ANIM_AGENT_STANDUP}; -S32 NUM_AGENT_NO_ROTATE_ANIMS = sizeof(AGENT_NO_ROTATE_ANIMS) / sizeof(LLUUID); +S32 NUM_AGENT_NO_ROTATE_ANIMS = LL_ARRAY_SIZE(AGENT_NO_ROTATE_ANIMS); LLUUID AGENT_STAND_ANIMS[] = {ANIM_AGENT_STAND, ANIM_AGENT_STAND_1, ANIM_AGENT_STAND_2, ANIM_AGENT_STAND_3, ANIM_AGENT_STAND_4}; -S32 NUM_AGENT_STAND_ANIMS = sizeof(AGENT_STAND_ANIMS) / sizeof(LLUUID); +S32 NUM_AGENT_STAND_ANIMS = LL_ARRAY_SIZE(AGENT_STAND_ANIMS); LLAnimationLibrary gAnimLibrary; @@ -334,7 +334,7 @@ const LLAnimStateEntry gUserAnimStates[] = { LLAnimStateEntry("yes_head", ANIM_AGENT_YES), }; -const S32 gUserAnimStatesCount = sizeof(gUserAnimStates) / sizeof(gUserAnimStates[0]); +const S32 gUserAnimStatesCount = LL_ARRAY_SIZE(gUserAnimStates); diff --git a/indra/llcharacter/llmultigesture.h b/indra/llcharacter/llmultigesture.h index 39f2696f55d..eb15f600ca9 100644 --- a/indra/llcharacter/llmultigesture.h +++ b/indra/llcharacter/llmultigesture.h @@ -108,6 +108,8 @@ class LLMultiGesture }; +// Order must match the library_list in floater_preview_gesture.xml! + enum EStepType { STEP_ANIMATION = 0, diff --git a/indra/llcommon/llbase32.cpp b/indra/llcommon/llbase32.cpp index c8b6ffff38f..5e6ced9ce1e 100644 --- a/indra/llcommon/llbase32.cpp +++ b/indra/llcommon/llbase32.cpp @@ -146,8 +146,6 @@ base32_encode(char *dst, size_t size, const void *data, size_t len) /* *TODO: Implement base32 encode. -#define ARRAY_LEN(a) (sizeof (a) / sizeof((a)[0])) - static inline int ascii_toupper(int c) { @@ -173,7 +171,7 @@ base32_decode(char *dst, size_t size, const void *data, size_t len) unsigned max_pad = 3; if (0 == base32_map[0]) { - for (i = 0; i < ARRAY_LEN(base32_map); i++) { + for (i = 0; i < LL_ARRAY_SIZE(base32_map); i++) { const char *x; x = memchr(base32_alphabet, ascii_toupper(i), sizeof base32_alphabet); @@ -197,7 +195,7 @@ base32_decode(char *dst, size_t size, const void *data, size_t len) } } - j = i % ARRAY_LEN(s); + j = i % LL_ARRAY_SIZE(s); s[j] = c; if (7 == j) { @@ -209,7 +207,7 @@ base32_decode(char *dst, size_t size, const void *data, size_t len) b[3] = ((s[4] & 1) << 7) | ((s[5] & 0x1f) << 2) | ((s[6] >> 3) & 0x03); b[4] = ((s[6] & 0x07) << 5) | (s[7] & 0x1f); - for (j = 0; j < ARRAY_LEN(b); j++) { + for (j = 0; j < LL_ARRAY_SIZE(b); j++) { if (q != end) *q = b[j]; q++; diff --git a/indra/llcommon/llerrorlegacy.h b/indra/llcommon/llerrorlegacy.h index 8b8af4cc9da..143fe201807 100644 --- a/indra/llcommon/llerrorlegacy.h +++ b/indra/llcommon/llerrorlegacy.h @@ -53,6 +53,7 @@ const int LL_ERR_FILE_NOT_FOUND = -43; const int LL_ERR_FILE_EMPTY = -44; const int LL_ERR_TCP_TIMEOUT = -23016; const int LL_ERR_CIRCUIT_GONE = -23017; +const int LL_ERR_PRICE_MISMATCH = -23018; diff --git a/indra/llcommon/llfindlocale.cpp b/indra/llcommon/llfindlocale.cpp index a511d3ffede..505f5c540b5 100644 --- a/indra/llcommon/llfindlocale.cpp +++ b/indra/llcommon/llfindlocale.cpp @@ -417,10 +417,8 @@ static const IDToCode primary_to_code[] = { /*{LANG_WALON, "wa"},*/ {LANG_CHINESE, "zh"}, }; -static int num_primary_to_code = - sizeof(primary_to_code) / sizeof(*primary_to_code); -static int num_both_to_code = - sizeof(both_to_code) / sizeof(*both_to_code); +static int num_primary_to_code = LL_ARRAY_SIZE(primary_to_code); +static int num_both_to_code = LL_ARRAY_SIZE(both_to_code); static const int lcid_to_fl(LCID lcid, diff --git a/indra/llcommon/llmemory.cpp b/indra/llcommon/llmemory.cpp index 29f916bc464..a6de3d2d698 100644 --- a/indra/llcommon/llmemory.cpp +++ b/indra/llcommon/llmemory.cpp @@ -39,7 +39,7 @@ # include <sys/types.h> # include <mach/task.h> # include <mach/mach_init.h> -#elif defined(LL_LINUX) +#elif LL_LINUX || LL_SOLARIS # include <unistd.h> #endif @@ -389,6 +389,34 @@ U64 getCurrentRSS() return rss; } +#elif LL_SOLARIS +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#define _STRUCTURED_PROC 1 +#include <sys/procfs.h> + +U64 getCurrentRSS() +{ + char path [LL_MAX_PATH]; /* Flawfinder: ignore */ + + sprintf(path, "/proc/%d/psinfo", (int)getpid()); + int proc_fd = -1; + if((proc_fd = open(path, O_RDONLY)) == -1){ + llwarns << "LLmemory::getCurrentRSS() unable to open " << path << ". Returning 0 RSS!" << llendl; + return 0; + } + psinfo_t proc_psinfo; + if(read(proc_fd, &proc_psinfo, sizeof(psinfo_t)) != sizeof(psinfo_t)){ + llwarns << "LLmemory::getCurrentRSS() Unable to read from " << path << ". Returning 0 RSS!" << llendl; + close(proc_fd); + return 0; + } + + close(proc_fd); + + return((U64)proc_psinfo.pr_rssize * 1024); +} #else U64 getCurrentRSS() diff --git a/indra/llcommon/llpreprocessor.h b/indra/llcommon/llpreprocessor.h index 1ac2c9422b8..2e4fd4787a1 100644 --- a/indra/llcommon/llpreprocessor.h +++ b/indra/llcommon/llpreprocessor.h @@ -40,7 +40,16 @@ #include <endian.h> #endif // LL_LINUX -#if (defined(LL_WINDOWS) || (defined(LL_LINUX) && (__BYTE_ORDER == __LITTLE_ENDIAN)) || (defined(LL_DARWIN) && defined(__LITTLE_ENDIAN__))) +#if LL_SOLARIS +# ifdef __sparc // Since we're talking Solaris 10 and up, only 64 bit is supported. +# define LL_BIG_ENDIAN 1 +# define LL_SOLARIS_ALIGNED_CPU 1 // used to designate issues where SPARC alignment is addressed +# define LL_SOLARIS_NON_MESA_GL 1 // The SPARC GL does not provide a MESA-based GL API +# endif +# include <sys/isa_defs.h> // ensure we know which end is up +#endif // LL_SOLARIS + +#if (defined(LL_WINDOWS) || (defined(LL_LINUX) && (__BYTE_ORDER == __LITTLE_ENDIAN)) || (defined(LL_DARWIN) && defined(__LITTLE_ENDIAN__)) || (defined(LL_SOLARIS) && defined(__i386))) #define LL_LITTLE_ENDIAN 1 #else #define LL_BIG_ENDIAN 1 diff --git a/indra/llcommon/llprocessor.cpp b/indra/llcommon/llprocessor.cpp index c6f9d3c7585..469e544b16f 100644 --- a/indra/llcommon/llprocessor.cpp +++ b/indra/llcommon/llprocessor.cpp @@ -279,7 +279,7 @@ bool CProcessor::AnalyzeIntelProcessor() // Only override the brand if we have it in the lookup table. We should // already have a string here from GetCPUInfo(). JC - if (CPUInfo.uiBrandID < (sizeof(INTEL_BRAND)/sizeof(INTEL_BRAND[0]))) + if ( CPUInfo.uiBrandID < LL_ARRAY_SIZE(INTEL_BRAND) ) { strcpy(CPUInfo.strBrandID, INTEL_BRAND[CPUInfo.uiBrandID]); @@ -1665,6 +1665,10 @@ const ProcessorInfo *CProcessor::GetCPUInfo() #elif LL_SOLARIS #include <kstat.h> +#if defined(__i386) +#include <sys/auxv.h> +#endif + // ====================== // Class constructor: ///////////////////////// @@ -1778,6 +1782,37 @@ const ProcessorInfo *CProcessor::GetCPUInfo() // DEBUG llinfo << "The system has " << ncpus << " CPUs with a clock rate of " << uqwFrequency << "MHz." << llendl; +#if defined (__i386) // we really don't care about the CPU extensions on SPARC but on x86... + + // Now get cpu extensions + + uint_t ui; + + (void) getisax(&ui, 1); + + if(ui & AV_386_FPU) + CPUInfo._Ext.FPU_FloatingPointUnit = true; + if(ui & AV_386_CX8) + CPUInfo._Ext.CX8_COMPXCHG8B_Instruction = true; + if(ui & AV_386_MMX) + CPUInfo._Ext.MMX_MultimediaExtensions = true; + if(ui & AV_386_AMD_MMX) + CPUInfo._Ext.MMX_MultimediaExtensions = true; + if(ui & AV_386_FXSR) + CPUInfo._Ext.FXSR_FastStreamingSIMD_ExtensionsSaveRestore = true; + if(ui & AV_386_SSE) + CPUInfo._Ext.SSE_StreamingSIMD_Extensions = true; + if(ui & AV_386_SSE2) + CPUInfo._Ext.SSE2_StreamingSIMD2_Extensions = true; +/* Left these here since they may get used later + if(ui & AV_386_SSE3) + CPUInfo._Ext.... = true; + if(ui & AV_386_AMD_3DNow) + CPUInfo._Ext.... = true; + if(ui & AV_386_AMD_3DNowx) + CPUInfo._Ext.... = true; +*/ +#endif return (&CPUInfo); } diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index 8f6626b501d..d728221b54c 100644 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -38,6 +38,13 @@ #include <wchar.h> #endif +#if LL_SOLARIS +// stricmp and strnicmp do not exist on Solaris: +#include <string.h> +#define stricmp strcasecmp +#define strnicmp strncasecmp +#endif + const char LL_UNKNOWN_CHAR = '?'; #if LL_DARWIN || LL_LINUX || LL_SOLARIS diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index cf281e92e77..f68d86ff7cd 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -59,6 +59,17 @@ # include <sys/sysinfo.h> const char MEMINFO_FILE[] = "/proc/meminfo"; const char CPUINFO_FILE[] = "/proc/cpuinfo"; +#elif LL_SOLARIS +# include <stdio.h> +# include <unistd.h> +# include <sys/utsname.h> +# define _STRUCTURED_PROC 1 +# include <sys/procfs.h> +# include <sys/types.h> +# include <sys/stat.h> +# include <fcntl.h> +# include <errno.h> +extern int errno; #endif diff --git a/indra/llcommon/lltimer.h b/indra/llcommon/lltimer.h index 452df2ee580..e2cf1c7689b 100644 --- a/indra/llcommon/lltimer.h +++ b/indra/llcommon/lltimer.h @@ -33,7 +33,7 @@ #ifndef LL_TIMER_H #define LL_TIMER_H -#if LL_LINUX || LL_DARWIN +#if LL_LINUX || LL_DARWIN || LL_SOLARIS #include <sys/time.h> #endif #include <limits.h> diff --git a/indra/llcommon/stdtypes.h b/indra/llcommon/stdtypes.h index 62fe7b98ff0..6b25b2d355d 100644 --- a/indra/llcommon/stdtypes.h +++ b/indra/llcommon/stdtypes.h @@ -105,6 +105,8 @@ typedef U32 TPACKETID; typedef U8 LLPCode; +#define LL_ARRAY_SIZE( _kArray ) ( sizeof( (_kArray) ) / sizeof( _kArray[0] ) ) + #if LL_LINUX && __GNUC__ <= 2 typedef int intptr_t; #endif diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index 87d465fa813..bfa129ea1dc 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -1137,7 +1137,7 @@ file_extensions[] = { "dxt", IMG_CODEC_DXT }, { "png", IMG_CODEC_PNG } }; -#define NUM_FILE_EXTENSIONS sizeof(file_extensions)/sizeof(file_extensions[0]) +#define NUM_FILE_EXTENSIONS LL_ARRAY_SIZE(file_extensions) static std::string find_file(std::string &name, S8 *codec) { diff --git a/indra/llimage/llimagetga.cpp b/indra/llimage/llimagetga.cpp index 6d03ccbf25b..a6721bfa0f9 100644 --- a/indra/llimage/llimagetga.cpp +++ b/indra/llimage/llimagetga.cpp @@ -105,7 +105,7 @@ LLImageTGA::LLImageTGA(const std::string& file_name) LLImageTGA::~LLImageTGA() { - delete mColorMap; + delete [] mColorMap; } BOOL LLImageTGA::updateData() diff --git a/indra/llinventory/lleconomy.cpp b/indra/llinventory/lleconomy.cpp index ad37c0c27a1..4366d1eb2a0 100644 --- a/indra/llinventory/lleconomy.cpp +++ b/indra/llinventory/lleconomy.cpp @@ -74,6 +74,18 @@ void LLGlobalEconomy::processEconomyData(LLMessageSystem *msg, LLGlobalEconomy* econ_data->setPricePublicObjectDelete(i); msg->getS32Fast(_PREHASH_Info, _PREHASH_PriceUpload, i); econ_data->setPriceUpload(i); +#if LL_LINUX + // We can optionally fake the received upload price for testing. + // Note that the server is within its rights to not obey our fake + // price. :) + const char* fakeprice_str = getenv("LL_FAKE_UPLOAD_PRICE"); + if (fakeprice_str) + { + S32 fakeprice = (S32)atoi(fakeprice_str); + llwarns << "LL_FAKE_UPLOAD_PRICE: Faking upload price as L$" << fakeprice << llendl; + econ_data->setPriceUpload(fakeprice); + } +#endif msg->getS32Fast(_PREHASH_Info, _PREHASH_PriceRentLight, i); econ_data->setPriceRentLight(i); msg->getS32Fast(_PREHASH_Info, _PREHASH_TeleportMinPrice, i); diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index 7d01ba059c8..1250f539f52 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -1973,34 +1973,29 @@ inline LLVector3 sculpt_xy_to_vector(U32 x, U32 y, U16 sculpt_width, U16 sculpt_ } -F32 LLVolume::sculptGetSurfaceArea(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data) +F32 LLVolume::sculptGetSurfaceArea() { // test to see if image has enough variation to create non-degenerate geometry + F32 area = 0; + S32 sizeS = mPathp->mPath.size(); S32 sizeT = mProfilep->mProfile.size(); - - F32 area = 0; - - if ((sculpt_width != 0) && - (sculpt_height != 0) && - (sculpt_components != 0) && - (sculpt_data != NULL)) + + for (S32 s = 0; s < sizeS-1; s++) { - for (S32 s = 0; s < sizeS - 1; s++) + for (S32 t = 0; t < sizeT-1; t++) { - for (S32 t = 0; t < sizeT - 1; t++) - { - // convert image data to vectors - LLVector3 p1 = sculpt_st_to_vector(s, t, sizeS, sizeT, sculpt_width, sculpt_height, sculpt_components, sculpt_data); - LLVector3 p2 = sculpt_st_to_vector(s+1, t, sizeS, sizeT, sculpt_width, sculpt_height, sculpt_components, sculpt_data); - LLVector3 p3 = sculpt_st_to_vector(s, t+1, sizeS, sizeT, sculpt_width, sculpt_height, sculpt_components, sculpt_data); - - // compute the area of the parallelogram by taking the length of the cross product: - // (parallegram is an approximation of two triangles) - LLVector3 cross = (p1 - p2) % (p1 - p3); - area += cross.magVec(); - } + // get four corners of quad + LLVector3 p1 = mMesh[(s )*sizeT + (t )].mPos; + LLVector3 p2 = mMesh[(s+1)*sizeT + (t )].mPos; + LLVector3 p3 = mMesh[(s )*sizeT + (t+1)].mPos; + LLVector3 p4 = mMesh[(s+1)*sizeT + (t+1)].mPos; + + // compute the area of the quad by taking the length of the cross product of the two triangles + LLVector3 cross1 = (p1 - p2) % (p1 - p3); + LLVector3 cross2 = (p4 - p2) % (p4 - p3); + area += (cross1.magVec() + cross2.magVec()) / 2.0; } } @@ -2164,7 +2159,21 @@ S32 sculpt_sides(F32 detail) // determine the number of vertices in both s and t direction for this sculpt void sculpt_calc_mesh_resolution(U16 width, U16 height, U8 type, F32 detail, S32& s, S32& t) { - S32 vertices = sculpt_sides(detail); + // this code has the following properties: + // 1) the aspect ratio of the mesh is as close as possible to the ratio of the map + // while still using all available verts + // 2) the mesh cannot have more verts than is allowed by LOD + // 3) the mesh cannot have more verts than is allowed by the map + + S32 max_vertices_lod = (S32)pow((double)sculpt_sides(detail), 2.0); + S32 max_vertices_map = width * height / 4; + + S32 vertices; + if (max_vertices_map > 0) + vertices = llmin(max_vertices_lod, max_vertices_map); + else + vertices = max_vertices_lod; + F32 ratio; if ((width == 0) || (height == 0)) @@ -2173,13 +2182,13 @@ void sculpt_calc_mesh_resolution(U16 width, U16 height, U8 type, F32 detail, S32 ratio = (F32) width / (F32) height; - s = (S32)(vertices / fsqrtf(ratio)); + s = (S32)fsqrtf(((F32)vertices / ratio)); - s = llmax(s, 3); // no degenerate sizes, please - t = vertices * vertices / s; + s = llmax(s, 4); // no degenerate sizes, please + t = vertices / s; - t = llmax(t, 3); // no degenerate sizes, please - s = vertices * vertices / t; + t = llmax(t, 4); // no degenerate sizes, please + s = vertices / t; } // sculpt replaces generate() for sculpted surfaces @@ -2216,20 +2225,25 @@ void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, sNumMeshPoints -= mMesh.size(); mMesh.resize(sizeS * sizeT); sNumMeshPoints += mMesh.size(); - - if (!data_is_empty && sculptGetSurfaceArea(sculpt_width, sculpt_height, sculpt_components, sculpt_data) < SCULPT_MIN_AREA) - data_is_empty = TRUE; //generate vertex positions - if (data_is_empty) // if empty, make a placeholder mesh - { - sculptGeneratePlaceholder(); - } - else + if (!data_is_empty) { sculptGenerateMapVertices(sculpt_width, sculpt_height, sculpt_components, sculpt_data, sculpt_type); + + if (sculptGetSurfaceArea() < SCULPT_MIN_AREA) + { + data_is_empty = TRUE; + } } + if (data_is_empty) + { + sculptGeneratePlaceholder(); + } + + + for (S32 i = 0; i < (S32)mProfilep->mFaces.size(); i++) { mFaceMask |= mProfilep->mFaces[i].mFaceID; diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h index ab30d78333d..e55fe52c91e 100644 --- a/indra/llmath/llvolume.h +++ b/indra/llmath/llvolume.h @@ -943,8 +943,8 @@ class LLVolume : public LLRefCount void sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, S32 sculpt_level); private: - F32 sculptGetSurfaceArea(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data); void sculptGenerateMapVertices(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, U8 sculpt_type); + F32 sculptGetSurfaceArea(); void sculptGeneratePlaceholder(); void sculptCalcMeshResolution(U16 width, U16 height, U8 type, S32& s, S32& t); diff --git a/indra/llmessage/llassetstorage.cpp b/indra/llmessage/llassetstorage.cpp index 4d10f1e3dad..2966b602d75 100644 --- a/indra/llmessage/llassetstorage.cpp +++ b/indra/llmessage/llassetstorage.cpp @@ -1210,6 +1210,9 @@ const char* LLAssetStorage::getErrorString(S32 status) case LL_ERR_CIRCUIT_GONE: return "Circuit gone"; + case LL_ERR_PRICE_MISMATCH: + return "Viewer and server do not agree on price"; + default: return "Unknown status"; } diff --git a/indra/llmessage/llinstantmessage.h b/indra/llmessage/llinstantmessage.h index 774349036d3..96a2cf9cabe 100644 --- a/indra/llmessage/llinstantmessage.h +++ b/indra/llmessage/llinstantmessage.h @@ -159,7 +159,7 @@ enum EInstantMessage IM_FRIENDSHIP_OFFERED = 38, IM_FRIENDSHIP_ACCEPTED = 39, - IM_FRIENDSHIP_DECLINED = 40, + IM_FRIENDSHIP_DECLINED_DEPRECATED = 40, IM_TYPING_START = 41, IM_TYPING_STOP = 42, diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 01df71c570f..74313974c96 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -65,7 +65,7 @@ LLMatrix4 gGLObliqueProjectionInverse; LLGLNamePool::pool_list_t LLGLNamePool::sInstances; -#if (LL_WINDOWS || LL_LINUX) && !LL_MESA_HEADLESS +#if (LL_WINDOWS || LL_LINUX || LL_SOLARIS) && !LL_MESA_HEADLESS // ATI prototypes // vertex blending prototypes PFNGLWEIGHTPOINTERARBPROC glWeightPointerARB = NULL; @@ -175,7 +175,7 @@ PFNGLGETUNIFORMIVARBPROC glGetUniformivARB = NULL; PFNGLGETSHADERSOURCEARBPROC glGetShaderSourceARB = NULL; // vertex shader prototypes -#if LL_LINUX +#if LL_LINUX || LL_SOLARIS PFNGLVERTEXATTRIB1DARBPROC glVertexAttrib1dARB = NULL; PFNGLVERTEXATTRIB1DVARBPROC glVertexAttrib1dvARB = NULL; PFNGLVERTEXATTRIB1FARBPROC glVertexAttrib1fARB = NULL; @@ -194,7 +194,7 @@ PFNGLVERTEXATTRIB3FARBPROC glVertexAttrib3fARB = NULL; PFNGLVERTEXATTRIB3FVARBPROC glVertexAttrib3fvARB = NULL; PFNGLVERTEXATTRIB3SARBPROC glVertexAttrib3sARB = NULL; PFNGLVERTEXATTRIB3SVARBPROC glVertexAttrib3svARB = NULL; -#endif // LL_LINUX +#endif // LL_LINUX || LL_SOLARIS PFNGLVERTEXATTRIB4NBVARBPROC glVertexAttrib4nbvARB = NULL; PFNGLVERTEXATTRIB4NIVARBPROC glVertexAttrib4nivARB = NULL; PFNGLVERTEXATTRIB4NSVARBPROC glVertexAttrib4nsvARB = NULL; @@ -202,7 +202,7 @@ PFNGLVERTEXATTRIB4NUBARBPROC glVertexAttrib4nubARB = NULL; PFNGLVERTEXATTRIB4NUBVARBPROC glVertexAttrib4nubvARB = NULL; PFNGLVERTEXATTRIB4NUIVARBPROC glVertexAttrib4nuivARB = NULL; PFNGLVERTEXATTRIB4NUSVARBPROC glVertexAttrib4nusvARB = NULL; -#if LL_LINUX +#if LL_LINUX || LL_SOLARIS PFNGLVERTEXATTRIB4BVARBPROC glVertexAttrib4bvARB = NULL; PFNGLVERTEXATTRIB4DARBPROC glVertexAttrib4dARB = NULL; PFNGLVERTEXATTRIB4DVARBPROC glVertexAttrib4dvARB = NULL; @@ -240,7 +240,7 @@ PFNGLGETVERTEXATTRIBFVARBPROC glGetVertexAttribfvARB = NULL; PFNGLGETVERTEXATTRIBIVARBPROC glGetVertexAttribivARB = NULL; PFNGLGETVERTEXATTRIBPOINTERVARBPROC glGetVertexAttribPointervARB = NULL; PFNGLISPROGRAMARBPROC glIsProgramARB = NULL; -#endif // LL_LINUX +#endif // LL_LINUX || LL_SOLARIS PFNGLBINDATTRIBLOCATIONARBPROC glBindAttribLocationARB = NULL; PFNGLGETACTIVEATTRIBARBPROC glGetActiveAttribARB = NULL; PFNGLGETATTRIBLOCATIONARBPROC glGetAttribLocationARB = NULL; @@ -249,10 +249,6 @@ PFNGLGETATTRIBLOCATIONARBPROC glGetAttribLocationARB = NULL; PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = NULL; #endif -#if LL_LINUX -PFNGLCOLORTABLEEXTPROC glColorTableEXT = NULL; -#endif // LL_LINUX - #endif LLGLManager gGLManager; @@ -490,7 +486,7 @@ std::string LLGLManager::getGLInfoString() info_str += std::string("GL_RENDERER ") + ll_safe_string((const char *)glGetString(GL_RENDERER)) + std::string("\n"); info_str += std::string("GL_VERSION ") + ll_safe_string((const char *)glGetString(GL_VERSION)) + std::string("\n"); -#if !LL_MESA_HEADLESS +#if !LL_MESA_HEADLESS all_exts = (const char *)gGLHExts.mSysExts; LLStringUtil::replaceChar(all_exts, ' ', '\n'); info_str += std::string("GL_EXTENSIONS:\n") + all_exts + std::string("\n"); @@ -597,7 +593,8 @@ void LLGLManager::initExtensions() mHasFragmentShader = ExtensionExists("GL_ARB_fragment_shader", gGLHExts.mSysExts) && ExtensionExists("GL_ARB_shading_language_100", gGLHExts.mSysExts); #endif -#if LL_LINUX +#if LL_LINUX || LL_SOLARIS + llinfos << "initExtensions() checking shell variables to adjust features..." << llendl; // Our extension support for the Linux Client is very young with some // potential driver gotchas, so offer a semi-secret way to turn it off. if (getenv("LL_GL_NOEXT")) /* Flawfinder: ignore */ @@ -657,7 +654,7 @@ void LLGLManager::initExtensions() if (strchr(blacklist,'p')) mHasPointParameters = FALSE;//S if (strchr(blacklist,'q')) mHasFramebufferObject = FALSE;//S } -#endif // LL_LINUX +#endif // LL_LINUX || LL_SOLARIS if (!mHasMultitexture) { @@ -720,7 +717,7 @@ void LLGLManager::initExtensions() glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, (GLint*) &mGLMaxVertexRange); glGetIntegerv(GL_MAX_ELEMENTS_INDICES, (GLint*) &mGLMaxIndexRange); -#if (LL_WINDOWS || LL_LINUX) && !LL_MESA_HEADLESS +#if (LL_WINDOWS || LL_LINUX || LL_SOLARIS) && !LL_MESA_HEADLESS LL_DEBUGS("RenderInit") << "GL Probe: Getting symbols" << LL_ENDL; if (mHasVertexBufferObject) { @@ -745,6 +742,7 @@ void LLGLManager::initExtensions() } if (mHasFramebufferObject) { + llinfos << "initExtensions() FramebufferObject-related procs..." << llendl; glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glIsRenderbufferEXT"); glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glBindRenderbufferEXT"); glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteRenderbuffersEXT"); @@ -763,7 +761,7 @@ void LLGLManager::initExtensions() glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGetFramebufferAttachmentParameterivEXT"); glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGenerateMipmapEXT"); } -#if !LL_LINUX +#if !LL_LINUX && !LL_SOLARIS // This is expected to be a static symbol on Linux GL implementations glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)GLH_EXT_GET_PROC_ADDRESS("glDrawRangeElements"); if (!glDrawRangeElements) @@ -775,6 +773,7 @@ void LLGLManager::initExtensions() if (mHasOcclusionQuery) { + llinfos << "initExtensions() OcclusionQuery-related procs..." << llendl; glGenQueriesARB = (PFNGLGENQUERIESARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGenQueriesARB"); glDeleteQueriesARB = (PFNGLDELETEQUERIESARBPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteQueriesARB"); glIsQueryARB = (PFNGLISQUERYARBPROC)GLH_EXT_GET_PROC_ADDRESS("glIsQueryARB"); @@ -786,6 +785,7 @@ void LLGLManager::initExtensions() } if (mHasPointParameters) { + llinfos << "initExtensions() PointParameters-related procs..." << llendl; glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterfARB"); glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterfvARB"); } @@ -833,6 +833,7 @@ void LLGLManager::initExtensions() } if (mHasVertexShader) { + llinfos << "initExtensions() VertexShader-related procs..." << llendl; glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetAttribLocationARB"); glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC) GLH_EXT_GET_PROC_ADDRESS("glBindAttribLocationARB"); glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetActiveAttribARB"); diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h index 9c72c179f74..e9a9ad1a772 100644 --- a/indra/llrender/llglheaders.h +++ b/indra/llrender/llglheaders.h @@ -33,11 +33,215 @@ #ifndef LL_LLGLHEADERS_H #define LL_LLGLHEADERS_H -#if LL_MESA +#if LL_SOLARIS +# if defined(__sparc) +# define I_NEED_OS2_H // avoiding BOOL conflicts +# endif +# include "GL/gl.h" +# if defined(__sparc) +# undef I_NEED_OS2_H +# ifdef BOOL +# undef BOOL // now get rid of Xmd.h crap +# endif +# endif +# include "GL/glx.h" +# define GL_GLEXT_PROTOTYPES 1 +# include "GL/glext.h" +# include "GL/glu.h" +# include "GL/glx.h" +# define GLX_GLXEXT_PROTOTYPES 1 +# include "GL/glxext.h" +//# define GLH_EXT_GET_PROC_ADDRESS(p) glXGetProcAddressARB((const GLubyte*)(p)) +# define GLH_EXT_GET_PROC_ADDRESS(p) glXGetProcAddress((const GLubyte*)(p)) +// the X headers define 'Status'. Undefine to avoid confusion. +#undef Status + +// The __APPLE__ kludge is to make glh_extensions.h not symbol-clash horribly +// This header is distributed with SL. You'll find it in linden/libraries/include/GL/ +# define __APPLE__ +# include "GL/glh_extensions.h" +# undef __APPLE__ + + +// GL_ARB_vertex_buffer_object +extern PFNGLBINDBUFFERARBPROC glBindBufferARB; +extern PFNGLDELETEBUFFERSARBPROC glDeleteBuffersARB; +extern PFNGLGENBUFFERSARBPROC glGenBuffersARB; +extern PFNGLISBUFFERARBPROC glIsBufferARB; +extern PFNGLBUFFERDATAARBPROC glBufferDataARB; +extern PFNGLBUFFERSUBDATAARBPROC glBufferSubDataARB; +extern PFNGLGETBUFFERSUBDATAARBPROC glGetBufferSubDataARB; +extern PFNGLMAPBUFFERARBPROC glMapBufferARB; +extern PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB; +extern PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameterivARB; +extern PFNGLGETBUFFERPOINTERVARBPROC glGetBufferPointervARB; + +// GL_ATI_vertex_array_object +extern PFNGLNEWOBJECTBUFFERATIPROC glNewObjectBufferATI; +extern PFNGLISOBJECTBUFFERATIPROC glIsObjectBufferATI; +extern PFNGLUPDATEOBJECTBUFFERATIPROC glUpdateObjectBufferATI; +extern PFNGLGETOBJECTBUFFERFVATIPROC glGetObjectBufferfvATI; +extern PFNGLGETOBJECTBUFFERIVATIPROC glGetObjectBufferivATI; +extern PFNGLFREEOBJECTBUFFERATIPROC glFreeObjectBufferATI; +extern PFNGLARRAYOBJECTATIPROC glArrayObjectATI; +extern PFNGLVERTEXATTRIBARRAYOBJECTATIPROC glVertexAttribArrayObjectATI; +extern PFNGLGETARRAYOBJECTFVATIPROC glGetArrayObjectfvATI; +extern PFNGLGETARRAYOBJECTIVATIPROC glGetArrayObjectivATI; +extern PFNGLVARIANTARRAYOBJECTATIPROC glVariantObjectArrayATI; +extern PFNGLGETVARIANTARRAYOBJECTFVATIPROC glGetVariantArrayObjectfvATI; +extern PFNGLGETVARIANTARRAYOBJECTIVATIPROC glGetVariantArrayObjectivATI; + +// GL_ARB_occlusion_query +extern PFNGLGENQUERIESARBPROC glGenQueriesARB; +extern PFNGLDELETEQUERIESARBPROC glDeleteQueriesARB; +extern PFNGLISQUERYARBPROC glIsQueryARB; +extern PFNGLBEGINQUERYARBPROC glBeginQueryARB; +extern PFNGLENDQUERYARBPROC glEndQueryARB; +extern PFNGLGETQUERYIVARBPROC glGetQueryivARB; +extern PFNGLGETQUERYOBJECTIVARBPROC glGetQueryObjectivARB; +extern PFNGLGETQUERYOBJECTUIVARBPROC glGetQueryObjectuivARB; + +// GL_ARB_point_parameters +extern PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB; +extern PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB; + +// GL_ARB_shader_objects +extern PFNGLDELETEOBJECTARBPROC glDeleteObjectARB; +extern PFNGLGETHANDLEARBPROC glGetHandleARB; +extern PFNGLDETACHOBJECTARBPROC glDetachObjectARB; +extern PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB; +extern PFNGLSHADERSOURCEARBPROC glShaderSourceARB; +extern PFNGLCOMPILESHADERARBPROC glCompileShaderARB; +extern PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB; +extern PFNGLATTACHOBJECTARBPROC glAttachObjectARB; +extern PFNGLLINKPROGRAMARBPROC glLinkProgramARB; +extern PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB; +extern PFNGLVALIDATEPROGRAMARBPROC glValidateProgramARB; +extern PFNGLUNIFORM1FARBPROC glUniform1fARB; +extern PFNGLUNIFORM2FARBPROC glUniform2fARB; +extern PFNGLUNIFORM3FARBPROC glUniform3fARB; +extern PFNGLUNIFORM4FARBPROC glUniform4fARB; +extern PFNGLUNIFORM1IARBPROC glUniform1iARB; +extern PFNGLUNIFORM2IARBPROC glUniform2iARB; +extern PFNGLUNIFORM3IARBPROC glUniform3iARB; +extern PFNGLUNIFORM4IARBPROC glUniform4iARB; +extern PFNGLUNIFORM1FVARBPROC glUniform1fvARB; +extern PFNGLUNIFORM2FVARBPROC glUniform2fvARB; +extern PFNGLUNIFORM3FVARBPROC glUniform3fvARB; +extern PFNGLUNIFORM4FVARBPROC glUniform4fvARB; +extern PFNGLUNIFORM1IVARBPROC glUniform1ivARB; +extern PFNGLUNIFORM2IVARBPROC glUniform2ivARB; +extern PFNGLUNIFORM3IVARBPROC glUniform3ivARB; +extern PFNGLUNIFORM4IVARBPROC glUniform4ivARB; +extern PFNGLUNIFORMMATRIX2FVARBPROC glUniformMatrix2fvARB; +extern PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB; +extern PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB; +extern PFNGLGETOBJECTPARAMETERFVARBPROC glGetObjectParameterfvARB; +extern PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB; +extern PFNGLGETINFOLOGARBPROC glGetInfoLogARB; +extern PFNGLGETATTACHEDOBJECTSARBPROC glGetAttachedObjectsARB; +extern PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB; +extern PFNGLGETACTIVEUNIFORMARBPROC glGetActiveUniformARB; +extern PFNGLGETUNIFORMFVARBPROC glGetUniformfvARB; +extern PFNGLGETUNIFORMIVARBPROC glGetUniformivARB; +extern PFNGLGETSHADERSOURCEARBPROC glGetShaderSourceARB; + +// GL_ARB_vertex_shader +extern PFNGLVERTEXATTRIB1DARBPROC glVertexAttrib1dARB; +extern PFNGLVERTEXATTRIB1DVARBPROC glVertexAttrib1dvARB; +extern PFNGLVERTEXATTRIB1FARBPROC glVertexAttrib1fARB; +extern PFNGLVERTEXATTRIB1FVARBPROC glVertexAttrib1fvARB; +extern PFNGLVERTEXATTRIB1SARBPROC glVertexAttrib1sARB; +extern PFNGLVERTEXATTRIB1SVARBPROC glVertexAttrib1svARB; +extern PFNGLVERTEXATTRIB2DARBPROC glVertexAttrib2dARB; +extern PFNGLVERTEXATTRIB2DVARBPROC glVertexAttrib2dvARB; +extern PFNGLVERTEXATTRIB2FARBPROC glVertexAttrib2fARB; +extern PFNGLVERTEXATTRIB2FVARBPROC glVertexAttrib2fvARB; +extern PFNGLVERTEXATTRIB2SARBPROC glVertexAttrib2sARB; +extern PFNGLVERTEXATTRIB2SVARBPROC glVertexAttrib2svARB; +extern PFNGLVERTEXATTRIB3DARBPROC glVertexAttrib3dARB; +extern PFNGLVERTEXATTRIB3DVARBPROC glVertexAttrib3dvARB; +extern PFNGLVERTEXATTRIB3FARBPROC glVertexAttrib3fARB; +extern PFNGLVERTEXATTRIB3FVARBPROC glVertexAttrib3fvARB; +extern PFNGLVERTEXATTRIB3SARBPROC glVertexAttrib3sARB; +extern PFNGLVERTEXATTRIB3SVARBPROC glVertexAttrib3svARB; +extern PFNGLVERTEXATTRIB4NBVARBPROC glVertexAttrib4nbvARB; +extern PFNGLVERTEXATTRIB4NIVARBPROC glVertexAttrib4nivARB; +extern PFNGLVERTEXATTRIB4NSVARBPROC glVertexAttrib4nsvARB; +extern PFNGLVERTEXATTRIB4NUBARBPROC glVertexAttrib4nubARB; +extern PFNGLVERTEXATTRIB4NUBVARBPROC glVertexAttrib4nubvARB; +extern PFNGLVERTEXATTRIB4NUIVARBPROC glVertexAttrib4nuivARB; +extern PFNGLVERTEXATTRIB4NUSVARBPROC glVertexAttrib4nusvARB; +extern PFNGLVERTEXATTRIB4BVARBPROC glVertexAttrib4bvARB; +extern PFNGLVERTEXATTRIB4DARBPROC glVertexAttrib4dARB; +extern PFNGLVERTEXATTRIB4DVARBPROC glVertexAttrib4dvARB; +extern PFNGLVERTEXATTRIB4FARBPROC glVertexAttrib4fARB; +extern PFNGLVERTEXATTRIB4FVARBPROC glVertexAttrib4fvARB; +extern PFNGLVERTEXATTRIB4IVARBPROC glVertexAttrib4ivARB; +extern PFNGLVERTEXATTRIB4SARBPROC glVertexAttrib4sARB; +extern PFNGLVERTEXATTRIB4SVARBPROC glVertexAttrib4svARB; +extern PFNGLVERTEXATTRIB4UBVARBPROC glVertexAttrib4ubvARB; +extern PFNGLVERTEXATTRIB4UIVARBPROC glVertexAttrib4uivARB; +extern PFNGLVERTEXATTRIB4USVARBPROC glVertexAttrib4usvARB; +extern PFNGLVERTEXATTRIBPOINTERARBPROC glVertexAttribPointerARB; +extern PFNGLENABLEVERTEXATTRIBARRAYARBPROC glEnableVertexAttribArrayARB; +extern PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glDisableVertexAttribArrayARB; +extern PFNGLPROGRAMSTRINGARBPROC glProgramStringARB; +extern PFNGLBINDPROGRAMARBPROC glBindProgramARB; +extern PFNGLDELETEPROGRAMSARBPROC glDeleteProgramsARB; +extern PFNGLGENPROGRAMSARBPROC glGenProgramsARB; +extern PFNGLPROGRAMENVPARAMETER4DARBPROC glProgramEnvParameter4dARB; +extern PFNGLPROGRAMENVPARAMETER4DVARBPROC glProgramEnvParameter4dvARB; +extern PFNGLPROGRAMENVPARAMETER4FARBPROC glProgramEnvParameter4fARB; +extern PFNGLPROGRAMENVPARAMETER4FVARBPROC glProgramEnvParameter4fvARB; +extern PFNGLPROGRAMLOCALPARAMETER4DARBPROC glProgramLocalParameter4dARB; +extern PFNGLPROGRAMLOCALPARAMETER4DVARBPROC glProgramLocalParameter4dvARB; +extern PFNGLPROGRAMLOCALPARAMETER4FARBPROC glProgramLocalParameter4fARB; +extern PFNGLPROGRAMLOCALPARAMETER4FVARBPROC glProgramLocalParameter4fvARB; +extern PFNGLGETPROGRAMENVPARAMETERDVARBPROC glGetProgramEnvParameterdvARB; +extern PFNGLGETPROGRAMENVPARAMETERFVARBPROC glGetProgramEnvParameterfvARB; +extern PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC glGetProgramLocalParameterdvARB; +extern PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC glGetProgramLocalParameterfvARB; +extern PFNGLGETPROGRAMIVARBPROC glGetProgramivARB; +extern PFNGLGETPROGRAMSTRINGARBPROC glGetProgramStringARB; +extern PFNGLGETVERTEXATTRIBDVARBPROC glGetVertexAttribdvARB; +extern PFNGLGETVERTEXATTRIBFVARBPROC glGetVertexAttribfvARB; +extern PFNGLGETVERTEXATTRIBIVARBPROC glGetVertexAttribivARB; +extern PFNGLGETVERTEXATTRIBPOINTERVARBPROC glGetVertexAttribPointervARB; +extern PFNGLISPROGRAMARBPROC glIsProgramARB; +extern PFNGLBINDATTRIBLOCATIONARBPROC glBindAttribLocationARB; +extern PFNGLGETACTIVEATTRIBARBPROC glGetActiveAttribARB; +extern PFNGLGETATTRIBLOCATIONARBPROC glGetAttribLocationARB; + +extern PFNGLCOMPRESSEDTEXIMAGE2DARBPROC glCompressedTexImage2DARB; +extern PFNGLGETCOMPRESSEDTEXIMAGEARBPROC glGetCompressedTexImageARB; + +extern PFNGLCOLORTABLEEXTPROC glColorTableEXT; + +//GL_EXT_framebuffer_object +extern PFNGLISRENDERBUFFEREXTPROC glIsRenderbufferEXT; +extern PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT; +extern PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT; +extern PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT; +extern PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT; +extern PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glGetRenderbufferParameterivEXT; +extern PFNGLISFRAMEBUFFEREXTPROC glIsFramebufferEXT; +extern PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT; +extern PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT; +extern PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT; +extern PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT; +extern PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glFramebufferTexture1DEXT; +extern PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT; +extern PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glFramebufferTexture3DEXT; +extern PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT; +extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glGetFramebufferAttachmentParameterivEXT; +extern PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT; + +#elif LL_MESA //---------------------------------------------------------------------------- // MESA headers // quotes so we get libraries/.../GL/ version -#define GL_GLEXT_PROTOTYPES +#define GL_GLEXT_PROTOTYPES 1 #include "GL/gl.h" #include "GL/glext.h" #include "GL/glu.h" @@ -47,7 +251,7 @@ # include "GL/glh_extensions.h" # undef __APPLE__ -#elif LL_LINUX +#elif LL_LINUX //---------------------------------------------------------------------------- // Linux, MESA headers, but not necessarily assuming MESA runtime. // quotes so we get libraries/.../GL/ version diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 91c6a4ee352..1286e91e49c 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -364,7 +364,7 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade //copy file into memory - while(fgets((char *)buff, 1024, file) != NULL && count < (sizeof(buff)/sizeof(buff[0]))) + while( fgets((char *)buff, 1024, file) != NULL && count < LL_ARRAY_SIZE(buff) ) { text[count++] = (GLcharARB *)strdup((char *)buff); } diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index 1b4d4e7d54c..8ae0137a5e2 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -68,6 +68,7 @@ set(llui_SOURCE_FILES lluictrl.cpp lluictrlfactory.cpp lluistring.cpp + lluitrans.cpp llundo.cpp llviewborder.cpp llview.cpp @@ -124,6 +125,7 @@ set(llui_HEADER_FILES lluifwd.h llui.h lluistring.h + lluitrans.h lluixmltags.h llundo.h llviewborder.h diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index c4e928ce557..3d92280828f 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -780,7 +780,7 @@ void LLFloater::snappedTo(const LLView* snap_view) void LLFloater::userSetShape(const LLRect& new_rect) { - const LLRect& old_rect = getRect(); + const LLRect old_rect = getRect(); LLView::userSetShape(new_rect); // if not minimized, adjust all snapped dependents to new shape diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index ad980d67fcb..64649b664c5 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -59,6 +59,8 @@ #include "llresmgr.h" #include "llui.h" +#include "lluitrans.h" + #include "llstl.h" #include "v2math.h" @@ -267,24 +269,24 @@ void LLMenuItemGL::appendAcceleratorString( std::string& st ) const { if ( mAcceleratorMask & MASK_MAC_CONTROL ) { - st.append( "Ctrl-" ); + st.append( LLUITrans::getString("accel-mac-control") ); } else { - st.append( "Cmd-" ); // Symbol would be "\xE2\x8C\x98" + st.append( LLUITrans::getString("accel-mac-command") ); // Symbol would be "\xE2\x8C\x98" } } if( mAcceleratorMask & MASK_ALT ) - st.append( "Opt-" ); // Symbol would be "\xE2\x8C\xA5" + st.append( LLUITrans::getString("accel-mac-option") ); // Symbol would be "\xE2\x8C\xA5" if( mAcceleratorMask & MASK_SHIFT ) - st.append( "Shift-" ); // Symbol would be "\xE2\x8C\xA7" + st.append( LLUITrans::getString("accel-mac-shift") ); // Symbol would be "\xE2\x8C\xA7" #else if( mAcceleratorMask & MASK_CONTROL ) - st.append( "Ctrl-" ); + st.append( LLUITrans::getString("accel-win-control") ); if( mAcceleratorMask & MASK_ALT ) - st.append( "Alt-" ); + st.append( LLUITrans::getString("accel-win-alt") ); if( mAcceleratorMask & MASK_SHIFT ) - st.append( "Shift-" ); + st.append( LLUITrans::getString("accel-win-shift") ); #endif std::string keystr = LLKeyboard::stringFromKey( mAcceleratorKey ); diff --git a/indra/llui/llspinctrl.h b/indra/llui/llspinctrl.h index 424cda12075..dfd0eb3ac1a 100644 --- a/indra/llui/llspinctrl.h +++ b/indra/llui/llspinctrl.h @@ -82,6 +82,7 @@ class LLSpinCtrl virtual void setFocus( BOOL b ); virtual void clear(); virtual BOOL isDirty() const { return( mValue != mInitialValue ); } + virtual void resetDirty() { mInitialValue = mValue; } virtual void setPrecision(S32 precision); virtual void setMinValue(F32 min) { mMinValue = min; } diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 3ad42709298..a626a7a1bc1 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -1322,6 +1322,8 @@ BOOL LLTextEditor::handleMouseUp(S32 x, S32 y, MASK mask) setCursorAtLocalPos( x, y, TRUE ); endSelection(); + + updateScrollFromCursor(); } if( !hasSelection() ) diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp index 07e7a93f9f8..d6a6eca3415 100644 --- a/indra/llvfs/lldir.cpp +++ b/indra/llvfs/lldir.cpp @@ -433,7 +433,7 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd expanded_filename.assign(""); } - //llinfos << "*** EXPANDED FILENAME: <" << mExpandedFilename << ">" << llendl; + //llinfos << "*** EXPANDED FILENAME: <" << expanded_filename << ">" << llendl; return expanded_filename; } @@ -661,6 +661,11 @@ void LLDir::dumpCurrentDirectories() LL_DEBUGS2("AppInit","Directories") << " TempDir: " << getTempDir() << LL_ENDL; LL_DEBUGS2("AppInit","Directories") << " CAFile: " << getCAFile() << LL_ENDL; LL_DEBUGS2("AppInit","Directories") << " SkinDir: " << getSkinDir() << LL_ENDL; + +#if LL_LIBXUL_ENABLED + LL_DEBUGS2("AppInit","Directories") << " HTML Path: " << getExpandedFilename( LL_PATH_HTML, "" ) << llendl; + LL_DEBUGS2("AppInit","Directories") << " Mozilla Profile Path: " << getExpandedFilename( LL_PATH_MOZILLA_PROFILE, "" ) << llendl; +#endif } diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h index 2bdc0ced002..760b6512a54 100644 --- a/indra/llvfs/lldir.h +++ b/indra/llvfs/lldir.h @@ -33,6 +33,11 @@ #ifndef LL_LLDIR_H #define LL_LLDIR_H +#if LL_SOLARIS +#include <sys/param.h> +#define MAX_PATH MAXPATHLEN +#endif + // these numbers *may* get serialized, so we need to be explicit typedef enum ELLPath { diff --git a/indra/llvfs/lldir_solaris.cpp b/indra/llvfs/lldir_solaris.cpp index 49e2d3e6c5f..9553d923aaa 100644 --- a/indra/llvfs/lldir_solaris.cpp +++ b/indra/llvfs/lldir_solaris.cpp @@ -37,14 +37,13 @@ #include "llrand.h" #include <sys/types.h> #include <sys/stat.h> -#include <fcntl.h> -#include <sys/param.h> #include <unistd.h> #include <glob.h> #include <pwd.h> #include <sys/utsname.h> #define _STRUCTURED_PROC 1 #include <sys/procfs.h> +#include <fcntl.h> static std::string getCurrentUserHome(char* fallback) { @@ -83,7 +82,16 @@ LLDir_Solaris::LLDir_Solaris() mDirp = NULL; char tmp_str[LL_MAX_PATH]; /* Flawfinder: ignore */ - getcwd(tmp_str, LL_MAX_PATH); + if (getcwd(tmp_str, LL_MAX_PATH) == NULL) + { + strcpy(tmp_str, "/tmp"); + llwarns << "Could not get current directory; changing to " + << tmp_str << llendl; + if (chdir(tmp_str) == -1) + { + llerrs << "Could not change directory to " << tmp_str << llendl; + } + } mExecutableFilename = ""; mExecutablePathAndName = ""; @@ -122,20 +130,35 @@ LLDir_Solaris::LLDir_Solaris() return; } + char *p = execpath; // nuke trash in link, if any exists + int i = 0; + while(*p != NULL && ++i < LL_MAX_PATH && isprint((int)(*p++))); + *p = NULL; + mExecutablePathAndName = strdup(execpath); llinfos << "mExecutablePathAndName = [" << mExecutablePathAndName << "]" << llendl; + //NOTE: Why force people to cd into the package directory? + // Look for SECONDLIFE env variable and use it, if set. + + char *dcf = getenv("SECONDLIFE"); + if(dcf != NULL){ + (void)strcpy(path, dcf); + (void)strcat(path, "/bin"); //NOTE: make sure we point at the bin + mExecutableDir = strdup(path); + }else{ // plunk a null at last '/' to get exec dir - char *s = execpath + strlen(execpath) -1; - while(*s != '/' && s != execpath){ - --s; - } + char *s = execpath + strlen(execpath) -1; + while(*s != '/' && s != execpath){ + --s; + } - if(s != execpath){ - *s = (char)NULL; + if(s != execpath){ + *s = (char)NULL; - mExecutableDir = strdup(execpath); - llinfos << "mExecutableDir = [" << mExecutableDir << "]" << llendl; + mExecutableDir = strdup(execpath); + llinfos << "mExecutableDir = [" << mExecutableDir << "]" << llendl; + } } // *TODO: don't use /tmp, use $HOME/.secondlife/tmp or something. @@ -355,12 +378,16 @@ void LLDir_Solaris::getRandomFileInDir(const std::string &dirname, const std::st std::string LLDir_Solaris::getCurPath() { char tmp_str[LL_MAX_PATH]; /* Flawfinder: ignore */ - getcwd(tmp_str, LL_MAX_PATH); + if (getcwd(tmp_str, LL_MAX_PATH) == NULL) + { + llwarns << "Could not get current directory" << llendl; + tmp_str[0] = '\0'; + } return tmp_str; } -BOOL LLDir_Solaris::fileExists(const std::string &filename) +BOOL LLDir_Solaris::fileExists(const std::string &filename) const { struct stat stat_data; // Check the age of the file diff --git a/indra/llvfs/lldir_solaris.h b/indra/llvfs/lldir_solaris.h index f6e7c3cba5e..139754ba28a 100644 --- a/indra/llvfs/lldir_solaris.h +++ b/indra/llvfs/lldir_solaris.h @@ -50,7 +50,7 @@ class LLDir_Solaris : public LLDir virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask); virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap); virtual void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname); - /*virtual*/ BOOL fileExists(const std::string &filename); + /*virtual*/ BOOL fileExists(const std::string &filename) const; private: DIR *mDirp; diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index 49fbb78d9d0..8d446f18f1b 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -702,7 +702,7 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits "Radeon DDR", "Radeon VE", "GDI Generic" }; - const S32 CARD_COUNT = sizeof(CARD_LIST)/sizeof(char*); + const S32 CARD_COUNT = LL_ARRAY_SIZE(CARD_LIST); // Future candidates: // ProSavage/Twister diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index bd38a60fa26..6b1b6f4d609 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -85,8 +85,6 @@ static bool ATIbug = false; // be only one object of this class at any time. Currently this is true. static LLWindowSDL *gWindowImplementation = NULL; -static BOOL was_fullscreen = FALSE; - void maybe_lock_display(void) { @@ -324,8 +322,7 @@ static int x11_detect_VRAM_kb_fp(FILE *fp, const char *prefix_str) static int x11_detect_VRAM_kb() { -#if LL_SOLARIS -#error Can this be done without an explicit architecture test, ie a test FOR xorg? Was followed by: && defined(__sparc) +#if LL_SOLARIS && defined(__sparc) // NOTE: there's no Xorg server on SPARC so just return 0 // and allow SDL to attempt to get the amount of VRAM return(0); @@ -421,7 +418,7 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B if (SDL_Init(SDL_INIT_VIDEO) < 0) { llinfos << "sdl_init() failed! " << SDL_GetError() << llendl; - setupFailure("window creation error", "error", OSMB_OK); + setupFailure("sdl_init() failure, window creation error", "error", OSMB_OK); return false; } @@ -442,7 +439,7 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B if (!videoInfo) { llinfos << "SDL_GetVideoInfo() failed! " << SDL_GetError() << llendl; - setupFailure("Window creation error", "Error", OSMB_OK); + setupFailure("SDL_GetVideoInfo() failed, Window creation error", "Error", OSMB_OK); return FALSE; } @@ -498,7 +495,6 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B // *FIX: try to toggle vsync here? mFullscreen = fullscreen; - was_fullscreen = fullscreen; int sdlflags = SDL_OPENGL | SDL_RESIZABLE | SDL_ANYFORMAT; @@ -574,7 +570,6 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B if (mWindow) { mFullscreen = TRUE; - was_fullscreen = TRUE; mFullscreenWidth = mWindow->w; mFullscreenHeight = mWindow->h; mFullscreenBits = mWindow->format->BitsPerPixel; @@ -591,7 +586,6 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B llwarns << "createContext: fullscreen creation failure. SDL: " << SDL_GetError() << llendl; // No fullscreen support mFullscreen = FALSE; - was_fullscreen = FALSE; mFullscreenWidth = -1; mFullscreenHeight = -1; mFullscreenBits = -1; @@ -673,8 +667,8 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B // fixme: actually, it's REALLY important for picking that we get at // least 8 bits each of red,green,blue. Alpha we can be a bit more // relaxed about if we have to. -#if LL_SOLARIS -#error && defined(__sparc) +#if LL_SOLARIS && defined(__sparc) +// again the __sparc required because Xsun support, 32bit are very pricey on SPARC if(colorBits < 24) //HACK: on SPARC allow 24-bit color #else if (colorBits < 32) @@ -682,8 +676,7 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B { close(); setupFailure( -#if LL_SOLARIS -#error && defined(__sparc) +#if LL_SOLARIS && defined(__sparc) "Second Life requires at least 24-bit color on SPARC to run in a window.\n" "Please use fbconfig to set your default color depth to 24 bits.\n" "You may also need to adjust the X11 setting in SMF. To do so use\n" @@ -927,7 +920,6 @@ BOOL LLWindowSDL::getSize(LLCoordScreen *size) return (TRUE); } - llwarns << "LLWindowSDL::getPosition(): no window and not fullscreen!" << llendl; return (FALSE); } @@ -940,7 +932,6 @@ BOOL LLWindowSDL::getSize(LLCoordWindow *size) return (TRUE); } - llwarns << "LLWindowSDL::getPosition(): no window and not fullscreen!" << llendl; return (FALSE); } @@ -959,11 +950,18 @@ BOOL LLWindowSDL::setSize(const LLCoordScreen size) { if(mWindow) { - // *FIX: (???) - //SizeWindow(mWindow, size.mX, size.mY, true); - } + // Push a resize event onto SDL's queue - we'll handle it + // when it comes out again. + SDL_Event event; + event.type = SDL_VIDEORESIZE; + event.resize.w = size.mX; + event.resize.h = size.mY; + SDL_PushEvent(&event); // copied into queue - return TRUE; + return TRUE; + } + + return FALSE; } void LLWindowSDL::swapBuffers() @@ -1107,24 +1105,28 @@ F32 LLWindowSDL::getPixelAspectRatio() } -// some of this stuff is to support 'temporarily windowed' mode so that -// dialogs are still usable in fullscreen. HOWEVER! - it's not enabled/working -// yet. -static LLCoordScreen old_size; -static BOOL old_fullscreen; +// This is to support 'temporarily windowed' mode so that +// dialogs are still usable in fullscreen. void LLWindowSDL::beforeDialog() { + bool running_x11 = false; +#if LL_X11 + running_x11 = (mSDL_XWindowID != None); +#endif //LL_X11 + llinfos << "LLWindowSDL::beforeDialog()" << llendl; - if (SDLReallyCaptureInput(FALSE) // must ungrab input so popup works! - && getSize(&old_size)) + if (SDLReallyCaptureInput(FALSE)) // must ungrab input so popup works! { - old_fullscreen = was_fullscreen; - - if (old_fullscreen) + if (mFullscreen) { - // NOT YET WORKING - //switchContext(FALSE, old_size, TRUE); + // need to temporarily go non-fullscreen; bless SDL + // for providing a SDL_WM_ToggleFullScreen() - though + // it only works in X11 + if (running_x11 && mWindow) + { + SDL_WM_ToggleFullScreen(mWindow); + } } } @@ -1150,17 +1152,24 @@ void LLWindowSDL::beforeDialog() void LLWindowSDL::afterDialog() { + bool running_x11 = false; +#if LL_X11 + running_x11 = (mSDL_XWindowID != None); +#endif //LL_X11 + llinfos << "LLWindowSDL::afterDialog()" << llendl; maybe_unlock_display(); - if (old_fullscreen && !was_fullscreen) + if (mFullscreen) { - // *FIX: NOT YET WORKING (see below) - //switchContext(TRUE, old_size, TRUE); + // need to restore fullscreen mode after dialog - only works + // in X11 + if (running_x11 && mWindow) + { + SDL_WM_ToggleFullScreen(mWindow); + } } - // *FIX: we need to restore the GL context using - // LLViewerWindow::restoreGL() - but how?? } @@ -1703,12 +1712,12 @@ void LLWindowSDL::gatherInput() // which confuses the focus code [SL-24071]. if (event.active.gain != mHaveInputFocus) { - if (event.active.gain) + mHaveInputFocus = !!event.active.gain; + + if (mHaveInputFocus) mCallbacks->handleFocus(this); else mCallbacks->handleFocusLost(this); - - mHaveInputFocus = !!event.active.gain; } } if (event.active.state & SDL_APPACTIVE) @@ -1716,10 +1725,10 @@ void LLWindowSDL::gatherInput() // Change in iconification/minimization state. if ((!event.active.gain) != mIsMinimized) { - mCallbacks->handleActivate(this, !!event.active.gain); - llinfos << "SDL deiconification state switched to " << BOOL(event.active.gain) << llendl; - mIsMinimized = (!event.active.gain); + + mCallbacks->handleActivate(this, !mIsMinimized); + llinfos << "SDL deiconification state switched to " << BOOL(event.active.gain) << llendl; } else { @@ -2047,10 +2056,7 @@ S32 OSMessageBoxSDL(const std::string& text, const std::string& caption, U32 typ if(gWindowImplementation != NULL) gWindowImplementation->beforeDialog(); - if (LLWindowSDL::ll_try_gtk_init() - // We can NOT expect to combine GTK and SDL's aggressive fullscreen - && ((NULL==gWindowImplementation) || (!was_fullscreen)) - ) + if (LLWindowSDL::ll_try_gtk_init()) { GtkWidget *win = NULL; @@ -2155,10 +2161,7 @@ BOOL LLWindowSDL::dialog_color_picker ( F32 *r, F32 *g, F32 *b) beforeDialog(); - if (ll_try_gtk_init() - // We can NOT expect to combine GTK and SDL's aggressive fullscreen - && !was_fullscreen - ) + if (ll_try_gtk_init()) { GtkWidget *win = NULL; diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 58d09672260..d1fdc8caa18 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -2931,7 +2931,7 @@ void LLWindowWin32::spawnWebBrowser(const std::string& escaped_url ) /* std::string reg_path_str = gURLProtocolWhitelistHandler[i] + "\\shell\\open\\command"; WCHAR reg_path_wstr[256]; - mbstowcs(reg_path_wstr, reg_path_str.c_str(), sizeof(reg_path_wstr)/sizeof(reg_path_wstr[0])); + mbstowcs( reg_path_wstr, reg_path_str.c_str(), LL_ARRAY_SIZE(reg_path_wstr) ); HKEY key; WCHAR browser_open_wstr[1024]; diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 750771f6ce2..9ec838ad46b 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -41,6 +41,7 @@ if (WINDOWS) endif (WINDOWS) include_directories( + ${DBUSGLIB_INCLUDE_DIRS} ${ELFIO_INCLUDE_DIR} ${LLAUDIO_INCLUDE_DIRS} ${LLCHARACTER_INCLUDE_DIRS} @@ -937,11 +938,8 @@ if (WINDOWS) res/arrowcop.cur res/arrowcopmulti.cur res/arrowdrag.cur - res/bitmap2.bmp res/circleandline.cur res/icon1.ico - res/install_icon.BMP - res/install_icon.ico res/llarrow.cur res/llarrowdrag.cur res/llarrowdragmulti.cur @@ -963,7 +961,6 @@ if (WINDOWS) res/lltoolzoomout.cur res/ll_icon.BMP res/ll_icon.ico - res/loginbackground.bmp res/resource.h res/toolbuy.cur res/toolopen.cur @@ -973,8 +970,6 @@ if (WINDOWS) res/toolpickobject3.cur res/toolpipette.cur res/toolsit.cur - res/uninstall_icon.BMP - res/uninstall_icon.ico ) set_source_files_properties(${viewer_RESOURCE_FILES} @@ -1070,7 +1065,6 @@ set(viewer_XUI_FILES skins/default/xui/en-us/floater_html_simple.xml skins/default/xui/en-us/floater_hud.xml skins/default/xui/en-us/floater_image_preview.xml - skins/default/xui/en-us/floater_import.xml skins/default/xui/en-us/floater_im.xml skins/default/xui/en-us/floater_inspect.xml skins/default/xui/en-us/floater_instant_message_ad_hoc.xml @@ -1535,6 +1529,25 @@ if (DARWIN) ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py ) + + add_custom_command( + TARGET package POST_BUILD + COMMAND ${PYTHON_EXECUTABLE} + ARGS + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + --grid=${GRID} + --configuration=${CMAKE_CFG_INTDIR} + --channel=${VIEWER_CHANNEL} + --login_channel=${VIEWER_LOGIN_CHANNEL} + --source=${CMAKE_CURRENT_SOURCE_DIR} + --artwork=${ARTWORK_DIR} + --build=${CMAKE_CURRENT_BINARY_DIR} + --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app + --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched + DEPENDS + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + ) + endif (PACKAGE) endif (DARWIN) diff --git a/indra/newview/featuretable_solaris.txt b/indra/newview/featuretable_solaris.txt index 2a514eaab1f..f24cbde5e2e 100644 --- a/indra/newview/featuretable_solaris.txt +++ b/indra/newview/featuretable_solaris.txt @@ -35,6 +35,8 @@ RenderRippleWater 1 1 RenderTerrainDetail 1 2 VertexShaderEnable 1 1 RenderTextureMemoryMultiple 1 1.0 +UseOcclusion 1 1 +RenderCubeMap 1 1 // // Class 0 Hardware (Unknown or just old) @@ -108,6 +110,8 @@ RenderAvatarVP 0 0 RenderLighting 1 0 RenderParticleCount 1 1024 RenderTerrainDetail 1 0 +RenderCubeMap 0 0 +UseOcclusion 0 0 list low @@ -146,6 +150,7 @@ RenderVBO 1 0 RenderAniso 1 0 RenderLighting 1 0 RenderTerrainDetail 1 0 +RenderCubeMap 0 0 list GeForce2 RenderVBO 1 1 @@ -157,6 +162,7 @@ RenderTerrainDetail 1 0 list GeForce3 list ATI +UseOcclusion 0 0 list Radeon8500 RenderLighting 1 0 diff --git a/indra/newview/res/install_icon.BMP b/indra/newview/installers/windows/install_icon.BMP similarity index 100% rename from indra/newview/res/install_icon.BMP rename to indra/newview/installers/windows/install_icon.BMP diff --git a/indra/newview/installers/windows/install_icon.ico b/indra/newview/installers/windows/install_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1e00530c9016b16548de6890ab5562bbe2cbbe1d GIT binary patch literal 25214 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 BywLyv literal 0 HcmV?d00001 diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index 0a68d6badcf..483568f9744 100644 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -68,8 +68,8 @@ Name ${INSTNAME} SubCaption 0 $(LicenseSubTitleSetup) ; override "license agreement" text BrandingText " " ; bottom of window text -Icon %%SOURCE%%\res\install_icon.ico ; our custom icon -UninstallIcon %%SOURCE%%\res\uninstall_icon.ico ; our custom icon +Icon %%SOURCE%%\installers\windows\install_icon.ico +UninstallIcon %%SOURCE%%\installers\windows\uninstall_icon.ico WindowIcon on ; show our icon in left corner BGGradient off ; no big background window CRCCheck on ; make sure CRC is OK diff --git a/indra/newview/res/uninstall_icon.BMP b/indra/newview/installers/windows/uninstall_icon.BMP similarity index 100% rename from indra/newview/res/uninstall_icon.BMP rename to indra/newview/installers/windows/uninstall_icon.BMP diff --git a/indra/newview/installers/windows/uninstall_icon.ico b/indra/newview/installers/windows/uninstall_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c4ec6c70bd7f325369d8763afef61ee8e93f2960 GIT binary patch literal 25214 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 V66ANQ|7`dYdgX77pi9Oo{J$@MqwxR$ literal 0 HcmV?d00001 diff --git a/indra/newview/linux_tools/client-readme.txt b/indra/newview/linux_tools/client-readme.txt index 543a7a1881d..757e4a08cc1 100644 --- a/indra/newview/linux_tools/client-readme.txt +++ b/indra/newview/linux_tools/client-readme.txt @@ -95,12 +95,6 @@ you wish. 4. KNOWN ISSUES -=-=-=-=-=-=-=- -These are the most commonly-encountered known issues which are specific to -the Beta release of the Linux client. - -* UPLOAD / SAVE / COLOR-PICKER DIALOGS - These only appear when the client - is in 'windowed' mode, not 'fullscreen' mode. - * UPDATING - when the client detects that a new version of Second Life is available, it will ask you if you wish to download the new version. This option is not implemented; to upgrade, you should manually download a diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index efa7504a486..7ef757f1bad 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -4348,7 +4348,19 @@ void LLAgent::setFocusObject(LLViewerObject* object) //----------------------------------------------------------------------------- void LLAgent::setFocusGlobal(const LLPickInfo& pick) { - setFocusGlobal(pick.mPosGlobal, pick.mObjectID); + LLViewerObject* objectp = gObjectList.findObject(pick.mObjectID); + + if (objectp) + { + // focus on object plus designated offset + // which may or may not be same as pick.mPosGlobal + setFocusGlobal(objectp->getPositionGlobal() + LLVector3d(pick.mObjectOffset), pick.mObjectID); + } + else + { + // focus directly on point where user clicked + setFocusGlobal(pick.mPosGlobal, pick.mObjectID); + } } @@ -5831,7 +5843,12 @@ bool LLAgent::teleportCore(bool is_local) return false; } - // Stop all animation before actual teleporting +#if 0 + // This should not exist. It has been added, removed, added, and now removed again. + // This change needs to come from the simulator. Otherwise, the agent ends up out of + // sync with other viewers. Discuss in DEV-14145/VWR-6744 before reenabling. + + // Stop all animation before actual teleporting LLVOAvatar* avatarp = gAgent.getAvatarObject(); if (avatarp) { @@ -5843,6 +5860,7 @@ bool LLAgent::teleportCore(bool is_local) } avatarp->processAnimationStateChanges(); } +#endif // Don't call LLFirstUse::useTeleport because we don't know // yet if the teleport will succeed. Look in diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 1be06448407..44b9cb2198b 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -104,6 +104,7 @@ #include "llviewermenu.h" #include "llselectmgr.h" #include "lltrans.h" +#include "lluitrans.h" #include "lltracker.h" #include "llviewerparcelmgr.h" #include "llworldmapview.h" @@ -604,25 +605,6 @@ bool LLAppViewer::init() ///////////////////////////////////////////////// // OS-specific login dialogs ///////////////////////////////////////////////// -#if LL_WINDOWS - /* - // Display initial login screen, comes up quickly. JC - { - LLSplashScreen::hide(); - - INT_PTR result = DialogBox(hInstance, L"CONNECTBOX", NULL, login_dialog_func); - if (result < 0) - { - llwarns << "Connect dialog box failed, returned " << result << llendl; - return 1; - } - // success, result contains which button user clicked - llinfos << "Connect dialog box clicked " << result << llendl; - - LLSplashScreen::show(); - } - */ -#endif //test_cached_control(); @@ -1292,6 +1274,13 @@ bool LLAppViewer::cleanup() LLVFile::cleanupClass(); llinfos << "VFS cleaned up" << llendflush; + // Quitting with "Remember Password" turned off should always stomp your + // saved password, whether or not you successfully logged in. JC + if (!gSavedSettings.getBOOL("RememberPassword")) + { + LLStartUp::deletePasswordFromDisk(); + } + // Store the time of our current logoff gSavedPerAccountSettings.setU32("LastLogoff", time_corrected()); @@ -2139,6 +2128,7 @@ bool LLAppViewer::initWindow() LLUI::sWindow = gViewerWindow->getWindow(); LLTrans::parseStrings("strings.xml"); + LLUITrans::parseStrings("ui_strings.xml"); // Show watch cursor gViewerWindow->setCursor(UI_CURSOR_WAIT); diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp index 427f67c331d..0778503a92f 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -540,9 +540,11 @@ void LLAppViewerLinux::handleCrashReporting(bool reportFreeze) cmd += gDirUtilp->getDirDelimiter(); #if LL_LINUX cmd += "linux-crash-logger.bin"; -#else // LL_SOLARIS - cmd += "bin/solaris-crash-logger"; -#endif // LL_LINUX +#elif LL_SOLARIS + cmd += "solaris-crash-logger"; +#else +# error Unknown platform +#endif if(reportFreeze) { @@ -623,7 +625,10 @@ void LLAppViewerLinux::handleCrashReporting(bool reportFreeze) bool LLAppViewerLinux::beingDebugged() { static enum {unknown, no, yes} debugged = unknown; - + +#if LL_SOLARIS + return debugged == no; // BUG: fix this for Solaris +#else if (debugged == unknown) { pid_t ppid = getppid(); @@ -658,6 +663,7 @@ bool LLAppViewerLinux::beingDebugged() } return debugged == yes; +#endif } bool LLAppViewerLinux::initLogging() diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index 5bdfbb09759..9dd06687873 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -206,6 +206,7 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content) LLAssetType::EType asset_type = LLAssetType::lookup(mPostData["asset_type"].asString()); LLInventoryType::EType inventory_type = LLInventoryType::lookup(mPostData["inventory_type"].asString()); + S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); // Update L$ and ownership credit information // since it probably changed on the server @@ -222,7 +223,7 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content) gAgent.sendReliableMessage(); LLSD args; - args["AMOUNT"] = llformat("%d",LLGlobalEconomy::Singleton::getInstance()->getPriceUpload()); + args["AMOUNT"] = llformat("%d", expected_upload_cost); LLNotifications::instance().add("UploadPayment", args); } @@ -320,9 +321,14 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content) U32 everyone_perms = mPostData.has("everyone_mask") ? mPostData.get("everyone_mask" ).asInteger() : PERM_NONE; U32 group_perms = mPostData.has("group_mask") ? mPostData.get("group_mask" ).asInteger() : PERM_NONE; U32 next_owner_perms = mPostData.has("next_owner_mask") ? mPostData.get("next_owner_mask").asInteger() : PERM_NONE; + std::string display_name = LLStringUtil::null; + LLAssetStorage::LLStoreAssetCallback callback = NULL; + void *userdata = NULL; upload_new_resource(next_file, asset_name, asset_name, - 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, - next_owner_perms, group_perms, everyone_perms); + 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, + next_owner_perms, group_perms, + everyone_perms, display_name, + callback, expected_upload_cost, userdata); } } diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp index c76cbbeb3e1..2395f3c5ae4 100644 --- a/indra/newview/llchatbar.cpp +++ b/indra/newview/llchatbar.cpp @@ -523,7 +523,8 @@ void LLChatBar::onInputEditorKeystroke( LLLineEditor* caller, void* userdata ) { if (self->mInputEditor) { - self->mInputEditor->setText(utf8_out_str); + std::string rest_of_match = utf8_out_str.substr(utf8_trigger.size()); + self->mInputEditor->setText(utf8_trigger + rest_of_match); // keep original capitalization for user-entered part S32 outlength = self->mInputEditor->getLength(); // in characters // Select to end of line, starting from the character diff --git a/indra/newview/lldirpicker.cpp b/indra/newview/lldirpicker.cpp index c89d56474d4..8b0ed39eb03 100644 --- a/indra/newview/lldirpicker.cpp +++ b/indra/newview/lldirpicker.cpp @@ -39,8 +39,9 @@ #include "llkeyboard.h" #include "lldir.h" #include "llframetimer.h" +#include "lltrans.h" -#if LL_LINUX +#if LL_LINUX || LL_SOLARIS # include "llfilepicker.h" #endif @@ -264,7 +265,7 @@ void LLDirPicker::reset() mDir.clear(); } -#elif LL_LINUX +#elif LL_LINUX || LL_SOLARIS LLDirPicker::LLDirPicker() { @@ -294,7 +295,7 @@ BOOL LLDirPicker::getDir(std::string* filename) if (picker) { - gtk_window_set_title(GTK_WINDOW(picker), "Choose Directory"); + gtk_window_set_title(GTK_WINDOW(picker), LLTrans::getString("choose_the_directory").c_str()); gtk_widget_show_all(GTK_WIDGET(picker)); gtk_main(); return (!mFilePicker->getFirstFile().empty()); diff --git a/indra/newview/lldirpicker.h b/indra/newview/lldirpicker.h index 9c36dc6750b..26f76915aee 100644 --- a/indra/newview/lldirpicker.h +++ b/indra/newview/lldirpicker.h @@ -90,7 +90,7 @@ class LLDirPicker #endif -#if LL_LINUX +#if LL_LINUX || LL_SOLARIS // On Linux we just implement LLDirPicker on top of LLFilePicker LLFilePicker *mFilePicker; #endif diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp index 768a728749d..25a26f05d87 100644 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -205,7 +205,7 @@ static struct ft_display_info ft_display_table[] = { LLFastTimer::FTM_OTHER, " Other", &red0 } }; static int ft_display_didcalc = 0; -static const int FTV_DISPLAY_NUM = (sizeof(ft_display_table)/sizeof(ft_display_table[0])); +static const int FTV_DISPLAY_NUM = LL_ARRAY_SIZE(ft_display_table); S32 ft_display_idx[FTV_DISPLAY_NUM]; // line of table entry for display purposes (for collapse) diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index 1ad55ae35c9..8f5882615f9 100644 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -38,6 +38,7 @@ #include "llkeyboard.h" #include "lldir.h" #include "llframetimer.h" +#include "lltrans.h" #if LL_SDL #include "llwindowsdl.h" // for some X/GTK utils to help with filepickers @@ -893,19 +894,45 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename) return success; } -#elif LL_LINUX +#elif LL_LINUX || LL_SOLARIS # if LL_GTK // static void LLFilePicker::add_to_selectedfiles(gpointer data, gpointer user_data) { + // We need to run g_filename_to_utf8 in the user's locale + std::string saved_locale(setlocale(LC_ALL, NULL)); + setlocale(LC_ALL, ""); + LLFilePicker* picker = (LLFilePicker*) user_data; + GError *error = NULL; gchar* filename_utf8 = g_filename_to_utf8((gchar*)data, - -1, NULL, NULL, NULL); - picker->mFiles.push_back(std::string(filename_utf8)); - lldebugs << "ADDED FILE " << filename_utf8 << llendl; - g_free(filename_utf8); + -1, NULL, NULL, &error); + if (error) + { + // *FIXME. + // This condition should really be notified to the user, e.g. + // through a message box. Just logging it is inappropriate. + + // g_filename_display_name is ideal, but >= glib 2.6, so: + // a hand-rolled hacky makeASCII which disallows control chars + std::string display_name; + for (const gchar *str = (const gchar *)data; *str; str++) + { + display_name += (char)((*str >= 0x20 && *str <= 0x7E) ? *str : '?'); + } + llwarns << "g_filename_to_utf8 failed on \"" << display_name << "\": " << error->message << llendl; + } + + if (filename_utf8) + { + picker->mFiles.push_back(std::string(filename_utf8)); + lldebugs << "ADDED FILE " << filename_utf8 << llendl; + g_free(filename_utf8); + } + + setlocale(LC_ALL, saved_locale.c_str()); } // static @@ -934,8 +961,7 @@ void LLFilePicker::chooser_responder(GtkWidget *widget, gint response, gpointer GtkWindow* LLFilePicker::buildFilePicker(bool is_save, bool is_folder, std::string context) { - if (LLWindowSDL::ll_try_gtk_init() && - ! gViewerWindow->getWindow()->getFullscreen()) + if (LLWindowSDL::ll_try_gtk_init()) { GtkWidget *win = NULL; GtkFileChooserAction pickertype = @@ -1017,7 +1043,7 @@ static void add_common_filters_to_gtkchooser(GtkFileFilter *gfilter, gfilter); GtkFileFilter *allfilter = gtk_file_filter_new(); gtk_file_filter_add_pattern(allfilter, "*"); - gtk_file_filter_set_name(allfilter, "All Files"); + gtk_file_filter_set_name(allfilter, LLTrans::getString("all_files").c_str()); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(picker), allfilter); gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(picker), gfilter); } @@ -1045,13 +1071,13 @@ static std::string add_simple_mime_filter_to_gtkchooser(GtkWindow *picker, static std::string add_wav_filter_to_gtkchooser(GtkWindow *picker) { return add_simple_mime_filter_to_gtkchooser(picker, "audio/x-wav", - "Sounds (*.wav)"); + LLTrans::getString("sound_files") + " (*.wav)"); } static std::string add_bvh_filter_to_gtkchooser(GtkWindow *picker) { return add_simple_pattern_filter_to_gtkchooser(picker, "*.bvh", - "Animations (*.bvh)"); + LLTrans::getString("animation_files") + " (*.bvh)"); } static std::string add_imageload_filter_to_gtkchooser(GtkWindow *picker) @@ -1061,7 +1087,7 @@ static std::string add_imageload_filter_to_gtkchooser(GtkWindow *picker) gtk_file_filter_add_mime_type(gfilter, "image/jpeg"); gtk_file_filter_add_mime_type(gfilter, "image/png"); gtk_file_filter_add_mime_type(gfilter, "image/bmp"); - std::string filtername = "Images (*.tga; *.bmp; *.jpg; *.png)"; + std::string filtername = LLTrans::getString("image_files") + " (*.tga; *.bmp; *.jpg; *.png)"; add_common_filters_to_gtkchooser(gfilter, picker, filtername); return filtername; } @@ -1081,7 +1107,7 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename { std::string suggest_name = "untitled"; std::string suggest_ext = ""; - std::string caption = "Save "; + std::string caption = LLTrans::getString("save_file_verb") + " "; switch (filter) { case FFSAVE_WAV: @@ -1090,39 +1116,39 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename break; case FFSAVE_TGA: caption += add_simple_pattern_filter_to_gtkchooser - (picker, "*.tga", "Targa Images (*.tga)"); + (picker, "*.tga", LLTrans::getString("targa_image_files") + " (*.tga)"); suggest_ext = ".tga"; break; case FFSAVE_BMP: caption += add_simple_mime_filter_to_gtkchooser - (picker, "image/bmp", "Bitmap Images (*.bmp)"); + (picker, "image/bmp", LLTrans::getString("bitmap_image_files") + " (*.bmp)"); suggest_ext = ".bmp"; break; case FFSAVE_AVI: caption += add_simple_mime_filter_to_gtkchooser (picker, "video/x-msvideo", - "AVI Movie File (*.avi)"); + LLTrans::getString("avi_movie_file") + " (*.avi)"); suggest_ext = ".avi"; break; case FFSAVE_ANIM: caption += add_simple_pattern_filter_to_gtkchooser - (picker, "*.xaf", "XAF Anim File (*.xaf)"); + (picker, "*.xaf", LLTrans::getString("xaf_animation_file") + " (*.xaf)"); suggest_ext = ".xaf"; break; case FFSAVE_XML: caption += add_simple_pattern_filter_to_gtkchooser - (picker, "*.xml", "XML File (*.xml)"); + (picker, "*.xml", LLTrans::getString("xml_file") + " (*.xml)"); suggest_ext = ".xml"; break; case FFSAVE_RAW: caption += add_simple_pattern_filter_to_gtkchooser - (picker, "*.raw", "RAW File (*.raw)"); + (picker, "*.raw", LLTrans::getString("raw_file") + " (*.raw)"); suggest_ext = ".raw"; break; case FFSAVE_J2C: caption += add_simple_mime_filter_to_gtkchooser (picker, "images/jp2", - "Compressed Images (*.j2c)"); + LLTrans::getString("compressed_image_files") + " (*.j2c)"); suggest_ext = ".j2c"; break; default:; @@ -1168,7 +1194,7 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter ) if (picker) { - std::string caption = "Load "; + std::string caption = LLTrans::getString("load_file_verb") + " "; std::string filtername = ""; switch (filter) { @@ -1215,7 +1241,7 @@ BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter ) gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER(picker), TRUE); - gtk_window_set_title(GTK_WINDOW(picker), "Load Files"); + gtk_window_set_title(GTK_WINDOW(picker), LLTrans::getString("load_files").c_str()); gtk_widget_show_all(GTK_WIDGET(picker)); gtk_main(); diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp index 0cdd3f5b66f..045ca6aa364 100644 --- a/indra/newview/llfloateranimpreview.cpp +++ b/indra/newview/llfloateranimpreview.cpp @@ -989,15 +989,19 @@ void LLFloaterAnimPreview::onBtnOK(void* userdata) { std::string name = floaterp->childGetValue("name_form").asString(); std::string desc = floaterp->childGetValue("description_form").asString(); + LLAssetStorage::LLStoreAssetCallback callback = NULL; + S32 expected_upload_cost = sUploadAmount; + void *userdata = NULL; upload_new_resource(floaterp->mTransactionID, // tid - LLAssetType::AT_ANIMATION, - name, - desc, - 0, - LLAssetType::AT_NONE, - LLInventoryType::IT_ANIMATION, - LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), - name); + LLAssetType::AT_ANIMATION, + name, + desc, + 0, + LLAssetType::AT_NONE, + LLInventoryType::IT_ANIMATION, + LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), + name, + callback, expected_upload_cost, userdata); } else { diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp index 793ae954aef..f57042eedb3 100644 --- a/indra/newview/llfloaterchat.cpp +++ b/indra/newview/llfloaterchat.cpp @@ -393,7 +393,11 @@ void LLFloaterChat::addChat(const LLChat& chat, text_color = gSavedSettings.getColor("IMChatColor"); size = INSTANT_MSG_SIZE; } - gConsole->addLine(chat.mText, size, text_color); + // We display anything if it's not an IM. If it's an IM, check pref... + if ( !from_instant_message || gSavedSettings.getBOOL("IMInChatHistory") ) + { + gConsole->addLine(chat.mText, size, text_color); + } } if(from_instant_message && gSavedPerAccountSettings.getBOOL("LogChatIM")) diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp index db9d943ed3a..acfcfab445a 100644 --- a/indra/newview/llfloaternamedesc.cpp +++ b/indra/newview/llfloaternamedesc.cpp @@ -49,6 +49,7 @@ #include "llviewermenufile.h" // upload_new_resource() #include "lluictrlfactory.h" #include "llstring.h" +#include "lleconomy.h" // linden includes #include "llassetstorage.h" @@ -179,11 +180,16 @@ void LLFloaterNameDesc::onBtnOK( void* userdata ) fp->childDisable("ok_btn"); // don't allow inadvertent extra uploads + LLAssetStorage::LLStoreAssetCallback callback = NULL; + S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); // kinda hack - assumes that unsubclassed LLFloaterNameDesc is only used for uploading chargeable assets, which it is right now (it's only used unsubclassed for the sound upload dialog, and THAT should be a subclass). + void *nruserdata = NULL; + std::string display_name = LLStringUtil::null; upload_new_resource(fp->mFilenameAndPath, // file - fp->childGetValue("name_form").asString(), - fp->childGetValue("description_form").asString(), - 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, - LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms()); + fp->childGetValue("name_form").asString(), + fp->childGetValue("description_form").asString(), + 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, + LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), + display_name, callback, expected_upload_cost, nruserdata); fp->close(false); } diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp index 8a057b442cd..406d940cf0f 100644 --- a/indra/newview/llfloaterproperties.cpp +++ b/indra/newview/llfloaterproperties.cpp @@ -248,7 +248,7 @@ void LLFloaterProperties::refresh() "RadioSaleType", "EditPrice" }; - for(size_t t=0; t<sizeof(enableNames)/sizeof(char*); ++t) + for(size_t t=0; t<LL_ARRAY_SIZE(enableNames); ++t) { childSetEnabled(enableNames[t],false); } @@ -259,7 +259,7 @@ void LLFloaterProperties::refresh() "EveryoneMaskDebug", "NextMaskDebug" }; - for(size_t t=0; t<sizeof(hideNames)/sizeof(char*); ++t) + for(size_t t=0; t<LL_ARRAY_SIZE(hideNames); ++t) { childSetVisible(hideNames[t],false); } diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index 1f401acc4c8..3f699fda99b 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -693,6 +693,9 @@ LLSD LLFloaterReporter::gatherReport() #elif LL_LINUX const char* platform = "Lnx"; const char* short_platform = "O:L"; +#elif LL_SOLARIS + const char* platform = "Sol"; + const char* short_platform = "O:S"; #else const char* platform = "???"; const char* short_platform = "O:?"; @@ -885,6 +888,8 @@ void LLFloaterReporter::takeScreenshot() // create a resource data mResourceDatap->mInventoryType = LLInventoryType::IT_NONE; + mResourceDatap->mNextOwnerPerm = 0; // not used + mResourceDatap->mExpectedUploadCost = 0; // we expect that abuse screenshots are free mResourceDatap->mAssetInfo.mTransactionID.generate(); mResourceDatap->mAssetInfo.mUuid = mResourceDatap->mAssetInfo.mTransactionID.makeAssetID(gAgent.getSecureSessionID()); if (BUG_REPORT == mReportType) diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index dd5f2662d6a..14caed9d97a 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -51,6 +51,7 @@ #include "llfocusmgr.h" #include "llbutton.h" #include "llcombobox.h" +#include "lleconomy.h" #include "llsliderctrl.h" #include "llspinctrl.h" #include "llviewercontrol.h" @@ -952,17 +953,21 @@ void LLSnapshotLivePreview::saveTexture() gAgent.buildLocationString(pos_string); std::string who_took_it; gAgent.buildFullname(who_took_it); + LLAssetStorage::LLStoreAssetCallback callback = NULL; + S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); + void *userdata = NULL; upload_new_resource(tid, // tid - LLAssetType::AT_TEXTURE, - "Snapshot : " + pos_string, - "Taken by " + who_took_it + " at " + pos_string, - 0, - LLAssetType::AT_SNAPSHOT_CATEGORY, - LLInventoryType::IT_SNAPSHOT, - PERM_ALL, // Note: Snapshots to inventory is a special case of content upload - PERM_NONE, // that ignores the user's premissions preferences and continues to - PERM_NONE, // always use these fairly permissive hard-coded initial perms. - MG - "Snapshot : " + pos_string); + LLAssetType::AT_TEXTURE, + "Snapshot : " + pos_string, + "Taken by " + who_took_it + " at " + pos_string, + 0, + LLAssetType::AT_SNAPSHOT_CATEGORY, + LLInventoryType::IT_SNAPSHOT, + PERM_ALL, // Note: Snapshots to inventory is a special case of content upload + PERM_NONE, // that ignores the user's premissions preferences and continues to + PERM_NONE, // always use these fairly permissive hard-coded initial perms. - MG + "Snapshot : " + pos_string, + callback, expected_upload_cost, userdata); gViewerWindow->playSnapshotAnimAndSound(); } else @@ -1271,6 +1276,9 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater) LLLocale locale(LLLocale::USER_LOCALE); std::string bytes_string; LLResMgr::getInstance()->getIntegerString(bytes_string, (previewp->getDataSize()) >> 10 ); + S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); + floater->childSetLabelArg("texture", "[AMOUNT]", llformat("%d",upload_cost)); + floater->childSetLabelArg("upload_btn", "[AMOUNT]", llformat("%d",upload_cost)); floater->childSetTextArg("file_size_label", "[SIZE]", got_snap ? bytes_string : floater->getString("unknown")); floater->childSetColor("file_size_label", shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 9a0d831be48..704b53e8164 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -271,7 +271,7 @@ BOOL LLFloaterTools::postBuild() &LLToolPlacerPanel::sTriangleTorus, &LLToolPlacerPanel::sTree, &LLToolPlacerPanel::sGrass}; - for(size_t t=0; t<sizeof(toolNames)/sizeof(toolNames[0]); ++t) + for(size_t t=0; t<LL_ARRAY_SIZE(toolNames); ++t) { LLButton *found = getChild<LLButton>(toolNames[t]); if(found) diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp index a9c182455c0..16428ce6d1c 100644 --- a/indra/newview/llfloatertopobjects.cpp +++ b/indra/newview/llfloatertopobjects.cpp @@ -185,7 +185,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data) { have_extended_data = true; msg->getU32("DataExtended", "TimeStamp", time_stamp, block); - msg->getF32(_PREHASH_ReportData, "MonoScore", mono_score, block); + msg->getF32("DataExtended", "MonoScore", mono_score, block); } LLSD element; diff --git a/indra/newview/llfloatertos.cpp b/indra/newview/llfloatertos.cpp index 1ba85e6e536..6a392e03fbc 100644 --- a/indra/newview/llfloatertos.cpp +++ b/indra/newview/llfloatertos.cpp @@ -34,21 +34,25 @@ #include "llfloatertos.h" -#include "llbutton.h" -#include "llradiogroup.h" -#include "llvfile.h" -#include "lltextbox.h" -#include "llviewertexteditor.h" +// viewer includes +#include "llagent.h" #include "llappviewer.h" #include "llstartup.h" -#include "message.h" -#include "llagent.h" -#include "lluictrlfactory.h" -#include "llviewerwindow.h" #include "llviewerstats.h" -#include "llui.h" +#include "llviewertexteditor.h" +#include "llviewerwindow.h" + +// linden library includes +#include "llbutton.h" #include "llhttpclient.h" +#include "llhttpstatuscodes.h" // for HTTP_FOUND #include "llradiogroup.h" +#include "lltextbox.h" +#include "llui.h" +#include "lluictrlfactory.h" +#include "llvfile.h" +#include "message.h" + // static LLFloaterTOS* LLFloaterTOS::sInstance = NULL; @@ -115,7 +119,13 @@ class LLIamHere : public LLHTTPClient::Responder virtual void error( U32 status, const std::string& reason ) { if ( mParent ) - mParent->setSiteIsAlive( false ); + { + // *HACK: For purposes of this alive check, 302 Found + // (aka Moved Temporarily) is considered alive. The web site + // redirects this link to a "cache busting" temporary URL. JC + bool alive = (status == HTTP_FOUND); + mParent->setSiteIsAlive( alive ); + } }; }; @@ -185,12 +195,6 @@ void LLFloaterTOS::setSiteIsAlive( bool alive ) // but if the page is unavailable, we need to do this now LLCheckBoxCtrl* tos_agreement = getChild<LLCheckBoxCtrl>("agree_chk"); tos_agreement->setEnabled( true ); - - if ( web_browser ) - { - // hide browser control (revealing default text message) - web_browser->setVisible( FALSE ); - }; }; }; } diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 7f2321aafbe..d59f5139252 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -742,7 +742,7 @@ void LLFloaterWorldMap::updateLocation() void LLFloaterWorldMap::trackURL(const std::string& region_name, S32 x_coord, S32 y_coord, S32 z_coord) { LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromName(region_name); - z_coord = llclamp(z_coord, 0, 1000); + z_coord = llclamp(z_coord, 0, 4096); if (sim_info) { LLVector3 local_pos; diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 48d9a8a76b3..f98a3f9ee51 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -1067,7 +1067,7 @@ void LLInventoryModel::fetchInventoryResponder::result(const LLSD& content) S32 count = content["items"].size(); bool all_one_folder = true; LLUUID folder_id; - // Does this loop ever execute more than once? -Gigs + // Does this loop ever execute more than once? for(S32 i = 0; i < count; ++i) { LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem; @@ -2645,7 +2645,7 @@ void LLInventoryModel::processFetchInventoryReply(LLMessageSystem* msg, void**) bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account) { - //make sure our added inventory observer is active -Gigs + //make sure our added inventory observer is active start_new_inventory_observer(); LLUUID agent_id; @@ -2661,7 +2661,7 @@ bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account) S32 count = msg->getNumberOfBlocksFast(_PREHASH_InventoryData); bool all_one_folder = true; LLUUID folder_id; - // Does this loop ever execute more than once? -Gigs + // Does this loop ever execute more than once? for(S32 i = 0; i < count; ++i) { LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem; @@ -3791,7 +3791,6 @@ void LLInventoryAddedObserver::changed(U32 mask) // *HACK: If this was in response to a packet off // the network, figure out which item was updated. - // Code from Gigs Taggert, sin allowed by JC. LLMessageSystem* msg = gMessageSystem; std::string msg_name; diff --git a/indra/newview/llloginhandler.cpp b/indra/newview/llloginhandler.cpp index d298f8e0e7b..053f7988827 100644 --- a/indra/newview/llloginhandler.cpp +++ b/indra/newview/llloginhandler.cpp @@ -192,27 +192,18 @@ bool LLLoginHandler::handle(const LLSD& tokens, LLMD5 pass((unsigned char*)password.c_str()); char md5pass[33]; /* Flawfinder: ignore */ pass.hex_digest(md5pass); - password = ll_safe_string(md5pass, 32); - save_password_to_disk(password.c_str()); + std::string hashed_password = ll_safe_string(md5pass, 32); + LLStartUp::savePasswordToDisk(hashed_password); } } - else - { - save_password_to_disk(NULL); - gSavedSettings.setBOOL("RememberPassword", FALSE); - } if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP) //on splash page { if (!mFirstName.empty() || !mLastName.empty()) { - // Fill in the name, and maybe the password, preserving the - // remember-password setting. JC - std::string ignore; - BOOL remember; - LLPanelLogin::getFields(ignore, ignore, ignore, remember); - LLPanelLogin::setFields(mFirstName, mLastName, password, remember); + // Fill in the name, and maybe the password + LLPanelLogin::setFields(mFirstName, mLastName, password); } if (mWebLoginKey.isNull()) diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index b9a700991e0..959a575950a 100644 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -1635,7 +1635,7 @@ void LLManipTranslate::highlightIntersection(LLVector3 normal, } U32 types[] = { LLRenderPass::PASS_SIMPLE, LLRenderPass::PASS_ALPHA, LLRenderPass::PASS_FULLBRIGHT, LLRenderPass::PASS_SHINY }; - U32 num_types = sizeof(types)/sizeof(U32); + U32 num_types = LL_ARRAY_SIZE(types); GLuint stencil_mask = 0xFFFFFFFF; //stencil in volumes diff --git a/indra/newview/llmemoryview.cpp b/indra/newview/llmemoryview.cpp index 2a8fa2bf358..97dc373b07b 100644 --- a/indra/newview/llmemoryview.cpp +++ b/indra/newview/llmemoryview.cpp @@ -138,7 +138,7 @@ static const struct mtv_display_info mtv_display_table[] = { LLMemType::MTYPE_OTHER, "Other", &red0 }, }; -static const int MTV_DISPLAY_NUM = (sizeof(mtv_display_table)/sizeof(mtv_display_table[0])); +static const int MTV_DISPLAY_NUM = LL_ARRAY_SIZE(mtv_display_table); void LLMemoryView::draw() { diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 8b5cb942219..41f8f3941a3 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -78,9 +78,6 @@ #include "llweb.h" #include "llinventorymodel.h" #include "roles_constants.h" - -#define kArraySize( _kArray ) ( sizeof( (_kArray) ) / sizeof( _kArray[0] ) ) - #include "lluictrlfactory.h" // Statics @@ -504,17 +501,17 @@ BOOL LLPanelAvatarPicks::postBuild(void) BOOL LLPanelAvatarAdvanced::postBuild() { - for(size_t ii = 0; ii < kArraySize(mWantToCheck); ++ii) + for(size_t ii = 0; ii < LL_ARRAY_SIZE(mWantToCheck); ++ii) mWantToCheck[ii] = NULL; - for(size_t ii = 0; ii < kArraySize(mSkillsCheck); ++ii) + for(size_t ii = 0; ii < LL_ARRAY_SIZE(mSkillsCheck); ++ii) mSkillsCheck[ii] = NULL; - mWantToCount = (8>kArraySize(mWantToCheck))?kArraySize(mWantToCheck):8; + mWantToCount = (8>LL_ARRAY_SIZE(mWantToCheck))?LL_ARRAY_SIZE(mWantToCheck):8; for(S32 tt=0; tt < mWantToCount; ++tt) { std::string ctlname = llformat("chk%d", tt); mWantToCheck[tt] = getChild<LLCheckBoxCtrl>(ctlname); } - mSkillsCount = (6>kArraySize(mSkillsCheck))?kArraySize(mSkillsCheck):6; + mSkillsCount = (6>LL_ARRAY_SIZE(mSkillsCheck))?LL_ARRAY_SIZE(mSkillsCheck):6; for(S32 tt=0; tt < mSkillsCount; ++tt) { @@ -1817,7 +1814,7 @@ void LLPanelAvatar::processAvatarPropertiesReply(LLMessageSystem *msg, void**) "AcctTypeCharterMember", "AcctTypeEmployee" }; - caption_index = llclamp(caption_index, (U8)0, (U8)(sizeof(ACCT_TYPE)/sizeof(ACCT_TYPE[0])-1)); + caption_index = llclamp(caption_index, (U8)0, (U8)(LL_ARRAY_SIZE(ACCT_TYPE)-1)); args["[ACCTTYPE]"] = self->mPanelSecondLife->getString(ACCT_TYPE[caption_index]); std::string payment_text = " "; diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index ceca360967e..cbf4a8740c0 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -195,6 +195,7 @@ BOOL LLPanelGroupGeneral::postBuild() mSpinEnrollmentFee->setCommitCallback(onCommitAny); mSpinEnrollmentFee->setCallbackUserData(this); mSpinEnrollmentFee->setPrecision(0); + mSpinEnrollmentFee->resetDirty(); } BOOL accept_notices = FALSE; @@ -221,6 +222,7 @@ BOOL LLPanelGroupGeneral::postBuild() mCtrlListGroup->setCallbackUserData(this); mCtrlListGroup->set(list_in_profile); mCtrlListGroup->setEnabled(data.mID.notNull()); + mCtrlListGroup->resetDirty(); } mActiveTitleLabel = getChild<LLTextBox>("active_title_label", recurse); @@ -230,6 +232,7 @@ BOOL LLPanelGroupGeneral::postBuild() { mComboActiveTitle->setCommitCallback(onCommitTitle); mComboActiveTitle->setCallbackUserData(this); + mComboActiveTitle->resetDirty(); } mIncompleteMemberDataStr = getString("incomplete_member_data_str"); @@ -259,7 +262,7 @@ BOOL LLPanelGroupGeneral::postBuild() void LLPanelGroupGeneral::onFocusEdit(LLFocusableElement* ctrl, void* data) { LLPanelGroupGeneral* self = (LLPanelGroupGeneral*)data; - self->mChanged = TRUE; + self->updateChanged(); self->notifyObservers(); } @@ -317,6 +320,7 @@ void LLPanelGroupGeneral::onCommitTitle(LLUICtrl* ctrl, void* data) if (self->mGroupID.isNull() || !self->mAllowEdit) return; LLGroupMgr::getInstance()->sendGroupTitleUpdate(self->mGroupID,self->mComboActiveTitle->getCurrentID()); self->update(GC_TITLES); + self->mComboActiveTitle->resetDirty(); } // static @@ -398,6 +402,7 @@ void LLPanelGroupGeneral::openProfile(void* data) bool LLPanelGroupGeneral::needsApply(std::string& mesg) { + updateChanged(); mesg = getString("group_info_unchanged"); return mChanged || mGroupID.isNull(); } @@ -660,6 +665,8 @@ void LLPanelGroupGeneral::update(LLGroupChange gc) mComboActiveTitle->setCurrentByID(LLUUID::null); } } + + mComboActiveTitle->resetDirty(); } // If this was just a titles update, we are done. @@ -674,6 +681,8 @@ void LLPanelGroupGeneral::update(LLGroupChange gc) { mCtrlShowInGroupList->set(gdatap->mShowInList); mCtrlShowInGroupList->setEnabled(mAllowEdit && can_change_ident); + mCtrlShowInGroupList->resetDirty(); + } if (mComboMature) { @@ -687,24 +696,29 @@ void LLPanelGroupGeneral::update(LLGroupChange gc) } mComboMature->setEnabled(mAllowEdit && can_change_ident); mComboMature->setVisible( !gAgent.isTeen() ); + mComboMature->resetDirty(); } if (mCtrlOpenEnrollment) { mCtrlOpenEnrollment->set(gdatap->mOpenEnrollment); mCtrlOpenEnrollment->setEnabled(mAllowEdit && can_change_member_opts); + mCtrlOpenEnrollment->resetDirty(); } if (mCtrlEnrollmentFee) { mCtrlEnrollmentFee->set(gdatap->mMembershipFee > 0); mCtrlEnrollmentFee->setEnabled(mAllowEdit && can_change_member_opts); + mCtrlEnrollmentFee->resetDirty(); } if (mSpinEnrollmentFee) { S32 fee = gdatap->mMembershipFee; mSpinEnrollmentFee->set((F32)fee); - mSpinEnrollmentFee->setEnabled( mAllowEdit - && (fee > 0) && can_change_member_opts); + mSpinEnrollmentFee->setEnabled( mAllowEdit && + (fee > 0) && + can_change_member_opts); + mSpinEnrollmentFee->resetDirty(); } if ( mBtnJoinGroup ) { @@ -733,8 +747,9 @@ void LLPanelGroupGeneral::update(LLGroupChange gc) { mCtrlReceiveNotices->setEnabled(mAllowEdit); } + mCtrlReceiveNotices->resetDirty(); } - + if (mInsignia) mInsignia->setEnabled(mAllowEdit && can_change_ident); if (mEditCharter) mEditCharter->setEnabled(mAllowEdit && can_change_ident); @@ -750,11 +765,15 @@ void LLPanelGroupGeneral::update(LLGroupChange gc) } else { - mInsignia->setImageAssetID(mDefaultIconID); } } - if (mEditCharter) mEditCharter->setText(gdatap->mCharter); + + if (mEditCharter) + { + mEditCharter->setText(gdatap->mCharter); + mEditCharter->resetDirty(); + } if (mListVisibleMembers) { @@ -882,7 +901,7 @@ void LLPanelGroupGeneral::updateChanged() mChanged = FALSE; - for( int i= 0; i< sizeof(check_list)/sizeof(*check_list); i++ ) + for( int i= 0; i< LL_ARRAY_SIZE(check_list); i++ ) { if( check_list[i] && check_list[i]->isDirty() ) { diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 46ced60b448..bc5e8f2482e 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -546,8 +546,9 @@ void LLPanelLogin::show(const LLRect &rect, } // static -void LLPanelLogin::setFields(const std::string& firstname, const std::string& lastname, const std::string& password, - BOOL remember) +void LLPanelLogin::setFields(const std::string& firstname, + const std::string& lastname, + const std::string& password) { if (!sInstance) { @@ -581,8 +582,6 @@ void LLPanelLogin::setFields(const std::string& firstname, const std::string& la pass.hex_digest(munged_password); sInstance->mMungedPassword = munged_password; } - - sInstance->childSetValue("remember_check", remember); } @@ -601,8 +600,9 @@ void LLPanelLogin::addServer(const std::string& server, S32 domain_name) } // static -void LLPanelLogin::getFields(std::string &firstname, std::string &lastname, std::string &password, - BOOL &remember) +void LLPanelLogin::getFields(std::string *firstname, + std::string *lastname, + std::string *password) { if (!sInstance) { @@ -610,14 +610,13 @@ void LLPanelLogin::getFields(std::string &firstname, std::string &lastname, std: return; } - firstname = sInstance->childGetText("first_name_edit"); - LLStringUtil::trim(firstname); + *firstname = sInstance->childGetText("first_name_edit"); + LLStringUtil::trim(*firstname); - lastname = sInstance->childGetText("last_name_edit"); - LLStringUtil::trim(lastname); + *lastname = sInstance->childGetText("last_name_edit"); + LLStringUtil::trim(*lastname); - password = sInstance->mMungedPassword; - remember = sInstance->childGetValue("remember_check"); + *password = sInstance->mMungedPassword; } // static diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h index 5dffaa8323d..47d42da7f1a 100644 --- a/indra/newview/llpanellogin.h +++ b/indra/newview/llpanellogin.h @@ -59,14 +59,15 @@ class LLPanelLogin: void (*callback)(S32 option, void* user_data), void* callback_data); + // Remember password checkbox is set via gSavedSettings "RememberPassword" static void setFields(const std::string& firstname, const std::string& lastname, - const std::string& password, BOOL remember); + const std::string& password); static void addServer(const std::string& server, S32 domain_name); static void refreshLocation( bool force_visible ); - static void getFields(std::string& firstname, std::string& lastname, - std::string& password, BOOL& remember); + static void getFields(std::string *firstname, std::string *lastname, + std::string *password); static BOOL isGridComboDirty(); static void getLocation(std::string &location); diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp index 09cdfabfc17..ff3b9433f48 100644 --- a/indra/newview/llpreviewgesture.cpp +++ b/indra/newview/llpreviewgesture.cpp @@ -236,14 +236,14 @@ BOOL LLPreviewGesture::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, LLScrollListItem* line = NULL; if (cargo_type == DAD_ANIMATION) { - line = addStep("Animation"); + line = addStep( STEP_ANIMATION ); LLGestureStepAnimation* anim = (LLGestureStepAnimation*)line->getUserdata(); anim->mAnimAssetID = item->getAssetUUID(); anim->mAnimName = item->getName(); } else if (cargo_type == DAD_SOUND) { - line = addStep("Sound"); + line = addStep( STEP_SOUND ); LLGestureStepSound* sound = (LLGestureStepSound*)line->getUserdata(); sound->mSoundAssetID = item->getAssetUUID(); sound->mSoundName = item->getName(); @@ -847,18 +847,18 @@ void LLPreviewGesture::refresh() void LLPreviewGesture::initDefaultGesture() { LLScrollListItem* item; - item = addStep("Animation"); + item = addStep( STEP_ANIMATION ); LLGestureStepAnimation* anim = (LLGestureStepAnimation*)item->getUserdata(); anim->mAnimAssetID = ANIM_AGENT_HELLO; anim->mAnimName = "Wave"; updateLabel(item); - item = addStep("Wait"); + item = addStep( STEP_WAIT ); LLGestureStepWait* wait = (LLGestureStepWait*)item->getUserdata(); wait->mFlags = WAIT_FLAG_ALL_ANIM; updateLabel(item); - item = addStep("Chat"); + item = addStep( STEP_CHAT ); LLGestureStepChat* chat_step = (LLGestureStepChat*)item->getUserdata(); chat_step->mChatText = "Hello, avatar!"; updateLabel(item); @@ -1597,38 +1597,44 @@ void LLPreviewGesture::onClickAdd(void* data) LLScrollListItem* library_item = self->mLibraryList->getFirstSelected(); if (!library_item) return; + S32 library_item_index = self->mLibraryList->getFirstSelectedIndex(); + const LLScrollListCell* library_cell = library_item->getColumn(0); const std::string& library_text = library_cell->getValue().asString(); - self->addStep(library_text); + if( library_item_index >= STEP_EOF ) + { + llerrs << "Unknown step type: " << library_text << llendl; + return; + } + self->addStep( (EStepType)library_item_index ); self->mDirty = TRUE; self->refresh(); } -LLScrollListItem* LLPreviewGesture::addStep(const std::string& library_text) +LLScrollListItem* LLPreviewGesture::addStep( const EStepType step_type ) { + // Order of enum EStepType MUST match the library_list element in floater_preview_gesture.xml + LLGestureStep* step = NULL; - if (!LLStringUtil::compareInsensitive(library_text, "Animation")) - { - step = new LLGestureStepAnimation(); - } - else if (!LLStringUtil::compareInsensitive(library_text, "Sound")) - { - step = new LLGestureStepSound(); - } - else if (!LLStringUtil::compareInsensitive(library_text, "Chat")) + switch( step_type) { - step = new LLGestureStepChat(); - } - else if (!LLStringUtil::compareInsensitive(library_text, "Wait")) - { - step = new LLGestureStepWait(); - } - else - { - llerrs << "Unknown step type: " << library_text << llendl;; - return NULL; + case STEP_ANIMATION: + step = new LLGestureStepAnimation(); + break; + case STEP_SOUND: + step = new LLGestureStepSound(); + break; + case STEP_CHAT: + step = new LLGestureStepChat(); + break; + case STEP_WAIT: + step = new LLGestureStepWait(); + break; + default: + llerrs << "Unknown step type: " << (S32)step_type << llendl; + return NULL; } // Create an enabled item with this step diff --git a/indra/newview/llpreviewgesture.h b/indra/newview/llpreviewgesture.h index 91c214be62f..c245c0e8da5 100644 --- a/indra/newview/llpreviewgesture.h +++ b/indra/newview/llpreviewgesture.h @@ -34,6 +34,7 @@ #define LL_LLPREVIEWGESTURE_H #include "llpreview.h" +#include "llmultigesture.h" class LLMultiGesture; class LLLineEditor; @@ -109,7 +110,7 @@ class LLPreviewGesture : public LLPreview // Add a step. Pass the name of the step, like "Animation", // "Sound", "Chat", or "Wait" - LLScrollListItem* addStep(const std::string& step_name); + LLScrollListItem* addStep(const enum EStepType step_type); static void updateLabel(LLScrollListItem* item); diff --git a/indra/newview/llresourcedata.h b/indra/newview/llresourcedata.h index 26097757941..46b79150bbf 100644 --- a/indra/newview/llresourcedata.h +++ b/indra/newview/llresourcedata.h @@ -42,6 +42,7 @@ struct LLResourceData LLAssetType::EType mPreferredLocation; LLInventoryType::EType mInventoryType; U32 mNextOwnerPerm; + S32 mExpectedUploadCost; void *mUserData; }; diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index ebbc49fbd6a..dc4b8134dca 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -1896,7 +1896,7 @@ void pushVertsColorCoded(LLSpatialGroup* group, U32 mask) LLColor4::green6 }; - static const U32 col_count = sizeof(colors)/sizeof(LLColor4); + static const U32 col_count = LL_ARRAY_SIZE(colors); U32 col = 0; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 6663b5ec191..b4f8f6b71ec 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -232,8 +232,6 @@ EStartupState LLStartUp::gStartupState = STATE_FIRST; void login_show(); void login_callback(S32 option, void* userdata); -std::string load_password_from_disk(); -void save_password_to_disk(const char* hashed_password); bool is_hex_string(U8* str, S32 len); void show_first_run_dialog(); bool first_run_dialog_callback(const LLSD& notification, const LLSD& response); @@ -351,7 +349,6 @@ bool idle_startup() static S32 location_which = START_LOCATION_ID_LAST; static bool show_connect_box = true; - static BOOL remember_password = TRUE; static bool stipend_since_login = false; @@ -684,7 +681,6 @@ bool idle_startup() char md5pass[33]; /* Flawfinder: ignore */ pass.hex_digest(md5pass); password = md5pass; - remember_password = gSavedSettings.getBOOL("RememberPassword"); #ifdef USE_VIEWER_AUTH show_connect_box = true; @@ -697,9 +693,8 @@ bool idle_startup() { firstname = gSavedSettings.getString("FirstName"); lastname = gSavedSettings.getString("LastName"); - password = load_password_from_disk(); + password = LLStartUp::loadPasswordFromDisk(); gSavedSettings.setBOOL("RememberPassword", TRUE); - remember_password = TRUE; #ifdef USE_VIEWER_AUTH show_connect_box = true; @@ -713,8 +708,7 @@ bool idle_startup() // a valid grid is selected firstname = gSavedSettings.getString("FirstName"); lastname = gSavedSettings.getString("LastName"); - password = load_password_from_disk(); - remember_password = gSavedSettings.getBOOL("RememberPassword"); + password = LLStartUp::loadPasswordFromDisk(); show_connect_box = true; } @@ -753,7 +747,7 @@ bool idle_startup() // Load all the name information out of the login view // NOTE: Hits "Attempted getFields with no login view shown" warning, since we don't // show the login view until login_show() is called below. - // LLPanelLogin::getFields(firstname, lastname, password, remember_password); + // LLPanelLogin::getFields(firstname, lastname, password); if (gNoRender) { @@ -765,7 +759,7 @@ bool idle_startup() // Show the login dialog login_show(); // connect dialog is already shown, so fill in the names - LLPanelLogin::setFields( firstname, lastname, password, remember_password ); + LLPanelLogin::setFields( firstname, lastname, password); LLPanelLogin::giveFocus(); @@ -834,7 +828,7 @@ bool idle_startup() { // TODO if not use viewer auth // Load all the name information out of the login view - LLPanelLogin::getFields(firstname, lastname, password, remember_password); + LLPanelLogin::getFields(&firstname, &lastname, &password); // end TODO // HACK: Try to make not jump on login @@ -846,16 +840,6 @@ bool idle_startup() gSavedSettings.setString("FirstName", firstname); gSavedSettings.setString("LastName", lastname); - if (remember_password) - { - save_password_to_disk(password.c_str()); - } - else - { - save_password_to_disk(NULL); - } - gSavedSettings.setBOOL("RememberPassword", remember_password); - LL_INFOS("AppInit") << "Attempting login as: " << firstname << " " << lastname << LL_ENDL; gDebugInfo["LoginName"] = firstname + " " + lastname; } @@ -1362,15 +1346,17 @@ bool idle_startup() gSavedSettings.setString("FirstName", firstname); gSavedSettings.setString("LastName", lastname); - if (remember_password) + if (gSavedSettings.getBOOL("RememberPassword")) { - save_password_to_disk(password.c_str()); + // Successful login means the password is valid, so save it. + LLStartUp::savePasswordToDisk(password); } else { - save_password_to_disk(NULL); + // Don't leave password from previous session sitting around + // during this login session. + LLStartUp::deletePasswordFromDisk(); } - gSavedSettings.setBOOL("RememberPassword", remember_password); text = LLUserAuth::getInstance()->getResponse("agent_access"); if(!text.empty() && (text[0] == 'M')) @@ -1563,7 +1549,7 @@ bool idle_startup() // Pass the user information to the voice chat server interface. gVoiceClient->userAuthorized(firstname, lastname, gAgentID); } - else + else // if(successful_login) { if (gNoRender) { @@ -1578,8 +1564,6 @@ bool idle_startup() reset_login(); gSavedSettings.setBOOL("AutoLogin", FALSE); show_connect_box = true; - // Don't save an incorrect password to disk. - save_password_to_disk(NULL); } return FALSE; } @@ -2571,16 +2555,11 @@ void login_callback(S32 option, void *userdata) { // Make sure we don't save the password if the user is trying to clear it. std::string first, last, password; - BOOL remember = TRUE; - LLPanelLogin::getFields(first, last, password, remember); - if (!remember) + LLPanelLogin::getFields(&first, &last, &password); + if (!gSavedSettings.getBOOL("RememberPassword")) { // turn off the setting and write out to disk - gSavedSettings.setBOOL("RememberPassword", FALSE); gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile") , TRUE ); - - // stomp the saved password on disk - save_password_to_disk(NULL); } // Next iteration through main loop should shut down the app cleanly. @@ -2598,8 +2577,18 @@ void login_callback(S32 option, void *userdata) } } -std::string load_password_from_disk() + +// static +std::string LLStartUp::loadPasswordFromDisk() { + // Only load password if we also intend to save it (otherwise the user + // wonders what we're doing behind his back). JC + BOOL remember_password = gSavedSettings.getBOOL("RememberPassword"); + if (!remember_password) + { + return std::string(""); + } + std::string hashed_password(""); // Look for legacy "marker" password from settings.ini @@ -2651,41 +2640,45 @@ std::string load_password_from_disk() return hashed_password; } -void save_password_to_disk(const char* hashed_password) + +// static +void LLStartUp::savePasswordToDisk(const std::string& hashed_password) { std::string filepath = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "password.dat"); - if (!hashed_password) + LLFILE* fp = LLFile::fopen(filepath, "wb"); /* Flawfinder: ignore */ + if (!fp) { - // No password, remove the file. - LLFile::remove(filepath); + return; } - else - { - LLFILE* fp = LLFile::fopen(filepath, "wb"); /* Flawfinder: ignore */ - if (!fp) - { - return; - } - - // Encipher with MAC address - const S32 HASHED_LENGTH = 32; - U8 buffer[HASHED_LENGTH+1]; - LLStringUtil::copy((char*)buffer, hashed_password, HASHED_LENGTH+1); + // Encipher with MAC address + const S32 HASHED_LENGTH = 32; + U8 buffer[HASHED_LENGTH+1]; - LLXORCipher cipher(gMACAddress, 6); - cipher.encrypt(buffer, HASHED_LENGTH); + LLStringUtil::copy((char*)buffer, hashed_password.c_str(), HASHED_LENGTH+1); - if (fwrite(buffer, HASHED_LENGTH, 1, fp) != 1) - { - LL_WARNS("AppInit") << "Short write" << LL_ENDL; - } + LLXORCipher cipher(gMACAddress, 6); + cipher.encrypt(buffer, HASHED_LENGTH); - fclose(fp); + if (fwrite(buffer, HASHED_LENGTH, 1, fp) != 1) + { + LL_WARNS("AppInit") << "Short write" << LL_ENDL; } + + fclose(fp); } + +// static +void LLStartUp::deletePasswordFromDisk() +{ + std::string filepath = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, + "password.dat"); + LLFile::remove(filepath); +} + + bool is_hex_string(U8* str, S32 len) { bool rv = true; @@ -2869,6 +2862,8 @@ bool update_dialog_callback(const LLSD& notification, const LLSD& response) query_map["os"] = "mac"; #elif LL_LINUX query_map["os"] = "lnx"; +#elif LL_SOLARIS + query_map["os"] = "sol"; #endif // *TODO change userserver to be grid on both viewer and sim, since // userserver no longer exists. @@ -2952,7 +2947,7 @@ bool update_dialog_callback(const LLSD& notification, const LLSD& response) // Run the auto-updater. system(LLAppViewer::sUpdaterInfo->mUpdateExePath.c_str()); /* Flawfinder: ignore */ -#elif LL_LINUX +#elif LL_LINUX || LL_SOLARIS OSMessageBox("Automatic updating is not yet implemented for Linux.\n" "Please download the latest version from www.secondlife.com.", LLStringUtil::null, OSMB_OK); diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h index e455c4aed16..fe347e9efe2 100644 --- a/indra/newview/llstartup.h +++ b/indra/newview/llstartup.h @@ -37,7 +37,6 @@ // functions bool idle_startup(); -std::string load_password_from_disk(); void release_start_screen(); bool login_alert_done(const LLSD& notification, const LLSD& response); @@ -99,6 +98,15 @@ class LLStartUp static void loadInitialOutfit( const std::string& outfit_folder_name, const std::string& gender_name ); + // Load MD5 of user's password from local disk file. + static std::string loadPasswordFromDisk(); + + // Record MD5 of user's password for subsequent login. + static void savePasswordToDisk(const std::string& hashed_password); + + // Delete the saved password local disk file. + static void deletePasswordFromDisk(); + static bool dispatchURL(); // if we have a SLURL or sim string ("Ahern/123/45") that started // the viewer, dispatch it diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index b1ad80cdd93..450e5d83afc 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -235,7 +235,7 @@ void LLTextureBar::draw() { "MIS", LLColor4::red }, // LAST_STATE+4 { "---", LLColor4::white }, // LAST_STATE+5 }; - const S32 fetch_state_desc_size = (S32)(sizeof(fetch_state_desc)/sizeof(fetch_state_desc[0])); + const S32 fetch_state_desc_size = (S32)LL_ARRAY_SIZE(fetch_state_desc); S32 state = mImagep->mNeedsCreateTexture ? LAST_STATE+1 : mImagep->mFullyLoaded ? LAST_STATE+2 : diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index fe94863f2d5..70fc78d2774 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -526,6 +526,14 @@ void LLViewerMedia::buildMediaManagerData( LLMediaManagerData* init_data ) std::string component_dir( gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "" ) ); component_dir += gDirUtilp->getDirDelimiter(); component_dir += "mozilla-runtime-linux-i686"; +#elif LL_SOLARIS + std::string component_dir( gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "" ) ); + component_dir += gDirUtilp->getDirDelimiter(); + #ifdef __sparc + component_dir += "mozilla-solaris-sparc"; + #else + component_dir += "mozilla-solaris-i686"; + #endif #else std::string component_dir( gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "" ) ); component_dir += gDirUtilp->getDirDelimiter(); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 17f59595f67..e0b7b233ecd 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -285,9 +285,6 @@ typedef LLMemberListener<LLView> view_listener_t; void handle_leave_group(void *); // File Menu -const char* upload_pick(void* data); -void handle_upload(void* data); -//void handle_upload_object(void* data); void handle_compress_image(void*); BOOL enable_save_as(void *); @@ -654,7 +651,7 @@ void init_menus() gViewerWindow->setMenuBackgroundColor(false, LLViewerLogin::getInstance()->isInProductionGrid()); - // *TODO:Get the cost info from the server + // Assume L$10 for now, the server will tell us the real cost at login const std::string upload_cost("10"); gMenuHolder->childSetLabelArg("Upload Image", "[COST]", upload_cost); gMenuHolder->childSetLabelArg("Upload Sound", "[COST]", upload_cost); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index ff8d717b12a..a6dede1e382 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -274,6 +274,7 @@ class LLFileUploadSound : public view_listener_t { LLFloaterNameDesc* floaterp = new LLFloaterNameDesc(filename); LLUICtrlFactory::getInstance()->buildFloater(floaterp, "floater_sound_preview.xml"); + floaterp->childSetLabelArg("ok_btn", "[AMOUNT]", llformat("%d", LLGlobalEconomy::Singleton::getInstance()->getPriceUpload() )); } return true; } @@ -324,8 +325,14 @@ class LLFileUploadBulk : public view_listener_t LLStringUtil::stripNonprintable(asset_name); LLStringUtil::trim(asset_name); + std::string display_name = LLStringUtil::null; + LLAssetStorage::LLStoreAssetCallback callback = NULL; + S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); + void *userdata = NULL; upload_new_resource(filename, asset_name, asset_name, 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, - LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms()); + LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), + display_name, + callback, expected_upload_cost, userdata); // *NOTE: Ew, we don't iterate over the file list here, // we handle the next files in upload_done_callback() @@ -482,6 +489,7 @@ void handle_upload(void* data) { LLFloaterNameDesc* floaterp = new LLFloaterNameDesc(filename); LLUICtrlFactory::getInstance()->buildFloater(floaterp, "floater_name_description.xml"); + floaterp->childSetLabelArg("ok_btn", "[AMOUNT]", llformat("%d", LLGlobalEconomy::Singleton::getInstance()->getPriceUpload() )); } } @@ -517,15 +525,16 @@ void handle_compress_image(void*) } void upload_new_resource(const std::string& src_filename, std::string name, - std::string desc, S32 compression_info, - LLAssetType::EType destination_folder_type, - LLInventoryType::EType inv_type, - U32 next_owner_perms, - U32 group_perms, - U32 everyone_perms, - const std::string& display_name, - LLAssetStorage::LLStoreAssetCallback callback, - void *userdata) + std::string desc, S32 compression_info, + LLAssetType::EType destination_folder_type, + LLInventoryType::EType inv_type, + U32 next_owner_perms, + U32 group_perms, + U32 everyone_perms, + const std::string& display_name, + LLAssetStorage::LLStoreAssetCallback callback, + S32 expected_upload_cost, + void *userdata) { // Generate the temporary UUID. std::string filename = gDirUtilp->getTempFilename(); @@ -809,8 +818,8 @@ void upload_new_resource(const std::string& src_filename, std::string name, t_disp_name = src_filename; } upload_new_resource(tid, asset_type, name, desc, compression_info, // tid - destination_folder_type, inv_type, next_owner_perms, group_perms, everyone_perms, - display_name, callback, userdata); + destination_folder_type, inv_type, next_owner_perms, group_perms, everyone_perms, + display_name, callback, expected_upload_cost, userdata); } else { @@ -829,8 +838,10 @@ void upload_new_resource(const std::string& src_filename, std::string name, void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExtStat ext_status) // StoreAssetData callback (fixed) { LLResourceData* data = (LLResourceData*)user_data; + S32 expected_upload_cost = data ? data->mExpectedUploadCost : 0; //LLAssetType::EType pref_loc = data->mPreferredLocation; BOOL is_balance_sufficient = TRUE; + if(result >= 0) { LLAssetType::EType dest_loc = (data->mPreferredLocation == LLAssetType::AT_NONE) ? data->mAssetInfo.mType : data->mPreferredLocation; @@ -841,20 +852,19 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt { // Charge the user for the upload. LLViewerRegion* region = gAgent.getRegion(); - S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); - if(!(can_afford_transaction(upload_cost))) + if(!(can_afford_transaction(expected_upload_cost))) { LLFloaterBuyCurrency::buyCurrency( llformat("Uploading %s costs", data->mAssetInfo.getName().c_str()), // *TODO: Translate - upload_cost); + expected_upload_cost); is_balance_sufficient = FALSE; } else if(region) { // Charge user for upload - gStatusBar->debitBalance(upload_cost); + gStatusBar->debitBalance(expected_upload_cost); LLMessageSystem* msg = gMessageSystem; msg->newMessageFast(_PREHASH_MoneyTransferRequest); @@ -865,7 +875,9 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID()); msg->addUUIDFast(_PREHASH_DestID, LLUUID::null); msg->addU8("Flags", 0); - msg->addS32Fast(_PREHASH_Amount, upload_cost); + // we tell the sim how much we were expecting to pay so it + // can respond to any discrepancy + msg->addS32Fast(_PREHASH_Amount, expected_upload_cost); msg->addU8Fast(_PREHASH_AggregatePermNextOwner, (U8)LLAggregatePermissions::AP_EMPTY); msg->addU8Fast(_PREHASH_AggregatePermInventory, (U8)LLAggregatePermissions::AP_EMPTY); msg->addS32Fast(_PREHASH_TransactionType, TRANS_UPLOAD_CHARGE); @@ -921,22 +933,31 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt LLStringUtil::stripNonprintable(asset_name); LLStringUtil::trim(asset_name); + std::string display_name = LLStringUtil::null; + LLAssetStorage::LLStoreAssetCallback callback = NULL; + void *userdata = NULL; upload_new_resource(next_file, asset_name, asset_name, // file - 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE); + 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, + PERM_NONE, PERM_NONE, PERM_NONE, + display_name, + callback, + expected_upload_cost, // assuming next in a group of uploads is of roughly the same type, i.e. same upload cost + userdata); } } void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_type, - std::string name, - std::string desc, S32 compression_info, - LLAssetType::EType destination_folder_type, - LLInventoryType::EType inv_type, - U32 next_owner_perms, - U32 group_perms, - U32 everyone_perms, - const std::string& display_name, - LLAssetStorage::LLStoreAssetCallback callback, - void *userdata) + std::string name, + std::string desc, S32 compression_info, + LLAssetType::EType destination_folder_type, + LLInventoryType::EType inv_type, + U32 next_owner_perms, + U32 group_perms, + U32 everyone_perms, + const std::string& display_name, + LLAssetStorage::LLStoreAssetCallback callback, + S32 expected_upload_cost, + void *userdata) { if(gDisconnected) { @@ -985,6 +1006,7 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty llinfos << "UUID: " << uuid << llendl; llinfos << "Name: " << name << llendl; llinfos << "Desc: " << desc << llendl; + llinfos << "Expected Upload Cost: " << expected_upload_cost << llendl; lldebugs << "Folder: " << gInventory.findCategoryUUIDForType((destination_folder_type == LLAssetType::AT_NONE) ? asset_type : destination_folder_type) << llendl; lldebugs << "Asset Type: " << LLAssetType::lookup(asset_type) << llendl; std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory"); @@ -1000,6 +1022,7 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty body["next_owner_mask"] = LLSD::Integer(next_owner_perms); body["group_mask"] = LLSD::Integer(group_perms); body["everyone_mask"] = LLSD::Integer(everyone_perms); + body["expected_upload_cost"] = LLSD::Integer(expected_upload_cost); //std::ostringstream llsdxml; //LLSDSerialize::toPrettyXML(body, llsdxml); @@ -1016,12 +1039,11 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty LLAssetType::AT_TEXTURE == asset_type || LLAssetType::AT_ANIMATION == asset_type) { - S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); S32 balance = gStatusBar->getBalance(); - if (balance < upload_cost) + if (balance < expected_upload_cost) { // insufficient funds, bail on this upload - LLFloaterBuyCurrency::buyCurrency("Uploading costs", upload_cost); + LLFloaterBuyCurrency::buyCurrency("Uploading costs", expected_upload_cost); return; } } @@ -1033,6 +1055,7 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty data->mAssetInfo.mCreatorID = gAgentID; data->mInventoryType = inv_type; data->mNextOwnerPerm = next_owner_perms; + data->mExpectedUploadCost = expected_upload_cost; data->mUserData = userdata; data->mAssetInfo.setName(name); data->mAssetInfo.setDescription(desc); diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h index 5a7aa427b4a..bf21292082b 100644 --- a/indra/newview/llviewermenufile.h +++ b/indra/newview/llviewermenufile.h @@ -42,30 +42,32 @@ class LLTransactionID; void init_menu_file(); void upload_new_resource(const std::string& src_filename, - std::string name, - std::string desc, - S32 compression_info, - LLAssetType::EType destination_folder_type, - LLInventoryType::EType inv_type, - U32 next_owner_perms = 0x0, // PERM_NONE - U32 group_perms = 0x0, // PERM_NONE - U32 everyone_perms = 0x0, // PERM_NONE - const std::string& display_name = LLStringUtil::null, - LLAssetStorage::LLStoreAssetCallback callback = NULL, - void *userdata = NULL); + std::string name, + std::string desc, + S32 compression_info, + LLAssetType::EType destination_folder_type, + LLInventoryType::EType inv_type, + U32 next_owner_perms, + U32 group_perms, + U32 everyone_perms, + const std::string& display_name, + LLAssetStorage::LLStoreAssetCallback callback, + S32 expected_upload_cost, + void *userdata); void upload_new_resource(const LLTransactionID &tid, - LLAssetType::EType type, - std::string name, - std::string desc, - S32 compression_info, - LLAssetType::EType destination_folder_type, - LLInventoryType::EType inv_type, - U32 next_owner_perms = 0x0, // PERM_NONE - U32 group_perms = 0x0, // PERM_NONE - U32 everyone_perms = 0x0, // PERM_NONE - const std::string& display_name = LLStringUtil::null, - LLAssetStorage::LLStoreAssetCallback callback = NULL, - void *userdata = NULL); + LLAssetType::EType type, + std::string name, + std::string desc, + S32 compression_info, + LLAssetType::EType destination_folder_type, + LLInventoryType::EType inv_type, + U32 next_owner_perms, + U32 group_perms, + U32 everyone_perms, + const std::string& display_name, + LLAssetStorage::LLStoreAssetCallback callback, + S32 expected_upload_cost, + void *userdata); #endif diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 08dbc5b3b8d..c840557f018 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -73,6 +73,7 @@ #include "lldrawpool.h" #include "llfirstuse.h" #include "llfloateractivespeakers.h" +#include "llfloateranimpreview.h" #include "llfloaterbuycurrency.h" #include "llfloaterbuyland.h" #include "llfloaterchat.h" @@ -133,7 +134,6 @@ #include "pipeline.h" #include "llappviewer.h" #include "llfloaterworldmap.h" -#include "llkeythrottle.h" #include "llviewerdisplay.h" #include "llkeythrottle.h" @@ -227,6 +227,8 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response) break; case 1: // decline + // We no longer notify other viewers, but we DO still send + // the rejection to the simulator to delete the pending userop. msg->newMessageFast(_PREHASH_DeclineFriendship); msg->nextBlockFast(_PREHASH_AgentData); msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); @@ -721,7 +723,7 @@ class LLOpenAgentOffer : public LLInventoryFetchObserver //instance of the AddedObserver for TaskOffers //and it never dies. We do this because we don't know the UUID of //task offers until they are accepted, so we don't wouldn't -//know what to watch for, so instead we just watch for all additions. -Gigs +//know what to watch for, so instead we just watch for all additions. class LLOpenTaskOffer : public LLInventoryAddedObserver { protected: @@ -797,7 +799,7 @@ class LLDiscardAgentOffer : public LLInventoryFetchComboObserver //Returns TRUE if we are OK, FALSE if we are throttled //Set check_only true if you want to know the throttle status -//without registering a hit -Gigs +//without registering a hit bool check_offer_throttle(const std::string& from_name, bool check_only) { static U32 throttle_count; @@ -824,14 +826,14 @@ bool check_offer_throttle(const std::string& from_name, bool check_only) { LL_DEBUGS("Messaging") << "Throttle Not Expired, Count: " << throttle_count << LL_ENDL; // When downloading the initial inventory we get a lot of new items - // coming in and can't tell that from spam. JC + // coming in and can't tell that from spam. if (LLStartUp::getStartupState() >= STATE_STARTED && throttle_count >= OFFER_THROTTLE_MAX_COUNT) { if (!throttle_logged) { // Use the name of the last item giver, who is probably the person - // spamming you. JC + // spamming you. std::ostringstream message; message << LLAppViewer::instance()->getSecondLifeTitle(); if (!from_name.empty()) @@ -879,10 +881,10 @@ void open_offer(const std::vector<LLUUID>& items, const std::string& from_name) } LLAssetType::EType asset_type = item->getType(); - //if we are throttled, don't display them - Gigs + //if we are throttled, don't display them if (check_offer_throttle(from_name, false)) { - // I'm not sure this is a good idea. JC + // I'm not sure this is a good idea. bool show_keep_discard = item->getPermissions().getCreator() != gAgent.getID(); //bool show_keep_discard = true; switch(asset_type) @@ -934,7 +936,7 @@ void open_offer(const std::vector<LLUUID>& items, const std::string& from_name) return; } - //Not sure about this check. Could make it easy to miss incoming items. -Gigs + //Not sure about this check. Could make it easy to miss incoming items. //don't dick with highlight while the user is working //if(inventory_has_focus && !user_is_away) // break; @@ -1037,7 +1039,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& // This must be done here because: // * callback may be called immediately, // * adding the mute sends a message, - // * we can't build two messages at once. JC + // * we can't build two messages at once. if (2 == button) { gCacheName->get(mFromID, mFromGroup, inventory_offer_mute_callback, this); @@ -1301,7 +1303,7 @@ void inventory_offer_handler(LLOfferInfo* info, BOOL from_task) } // Name cache callbacks don't store userdata, so can't save - // off the LLOfferInfo. Argh. JC + // off the LLOfferInfo. Argh. BOOL name_found = FALSE; if (info->mFromGroup) { @@ -1948,6 +1950,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) << LLURI::mapToQueryString(query_string); chat.mURL = link.str(); + chat.mText = name + separator_string + message.substr(message_offset); // Note: lie to LLFloaterChat::addChat(), pretending that this is NOT an IM, because // IMs from objcts don't open IM sessions. @@ -2092,11 +2095,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) } break; - case IM_FRIENDSHIP_DECLINED: - args["NAME"] = name; - LLNotifications::instance().add("FriendshipDeclined", args); - break; - + case IM_FRIENDSHIP_DECLINED_DEPRECATED: default: LL_WARNS("Messaging") << "Instant message calling for unknown dialog " << (S32)dialog << LL_ENDL; @@ -2769,7 +2768,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**) if (!avatarp) { // Could happen if you were immediately god-teleported away on login, - // maybe other cases. Continue, but warn. JC + // maybe other cases. Continue, but warn. LL_WARNS("Messaging") << "agent_movement_complete() with NULL avatarp." << LL_ENDL; } @@ -2809,7 +2808,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**) if( is_teleport ) { - // Force the camera back onto the agent, don't animate. JC + // Force the camera back onto the agent, don't animate. gAgent.setFocusOnAvatar(TRUE, FALSE); gAgent.slamLookAt(look_at); gAgent.updateCamera(); @@ -4261,7 +4260,7 @@ void process_mean_collision_alert_message(LLMessageSystem *msgsystem, void **use { if (gAgent.inPrelude()) { - // JC: In prelude, bumping is OK. This dialog is rather confusing to + // In prelude, bumping is OK. This dialog is rather confusing to // newbies, so we don't show it. Drop the packet on the floor. return; } @@ -4336,7 +4335,11 @@ void process_economy_data(LLMessageSystem *msg, void** /*user_data*/) LLGlobalEconomy::processEconomyData(msg, LLGlobalEconomy::Singleton::getInstance()); S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); + + LL_INFOS_ONCE("Messaging") << "EconomyData message arrived; upload cost is L$" << upload_cost << LL_ENDL; + LLFloaterImagePreview::setUploadAmount(upload_cost); + LLFloaterAnimPreview::setUploadAmount(upload_cost); gMenuHolder->childSetLabelArg("Upload Image", "[COST]", llformat("%d", upload_cost)); gMenuHolder->childSetLabelArg("Upload Sound", "[COST]", llformat("%d", upload_cost)); @@ -4521,14 +4524,26 @@ void process_script_question(LLMessageSystem *msg, void **user_data) msg->getStringFast(_PREHASH_Data, _PREHASH_ObjectOwner, owner_name); msg->getS32Fast(_PREHASH_Data, _PREHASH_Questions, questions ); - // don't display permission requests if this object is muted - JS. + // Special case. If the objects are owned by this agent, throttle per-object instead + // of per-owner. It's common for residents to reset a ton of scripts that re-request + // permissions, as with tier boxes. UUIDs can't be valid agent names and vice-versa, + // so we'll reuse the same namespace for both throttle types. + std::string throttle_name = owner_name; + std::string self_name; + gAgent.getName( self_name ); + if( owner_name == self_name ) + { + throttle_name = taskid.getString(); + } + + // don't display permission requests if this object is muted if (LLMuteList::getInstance()->isMuted(taskid)) return; - + // throttle excessive requests from any specific user's scripts typedef LLKeyThrottle<std::string> LLStringThrottle; static LLStringThrottle question_throttle( LLREQUEST_PERMISSION_THROTTLE_LIMIT, LLREQUEST_PERMISSION_THROTTLE_INTERVAL ); - switch (question_throttle.noteAction(owner_name)) + switch (question_throttle.noteAction(throttle_name)) { case LLStringThrottle::THROTTLE_NEWLY_BLOCKED: LL_INFOS("Messaging") << "process_script_question throttled" @@ -5426,7 +5441,7 @@ void invalid_message_callback(LLMessageSystem* msg, } // Please do not add more message handlers here. This file is huge. -// Put them in a file related to the functionality you are implementing. JC +// Put them in a file related to the functionality you are implementing. void LLOfferInfo::forceResponse(InventoryOfferResponse response) { diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 1b4517372d9..07569a5e546 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -58,6 +58,7 @@ #include "llviewerwindow.h" // *TODO: remove, only used for width/height #include "llworld.h" #include "llfeaturemanager.h" +#include "llviewernetwork.h" #if LL_LCD_COMPILE #include "lllcd.h" #endif @@ -662,7 +663,7 @@ void send_stats() time(<ime); F32 run_time = F32(LLFrameTimer::getElapsedSeconds()); - agent["start_time"] = ltime - run_time; + agent["start_time"] = S32(ltime - S32(run_time)); // The first stat set must have a 0 run time if it doesn't actually // contain useful data in terms of FPS, etc. We use half the @@ -701,7 +702,11 @@ void send_stats() system["ram"] = (S32) gSysMemory.getPhysicalMemoryKB(); system["os"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple(); system["cpu"] = gSysCPU.getCPUString(); - + std::string macAddressString = llformat("%02x-%02x-%02x-%02x-%02x-%02x", + gMACAddress[0],gMACAddress[1],gMACAddress[2], + gMACAddress[3],gMACAddress[4],gMACAddress[5]); + system["mac_address"] = macAddressString; + system["serial_number"] = LLAppViewer::instance()->getSerialNumber(); std::string gpu_desc = llformat( "%-6s Class %d ", gGLManager.mGLVendorShort.substr(0,6).c_str(), diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 597513ba0c4..4f2504fc172 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -3216,69 +3216,69 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last) (is_away != mNameAway || is_busy != mNameBusy || is_muted != mNameMute) || is_appearance != mNameAppearance) { - char line[MAX_STRING]; /* Flawfinder: ignore */ + std::string line; if (!sRenderGroupTitles) { // If all group titles are turned off, stack first name // on a line above last name - strncpy(line, firstname->getString(), MAX_STRING -1 ); /* Flawfinder: ignore */ - line[MAX_STRING -1] = '\0'; - strcat(line, "\n"); + line += firstname->getString(); + line += "\n"; } else if (title && title->getString() && title->getString()[0] != '\0') { - strncpy(line, title->getString(), MAX_STRING -1 ); /* Flawfinder: ignore */ - line[MAX_STRING -1] = '\0'; - strcat(line, "\n"); /* Flawfinder: ignore */ - strncat(line, firstname->getString(), MAX_STRING - strlen(line) -1 ); /* Flawfinder: ignore */ + line += title->getString(); + LLStringFn::replace_ascii_controlchars(line,LL_UNKNOWN_CHAR); + line += "\n"; + line += firstname->getString(); } else { - strncpy(line, firstname->getString(), MAX_STRING -1 ); /* Flawfinder: ignore */ - line[MAX_STRING -1] = '\0'; + line += firstname->getString(); } - strcat(line, " "); /* Flawfinder: ignore */ - strncat(line, lastname->getString(), MAX_STRING - strlen(line) -1); /* Flawfinder: ignore */ + line += " "; + line += lastname->getString(); BOOL need_comma = FALSE; if (is_away || is_muted || is_busy) { - strcat(line, " ("); /* Flawfinder: ignore */ + line += " ("; if (is_away) { - strcat(line, "Away"); /* Flawfinder: ignore */ + line += "Away"; need_comma = TRUE; } if (is_busy) { if (need_comma) { - strcat(line, ", "); /* Flawfinder: ignore */ + line += ", "; } - strcat(line, "Busy"); /* Flawfinder: ignore */ + line += "Busy"; need_comma = TRUE; } if (is_muted) { if (need_comma) { - strcat(line, ", "); /* Flawfinder: ignore */ + line += ", "; } - strcat(line, "Muted"); /* Flawfinder: ignore */ + line += "Muted"; need_comma = TRUE; } - strcat(line,")"); /* Flawfinder: ignore */ + line += ")"; } if (is_appearance) { - strcat(line, "\n(Editing Appearance)"); /* Flawfinder: ignore */ + line += "\n"; + line += "(Editing Appearance)"; } mNameAway = is_away; mNameBusy = is_busy; mNameMute = is_muted; mNameAppearance = is_appearance; mTitle = title ? title->getString() : ""; + LLStringFn::replace_ascii_controlchars(mTitle,LL_UNKNOWN_CHAR); mNameString = utf8str_to_wstring(line); new_name = TRUE; } @@ -3915,7 +3915,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) // Generate footstep sounds when feet hit the ground //------------------------------------------------------------------------- const LLUUID AGENT_FOOTSTEP_ANIMS[] = {ANIM_AGENT_WALK, ANIM_AGENT_RUN, ANIM_AGENT_LAND}; - const S32 NUM_AGENT_FOOTSTEP_ANIMS = sizeof(AGENT_FOOTSTEP_ANIMS) / sizeof(LLUUID); + const S32 NUM_AGENT_FOOTSTEP_ANIMS = LL_ARRAY_SIZE(AGENT_FOOTSTEP_ANIMS); if ( gAudiop && isAnyAnimationSignaled(AGENT_FOOTSTEP_ANIMS, NUM_AGENT_FOOTSTEP_ANIMS) ) { diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index 6a6064e0a2d..1a4f28a8aa3 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -863,7 +863,7 @@ LLVoiceClient::LLVoiceClient() // This now happens when init() is called instead. mPump = NULL; -#if LL_DARWIN || LL_LINUX +#if LL_DARWIN || LL_LINUX || LL_SOLARIS // MBW -- XXX -- THIS DOES NOT BELONG HERE // When the vivox daemon dies, the next write attempt on our socket generates a SIGPIPE, which kills us. // This should cause us to ignore SIGPIPE and handle the error through proper channels. diff --git a/indra/newview/llwlparamset.cpp b/indra/newview/llwlparamset.cpp index 1cb5ee77543..ea9c00ae815 100644 --- a/indra/newview/llwlparamset.cpp +++ b/indra/newview/llwlparamset.cpp @@ -69,7 +69,7 @@ LLWLParamSet::LLWLParamSet(void) : std::make_pair("gamma", LLVector4(2.0f, 2.0f, 2.0f, 0.0f)), }; std::map<std::string, LLVector4>::value_type const * endHardcodedPreset = - hardcodedPreset + sizeof(hardcodedPreset)/sizeof(hardcodedPreset[0]); + hardcodedPreset + LL_ARRAY_SIZE(hardcodedPreset); mParamValues.insert(hardcodedPreset, endHardcodedPreset); */ diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp index e01e5957475..4d46ff19cc8 100644 --- a/indra/newview/llworldmap.cpp +++ b/indra/newview/llworldmap.cpp @@ -49,6 +49,13 @@ const F32 REQUEST_ITEMS_TIMER = 10.f * 60.f; // 10 minutes +// For DEV-17507, do lazy image loading in llworldmapview.cpp instead, +// limiting requests to currently visible regions and minimizing the +// number of textures being requested simultaneously. +// +// Uncomment IMMEDIATE_IMAGE_LOAD to restore the old behavior +// +//#define IMMEDIATE_IMAGE_LOAD LLItemInfo::LLItemInfo(F32 global_x, F32 global_y, const std::string& name, LLUUID id, @@ -611,13 +618,17 @@ void LLWorldMap::processMapBlockReply(LLMessageSystem* msg, void**) siminfo->mRegionFlags = region_flags; siminfo->mWaterHeight = (F32) water_height; siminfo->mMapImageID[agent_flags] = image_id; +#ifdef IMMEDIATE_IMAGE_LOAD siminfo->mCurrentImage = gImageList.getImage(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE); gGL.getTexUnit(0)->bind(siminfo->mCurrentImage.get()); siminfo->mCurrentImage->setClamp(TRUE, TRUE); +#endif if (siminfo->mMapImageID[2].notNull()) { +#ifdef IMMEDIATE_IMAGE_LOAD siminfo->mOverlayImage = gImageList.getImage(siminfo->mMapImageID[2], MIPMAP_TRUE, FALSE); +#endif } else { diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 685ca8bba55..1cf8755e626 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -61,6 +61,7 @@ #include "llviewerregion.h" #include "llviewerwindow.h" #include "llworldmap.h" +#include "lltexturefetch.h" #include "llappviewer.h" // Only for constants! #include "lltrans.h" @@ -422,30 +423,24 @@ void LLWorldMapView::draw() F32 sim_alpha = 1.f; // Draw one image per region, centered on the camera position. + const S32 MAX_SIMULTANEOUS_TEX = 100; + const S32 MAX_REQUEST_PER_TICK = 5; + const S32 MIN_REQUEST_PER_TICK = 1; + S32 textures_requested_this_tick = 0; + for (LLWorldMap::sim_info_map_t::iterator it = LLWorldMap::getInstance()->mSimInfoMap.begin(); it != LLWorldMap::getInstance()->mSimInfoMap.end(); ++it) { U64 handle = (*it).first; LLSimInfo* info = (*it).second; - if (info->mCurrentImage.isNull()) - { - info->mCurrentImage = gImageList.getImage(info->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE); - } - if (info->mOverlayImage.isNull() && info->mMapImageID[2].notNull()) - { - info->mOverlayImage = gImageList.getImage(info->mMapImageID[2], MIPMAP_TRUE, FALSE); - gGL.getTexUnit(0)->bind(info->mOverlayImage.get()); - info->mOverlayImage->setClamp(TRUE, TRUE); - } - LLViewerImage* simimage = info->mCurrentImage; LLViewerImage* overlayimage = info->mOverlayImage; if (gMapScale < SIM_MAP_SCALE) { - simimage->setBoostLevel(0); - if (overlayimage) overlayimage->setBoostLevel(0); + if (simimage != NULL) simimage->setBoostLevel(0); + if (overlayimage != NULL) overlayimage->setBoostLevel(0); continue; } @@ -476,6 +471,7 @@ void LLWorldMapView::draw() bool sim_visible = (gMapScale >= map_scale_cutoff) && + (simimage != NULL) && (simimage->getHasGLTexture()); if (sim_visible) @@ -502,11 +498,38 @@ void LLWorldMapView::draw() right < 0.f || left > width ) { - simimage->setBoostLevel(0); - if (overlayimage) overlayimage->setBoostLevel(0); + if (simimage != NULL) simimage->setBoostLevel(0); + if (overlayimage != NULL) overlayimage->setBoostLevel(0); continue; } + if (info->mCurrentImage.isNull()) + { + if ((textures_requested_this_tick < MIN_REQUEST_PER_TICK) || + ((LLAppViewer::getTextureFetch()->getNumRequests() < MAX_SIMULTANEOUS_TEX) && + (textures_requested_this_tick < MAX_REQUEST_PER_TICK))) + { + textures_requested_this_tick++; + info->mCurrentImage = gImageList.getImage(info->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE); + info->mCurrentImage->setClamp(TRUE, TRUE); + simimage = info->mCurrentImage; + gGL.getTexUnit(0)->bind(simimage); + } + } + if (info->mOverlayImage.isNull() && info->mMapImageID[2].notNull()) + { + if ((textures_requested_this_tick < MIN_REQUEST_PER_TICK) || + ((LLAppViewer::getTextureFetch()->getNumRequests() < MAX_SIMULTANEOUS_TEX) && + (textures_requested_this_tick < MAX_REQUEST_PER_TICK))) + { + textures_requested_this_tick++; + info->mOverlayImage = gImageList.getImage(info->mMapImageID[2], MIPMAP_TRUE, FALSE); + info->mOverlayImage->setClamp(TRUE, TRUE); + overlayimage = info->mOverlayImage; + gGL.getTexUnit(0)->bind(overlayimage); + } + } + mVisibleRegions.push_back(handle); // See if the agents need updating if (current_time - info->mAgentsUpdateTime > AGENTS_UPDATE_TIME) @@ -521,10 +544,13 @@ void LLWorldMapView::draw() center_global.mdV[VY] += 128.0; S32 draw_size = llround(gMapScale); - simimage->setBoostLevel(LLViewerImage::BOOST_MAP); - simimage->setKnownDrawSize(llround(draw_size * LLUI::sGLScaleFactor.mV[VX]), llround(draw_size * LLUI::sGLScaleFactor.mV[VY])); + if (simimage != NULL) + { + simimage->setBoostLevel(LLViewerImage::BOOST_MAP); + simimage->setKnownDrawSize(llround(draw_size * LLUI::sGLScaleFactor.mV[VX]), llround(draw_size * LLUI::sGLScaleFactor.mV[VY])); + } - if (overlayimage) + if (overlayimage != NULL) { overlayimage->setBoostLevel(LLViewerImage::BOOST_MAP); overlayimage->setKnownDrawSize(llround(draw_size * LLUI::sGLScaleFactor.mV[VX]), llround(draw_size * LLUI::sGLScaleFactor.mV[VY])); @@ -537,7 +563,8 @@ void LLWorldMapView::draw() // Draw using the texture. If we don't clamp we get artifact at // the edge. LLGLSUIDefault gls_ui; - gGL.getTexUnit(0)->bind(simimage); + if (simimage != NULL) + gGL.getTexUnit(0)->bind(simimage); gGL.setSceneBlendType(LLRender::BT_ALPHA); F32 alpha = sim_alpha * info->mAlpha; @@ -663,7 +690,8 @@ void LLWorldMapView::draw() // If map texture is still loading, // display "Loading" placeholder text. - if (simimage->getDiscardLevel() != 1 && + if ((simimage != NULL) && + simimage->getDiscardLevel() != 1 && simimage->getDiscardLevel() != 0) { font->renderUTF8( @@ -1658,43 +1686,59 @@ BOOL LLWorldMapView::handleMouseUp( S32 x, S32 y, MASK mask ) return FALSE; } -void LLWorldMapView::updateBlock(S32 block_x, S32 block_y) +U32 LLWorldMapView::updateBlock(S32 block_x, S32 block_y) { + U32 blocks_requested = 0; S32 offset = block_x | (block_y * MAP_BLOCK_RES); if (!LLWorldMap::getInstance()->mMapBlockLoaded[LLWorldMap::getInstance()->mCurrentMap][offset]) { // llinfos << "Loading Block (" << block_x << "," << block_y << ")" << llendl; LLWorldMap::getInstance()->sendMapBlockRequest(block_x << 3, block_y << 3, (block_x << 3) + 7, (block_y << 3) + 7); LLWorldMap::getInstance()->mMapBlockLoaded[LLWorldMap::getInstance()->mCurrentMap][offset] = TRUE; + blocks_requested++; } + return blocks_requested; } -void LLWorldMapView::updateVisibleBlocks() +U32 LLWorldMapView::updateVisibleBlocks() { if (gMapScale < SIM_MAP_SCALE) { // We don't care what is loaded if we're zoomed out - return; + return 0; } - // check if we've loaded the 9 potentially visible zones - LLVector3d camera_global = gAgent.getCameraPositionGlobal(); + LLVector3d camera_global = gAgent.getCameraPositionGlobal(); + + F32 pixels_per_region = gMapScale; + const S32 width = getRect().getWidth(); + const S32 height = getRect().getHeight(); // Convert pan to sim coordinates - S32 world_center_x = S32((-sPanX / gMapScale) + (camera_global.mdV[0] / REGION_WIDTH_METERS)); - S32 world_center_y = S32((-sPanY / gMapScale) + (camera_global.mdV[1] / REGION_WIDTH_METERS)); - + S32 world_center_x_lo = S32(((-sPanX - width/2) / pixels_per_region) + (camera_global.mdV[0] / REGION_WIDTH_METERS)); + S32 world_center_x_hi = S32(((-sPanX + width/2) / pixels_per_region) + (camera_global.mdV[0] / REGION_WIDTH_METERS)); + S32 world_center_y_lo = S32(((-sPanY - height/2) / pixels_per_region) + (camera_global.mdV[1] / REGION_WIDTH_METERS)); + S32 world_center_y_hi = S32(((-sPanY + height/2)/ pixels_per_region) + (camera_global.mdV[1] / REGION_WIDTH_METERS)); + // Find the corresponding 8x8 block - S32 world_block_x = world_center_x >> 3; - S32 world_block_y = world_center_y >> 3; + S32 world_block_x_lo = world_center_x_lo >> 3; + S32 world_block_x_hi = world_center_x_hi >> 3; + S32 world_block_y_lo = world_center_y_lo >> 3; + S32 world_block_y_hi = world_center_y_hi >> 3; + + U32 blocks_requested = 0; + const U32 max_blocks_requested = 9; - for (S32 block_x = llmax(world_block_x-1, 0); block_x <= llmin(world_block_x+1, MAP_BLOCK_RES-1); ++block_x) + for (S32 block_x = llmax(world_block_x_lo, 0); block_x <= llmin(world_block_x_hi, MAP_BLOCK_RES-1); ++block_x) { - for (S32 block_y = llmax(world_block_y-1, 0); block_y <= llmin(world_block_y+1, MAP_BLOCK_RES-1); ++block_y) + for (S32 block_y = llmax(world_block_y_lo, 0); block_y <= llmin(world_block_y_hi, MAP_BLOCK_RES-1); ++block_y) { - updateBlock(block_x, block_y); + blocks_requested += updateBlock(block_x, block_y); + if (blocks_requested >= max_blocks_requested) + return blocks_requested; } } -} + return blocks_requested; +} BOOL LLWorldMapView::handleHover( S32 x, S32 y, MASK mask ) { diff --git a/indra/newview/llworldmapview.h b/indra/newview/llworldmapview.h index 566468fa0c8..980ddf9c730 100644 --- a/indra/newview/llworldmapview.h +++ b/indra/newview/llworldmapview.h @@ -127,8 +127,9 @@ class LLWorldMapView : public LLPanel static void clearLastClick() { sHandledLastClick = FALSE; } // if the view changes, download additional sim info as needed - void updateBlock(S32 block_x, S32 block_y); - void updateVisibleBlocks(); + // return value is number of blocks newly requested. + U32 updateBlock(S32 block_x, S32 block_y); + U32 updateVisibleBlocks(); protected: void setDirectionPos( LLTextBox* text_box, F32 rotation ); diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp index 0a7dd17ef58..a2fd0f0d9c2 100644 --- a/indra/newview/llxmlrpctransaction.cpp +++ b/indra/newview/llxmlrpctransaction.cpp @@ -414,7 +414,7 @@ void LLXMLRPCTransaction::Impl::setStatus(Status status, default: // Usually this means that there's a problem with the login server, - // not with the client. Direct user to status page. JC + // not with the client. Direct user to status page. mStatusMessage = "Despite our best efforts, something unexpected has gone wrong. \n" " \n" diff --git a/indra/newview/res/bitmap2.bmp b/indra/newview/res/bitmap2.bmp deleted file mode 100644 index 770b07558cf2e4c7ce98f08e1a0a7ce3099b84f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25118 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 Tn48M=i5=wG7T0h3LdE|9@IW^$ diff --git a/indra/newview/res/loginbackground.bmp b/indra/newview/res/loginbackground.bmp deleted file mode 100644 index 288a0b03987b51f440e19130bd603a698f25d5ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 336054 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%0AUda55zc}$*@0f$T*WEtF<(u!B=6vql zB*3}vzFE$cJauZE%#S|2Xdw_NatT_Eqj$f14mqHUAHR6&rI$7|@tGYmju?Z=_%?C0 zsK-nrGg{wMT*pddc+~3}*TKsGN3Xr{2({+lF5^0k*~g17ZrpJP+b`tIV-Y}WYk&QJ zpE8aZSv;&{`^JUuW+pHJSzLmwuSbB#=)>^z)d&t5vl2(2`|J|&AtOiwN8f&C?PovR z^dzyw(Vs+&SI&=EAqQ^Yhy@A<MfQZosn1E+wI`5Ewpn)Zs^G}P?1`zQIcsGO33D-s z>(Yc$O1s37*BP)w1!F(mWH4fh00<C<9bFp3@{JVipY+0lHt>;lFM0QtTP8Wk1U`n0 z%X8`S2G_T~wFWTJ8Y2ifU=#HjN6$RH=JALH2XOs6@10{jdg4o(A9*}_<dNq5$n%Rb zoJb+0g_zELIU^7v)!`Ajs%$?k@Vdoy^av$B@KL*Gjl$4R9G+F$TnuoOCX`az6OM?B z-v0JkjP`*)IE-OG{Vgq&aWFq(++mPfUK-1#HWDl{pckSw1}T>WeV~lX-~Yg26y(s( zh;tgCQ2=DQJYCob@4Z(+;HN)zl<Cp~4;*Hx;gLs<y37y0ufq4;H^q7#p&gq6*xJFq zJ08Wt9UJ>|Ul7k>nId7#Ope%;1;N^UHC~ySY_HlL(=@!%G3I^RJY$=*eNuf)YyL7< z<jI+bxnxeUzbiJ<*aFERzcC)gj#({$5OyxaCeI8?*$Lpio$PC30?2sEj+BK3ZOjWF zLi<2fvpf^*s37|C(*)52onV<WThzEzNniz4K`Qy;G>WAqI6+BpBxb3leK>LpYApsM z9zgg(Jd|Jz1kA{GE~0B@rk1(3lq^;|>v#-7fX$xjBa14D)>vwonbkg3J$ldrCOP5- zF6gB}3~)}di=JV`Td`1<q$0&=0a23=slFr;?dujZV(!`lAjx<R!sG8y!6M?-#&5*V zmT&CGy2wZQjinwKw-DT&DcKW_;P+qt3*qQPA37o}j8<xbY-ncfPBs%V=NS+xBkjvz zK}wN6;`tE<%&k%yjWh-Gzz8{*+IY>4!9@~SW)+TC3`XAnevM6Ud;8R}W0C+n0glDy zH17vM2<%h!eg-7qZQdx6r4k6Rc-;|Ppe9H)J0(4ov^jB0%8lJY-bLw43b?uxut|BE z<x<OoG7>FwmE#eFu~RzMK=kCLz>(;OFBplfYtl6q$PtfhI9Iku`)DKyM!dF0cg-a# zkRotqL4VkxG{7abD8RX7)9I+LyDnf&xi5r<WqR*4Ao5;8N6zfULf`<$+iCD=f>mr; z=NX?2^@wo9!7BstAWyv`e`tma)7&72PLV2PkWT@~CQVMG7?+}UqBDllGKV>(BJGEu zEPp+Jgm@4Q<*5Rs%>jtm?JQj!VYe+_P80A3j#wqI3J^t7vPT@TP<E0LVP#dL55(J+ zENbHj>dij4(iw)VBsblQzxw|qq?w>V9>x)(h~4Je7la(xVTfwj-1V>j^}NQTw@w~E zSveC~VC;~z5acuGkiQ-xV*?oW?Ch9n=4{VQU!+A}1%Zx;pe*eWCBlnwl$s?004HMm zH#~CJ<sqA9O?(?iJU>b$HgLoyRraW0lis?<&Tv@p8!Na1=tqx8gT~`k2t5stKbaF0 zLXX%9dUD(`r)Y$dkVi2{CDD*OcPqYPz@iM;fn}<5#_Z|WIKri)1-3wAjaU&@hXeQa zTA;);2%zNgh*33Gdjuj5!gYou8sSkmgOMJx$J-Fl-1vhS`GFco5F@<AWus)*d>Z7i zF6avtu*=SGuOLitRJ$_yF^!ve;A11K`r4<-idIJ0_0+%-G!xYXFgq0Q5=R)SkC%SD z!J?Uz5}pwHVV1L~m8fM=@W>_X`!3rJ$uy^y6#}uc8qz2)ErePWa^}$A8IKMtPQc5d zxPKEkdh1&!8ISblQS8#kH?AI&w?_z+#07yPk7zTzxf3RVU?BrWutQ55Uic%E^A2Jv zf37hXMhNq`Z|<mQTlFQZS>2o|!(EL>l23CyVxt8xX^%%J5rf2&$9qY#(kLTm?zj#) za6q<cpz-Kh^tx+0B`v}tW<U`XO{(%%P_=_i-}0awZB}+mUr|^BjNU~Fh}Ql(_Absr zq>K>B^V*l=IxNtx!1l>qv;YfXy$(%f*ia>qPFC25fb!2~V|F0GM?*D~C&wPUtQ+|f z0tX;M3(*%FRu$A?4^V<&!<7j{JnDjSB%k}e$;65%(AZz6Ej^(E8q6MdgClyx2(84q z`7wlPzl0t+@{eXczs{Uq39Gd&kg~iR_t{3Ms4U*vfEXk|$PJEo?*PAdW^44+#>o2d zk$4G<9sAn28!wL_H+F!JGR2^lR3H1*F$@dV@2UWQbYz_x6eT63xfQOXW3i0_jZ2Hg z#M2km+c*Ls45?jl1e8!B2lm-eB3i(u&>BaID0_FmdATo%?1hB6@GJvLLZtHQ&}l<z z><ilEb6A;WY$t0FOpn$}BfoKpApu58w(?ay+`Gbfv;gIx;PBxwpoCR3vr83VFc=cp z=XDRp)Ai${yfi^3-Wcx6{dENARzWH4J>duh5!rIKGqi+D;`>9REZH?34bq0d>BfDw z*+4v9qdN}x!VQ8W4#IB`bn28O!0UT>6*)$|j37T5YvZ7%sz?j8gGfCF*~nwBojMIs z7p|eEQa-H?x$C?u|KDJNe#`k0EW}t-LB_E}p05r^SEgz2CE8rT2q4-Gj_eSyF%$vZ zFx_(D)N197E)Xvrwf~U(?wxa^x+$mS(v?9r?$mFCS_L%(WHZc<c>4yjZ9*}OVm$kd zBWMUC+~Ew(KK$CNx7|X6yFQnQG6F3{P34g|vii^k8nGKhL2$jg%JfkFB<&DSnCe4Z zrTSoj2Fv#QkaR7#$}Z@!jU%&Q$Ry=X{OaJSl+v|GyIr?zxnV*cNimGwsNf)Q#1PC7 z>G8;eDQEc;K2V@I91F*@$gu+`VkC_&^`a{|r1{e_axCtV_B1MP=^hghH5)Gk(JbB3 zm(SYl&D)^U3T}}A6F^PC6?hMwI61O;hM=z67etiK0KK%Vz>mNw=0}W8gm!Ami<SsB z+9%`^sUB`bbIc}0bA$?Us~Ir3Slp5$wa>(jh_~X8M)DZo2y5&*9;Jv#?C)RM@(qO} zERbmh=I3Y=L-NWM(<PxLf-z6hfdc?>IK-Ju?#kZ6w79hGaT$RzV_6m7`WD7Xf<t)J zVv*3~Wg=Eu7?g?Av~doYXhC)O%+}b+QzKqvU_@r|ff*wC%%M1dl3#-M3@gS3O<14- z$~n9D>>6azZ?Gn}K!H-fQEMz0lcT!mY!tIJQk4T74RC}TVH_l;!jkdln1t6EVx$nP zFg6<u=ENRU(1K-p-P?;rMg(`Gn94_5mr*wcuX;FRXcI!!LY%doPo44<6#`f_t#B0I z+tF}yWO(z;=$SJtHSp~nMRzQ@5EnVFV-CW2L@kd;1|tJg;)uSy+QXSK1$yGKX+@+i zTR0*Ul({0Sk%m&E*Z@Zvpk{zQ7>|r2mi-x$grf-Ugdpt)P*7yEAz<S&(sJnr5trB) zR%aZM25VfBXyHh;T#=hm%L9`-b$|zmnCy75E1r@A6HSg-uVXyoy<l*}cm$5L1aVm3 z3!-qWb3#MBS|0E;j-bCJ4Elpeu|tAeU2z16pbgw{mokh^3}FDDTIHX8i_dg7m>&&r zWE|nfiR&00VpOUI9qc6kVkFYo)aQ?zvej_%l$@-_FBxQ6%jTy7lMF!EZME1XEY$0D z3fShF>kO>d@hEM1NsnLvT4R!kF>}xwE#n8g`d#*0rlAv{0huyWJZf^MNgU%Bm;6y6 zPG!N)<cM3>f+I&nRsrmrezQQ!?S6L<am^R*!e?^<0gz!u01e1vwFgCn?~*#oBLjm$ zT$gd3rN_8nCCU}oo6}NV4XexiUI~{^Ys_M)KCGQc&l+r~FUFb*M{7IR>v#mfVC3ai z7A2B}5=Y(+*T)W_3i8?ooZppGGvX@A0twUKSogLCVrd+u?U8mS^uy!T;YhuU_#I9l z#oH@U)8DDp=3;=ObY&?<yOD+x{rIe_60u|qyT*|sACA;jXrXG`8u3NwVs9#Ks}KBg z@BoXr4ruTygulH2@vM6vKf!}nJv>TY7_Dj+^t_<$&*7p06VsW($wW<mX<gMAWI8G7 z1kxaCjo|PK;}J_G@%%_TIU6{Fi~0Izl#L?_!*%*G>rp-KWFh5Gf@l+B7%^*41wH&# zJeBEWlLUo{5K^a<w}{Lg5<>;{1`xx#4TPmPz;VSP72wC>;Y;NZtc#562yCbx@>g&o zbBYL|q=a-3>63&RIaQ)nvdx{CHT|&QUXUAI$065>6=5OJW`ozlRAE1GfnF#8gB(-w z2r}%y6A~mDd%}^{yJD$<xXz}+nYhbyBCTfEy9&ui7oiTZ<1{k}O9Q@qE6HdlECipC zGZJ8G#(svF>4<l>Y_Y$Nht8}suvoXbsdewp=BUN$d#cEReX6;ifgM(33QL0QSa>Au z-l0nLciVUjYnlqhj^bno7O+*Dt20AcYT5jnc(~5-G{+;Y+sDInzQPxa^BwqOfvl6T z>WEEx10L%n>||qOm`zukY-3**?bA4YMR>^vu@z}s^6=ur8=267NrGCKwfw0?;kM+H zeiw6OOJ7`~cMcR`N}wuelfPmU9S<7V*61ggu)x972TU<AMZPxU@flAvs27uELRN%W zU`>hk8^k~!Av8>J3u-xA+U;Ui4J8A0Y+6t)(@X+!fgQS|Q@ZA0M^lX>Z3c!ypu}eH z*p?|>Xm)T6?!+4I+A4tZ@d?c@Xv$6?DcKW_kRCW<JhC2P6M|t4W}zARlLND)$wxR` za&YMcB}wxqvBXq8$!I4inTKh{;B$W+ZV(W`Ce{d!SodbVj{S9P*5#3OrOGw71Ib$= zgvNev)=8KdK?aNjg%!=Dy@_4d#UCZ%PGpCpfIA8}M`j$naP~5Vt=i`2icoG>kT^n# z5Y}~{s&JJ1y;rptmoI_G;00bF0GTs3VSA#HGwOf_(s(m$hKU=5aY<S^L6yjeiJnVx z38$!oM8Rd1jOz7^6|p7T<z<lZnPt2gWB?-UDqOm>;2o;Se{D^>0$A<gAfcf)zQu<Y zG<eNmldR7`k5~u`SHd*6iLt=RSAlT9<TQ!}QnX5pUf_$n5X^xPB$k*3+k~**7zniI zJXW7XIXi4I80cg?;!}{w-yx0j<%i?Tw-68IFb)dZIHI~Z-8nb(Fn4xkdh>;U-hBR_ z&b;tXoHt+ir_)v9pPiHW6svAgEJ{*X2_65q`2xp3S2>;h`tI}pNIR;oGEvM4wWE%z zTXC5LsASc6bY0e^$GUDsVO&CqFFToTp)RjB|2z)StlsIaE-V(Rv=i!44f;^s%vZB@ z#b~4=`}v9&bEMWRjTip8Q~`R#CK*_9-~bIJ^0-;AAcYdKKz=WYpYVI`Pd~#Cka1R8 z2bYg=i^S!p9_8TYn^iK>%5<&z%-yK+871PVaw0$4tP0c(W-nF#<)<Et<59O0#Y_eb z{*Su+N;FOa8iL43a7jf`XtL|OVnoFtJBW`&#g}+dBT+^bm5AyURl57sqtC`U8F7PA zQj|msoi0o;ccXkoIb}=$cL9Z8L1H}8SEr8fMQb3B@7g1dR;RItgZlxXJ+<8R=QYXv zJC0xeEltI5t?K7i^JrD!_lAD%pJa6vN@gMpQ$UB>@wwBWf38S<)fMU8m)WV?bT4(L z8m!Z%v-+iSX9C_5M?@4FQe#y07D4nlJEtig8pI#+<1g8u*@v%ep9FN)e5qew##zOv z0{tbwbz#w#`E|vp5)zg`qCoU+jw;sNLRme^RAhv>nvyR&qUE}~Ql3@gZi)hGr=Z-m zoUd~zj)Ze4oJV9<1iL^gw~|Ku7FB&qEf`0Pq<(b;9O<VS7WC%SUU77ObsEoEHvX!l zW&9;N>Yv|A?L(CdgsC6|8N-e$p{AO6<XQcI7ddGF*%}oaW~ugf0-^3m0&m>S99Q97 zbrCkeU1K@BLyrt(1OQz_0)mS6dL1}&FE`XVIf5z+zdF}WDb3yme76!#2fwm*-!gZk zQ-GPHGBs+rTWZH;dYz-GstdJH_vIFJ8H%PD<CG@|%$}GX#H*mhenifD7?02?9`gLk z6e{jT()G+QZLbirJ&Y`Qr<>ZTh!D7iR?@r^EWe-ywG)n)GnZMwnOQeAn>i#be<w&s zYZZCAj0Vf{Wg2H?9I?~bpZZ7s4z0W5h~FOT-(cDJbxTW1)v#3=x#h;$D)VK~W65x? zN1Q@{NpP)b6?VGLseD(;JPWvPRk(6}s-Bc&T2*S_=tN%n7UK~CHZvwdf_S{bf&-H{ zfoS*Rk#Tg>u^TC_tNjmb>ga?nap}xjViHAx3(`m_aM6*f#pQD<s1j-2TIQ?A7}PT7 zABr(9KquUF?uL$NEw$r>(VCg2lZg@n_b<UQH}}%3al|SRP+~;_4d#}0eiV=v3bWiH zfgttO%&`!XypBw2rI>5-DN~DLM?6UZ-3pnT)4Euth2)Vk#jT2Ka<Wr5l>m3eMuBXN z1h>!;XC`r7U0IGtUTVk{55^rkLsVHF<lnTeb%wH+S34c9sW#Ejlyby=fgsyzgH(yG zu9%4|lS5DDxJ^fZk!b*SCJVL`HzfpBIPKVmZ@C>8E*p2+>PE;&9t5o)=dH2o{TFgj zLE?yIu?~*b*V|3K>N(~m4Y<?@wBdHh37LcvYn7$4EF#V+H*+MbuH0IsYqeIZl5`eu zkELGRg3sA3iA=k9w@*d&9(|EuJnG}ha_PH`Bix`5qX{KmJU+u3S4qr`kWL|3ATVy; z%Y2U=NXb$a*&+Fw{vG~`%o0a#ElPHLz9ekj)pCwn9S3M_x;xHJh_<NJ(6z}(vJ*$g zkFy5L(op5lPyvU>BXGo!WM}BO&W+qSXWOJhwL0B#ag{)7EpRFIRRB?1Ikjv_sD)z8 z&FUm1%(|Uy!E(q(GT$Y2u4B%WShU%}CixVLippf+uI<WF1rF^PlJXBt890ffj4LjI zqZ?y9l6>j`H|1c)bxw6CQAvi(5L9LAS&V!&RY=uoH&Uf*mnHdU<7K*N+#MAqRfTq( z;|2@6s>zEk+$qiq74Z8_;E0DW;3!ql14psWP_U3hzPbrB+n~YHHm8x^v9y?lxs_#{ z>71@@Rs}j*=qNP1Ad!t{gHD7xbk{v9v7@jkNgQ=m0XXuIlsIxwSAxh&M6-dTSAV_E z%vJ_jdo2qj&nayQKV(u$CdK7q^(_fMbIKvf%@(yZ@u_Q7iR?x0vAEkNi5wLu%2b_3 z4*57MWX_MEoj4&JF;Pktpu`OAaEA7W{3v?%a^oaYK2<Q_furV8bV@JM4hIr|@g$zK zWkQbS>02np`IW?KUz&v}=5{!nfbv#$SJ0+TvrJiw%!;tEA08?Jf%X(BqiaJcag>9R z7mLazqgzkT@Myyvy^3cuXi<pqTK>+LB<<U41eK(w#8j+a9a6=*5%OK8R$sa)B}#C) z7qwIPu52gUOw~6^av2TQ)N)x5C_JPSj#h_Hob2GpPy$B{e~2E-=SOb#MmkGwaR3$# zJ(63^yD#ekl_V|ykZRUd3(lc#3Rz9n!Y4B-R*l!?qhej9tms~%YkE;fbqiJdF-X<M zz`FNSkEIIIm1T6Ddo@cOQ6Bi<2J>(WuRA$=gT!@kEkg|%){^WD<sqEPN)b^d-df<D zyB1yO)Do`Fb;-Krj^f;}Tj(f-b}HMDIz(9H2#L{@Ni7=Rp?z1OaL}nUI70rcFq}N8 z7pc$!msSB@t{jrAN9IQ+>4rL|d@2TOFH!rV4o0$MAtFOB1RJvTtq{?Uc&{Vj5}UQ; z=~}8ug%-N5q+RE5Nim(B6KO8980!qB3i1I&14@abHi(QS@^522x^eb1gm5e(OTbn{ z+L@L>W=f<XBIj_H&_Y~wj#2P)J0g`=7s@P@Sm`%2v%9hp(v9A^jAo^&yk$CFG4iXK z0?rDVv%+xll$Pw4mb7+94k}>Z7omk-NIaqqliGDWb>oglDM^d56q?etrkroFSSF;A zd8My9mb0M3F;?T6bFw1kbM$v+6v*K(YSl1tN1WAH4Kz_w=VSqs!Tbm<#A67lfZbUf zsR9CQ2Y4lp3>?(w!<V?k+c#!!1RTMjglrtuVyPrw<HC0()dD*WiCGIF{0=%g8V@a3 z?bJHuvTV>TNcd<lIx5r`c4G2^+JfN96^n~3P*gXLm>HegsNViKd6I94Nr~)W=c&3s zsL0N6^vL%p6xZ!UZW8t?CQ4CAL_2LY2`lpD01;z@mlRQ|udGtHQw${`N$0yRX%mwz z7cJCit#v`+tfh2KHv1V)of=(RW0#}687koY0(Lx>Py$W)XVfe&;{!VffFl2njkz0P zUr-9xESu8~@AfCP1e)3`q(ns@wBtjXsw=v|x_UJ#`L2r9;&sKk_qtdO=WLloT}C>s zo86H~8OJ;b8G-X2;>Kx(b_`5>i;s=dBu<>vhE@L_J>Qy+7?0R*y}?M?@2izIk8oWx zTg3^GTIcK#W6GyZu)tN+it3f_%3AGa<8FAZLSK?q?Y=xGrK0ObFB-P8sXF}&;yPZ& z;k`Bn6qZu`CX2t&>z!Hz1|0bZUW}lX6_$*2_>%lP8INv=b%tVqF6<NGq*Rp-(Uk(p zu?FFEBpE_W+4`32T87y|CF)c`HWGNu!W46B)_$)}vkNN5Q4Lb0+4YUgiRd;r71{|$ z8~UszP~v-HtmBaYO;)1z_OIQD^CK8R$SDn9a<0W9u1g_UXwIRQD(-B-w@Ss)LLTK^ zwOrSA0k_sD>|Q#V1-0DDicWwdw7{elAP^Gpc~!ibKl{&+<WY$*JO3IWD$#W3>A4$d zok3g!s2BpeKqk~w*gVoegB(?r&aKLTOGT6tu2oQV<ROE?%8!1lv~^dEapX&zb&d?6 z_Ip;1t6OE(yQ>g9BX-{B-8{oc1dfJSZQ$^m^5N*JK;6rC#C2}O&E7a?GX*{7REaw6 zoa!99NER%FN+3~%isfBjQb39NR%lioSwZfLvkw>M+$it6?Z(L`Q~5DFqZT;gBUJb_ z<WG!!;sik*8qsSkx$*;=^3T9oU1grDg9L{&?>uuu;3&C<S;;&Or#tNXmc(e7<YcoF zEG1Q?E|7AjwY=qyGROIK?-c8_S(Z$NmgQ+A^;;p)1k~M`7?Z(xgv^QP&YV$bXDwI- zcsa+|xq`=>_r~1MAfv6lx<z3govs8P?#L3WWEf(xY$;O}%gowg`j%CXJgJ*%a>5ne zm+!i8BVQ!#v>#Uy0q(1|5XE&T^-dxxa7aLCM^wP#j~^--O(l*JM21oV>J6JW#5#in z9$P?3C|z?ZnH0LSsB5w0tqx2q(n7G+t-8&QY7zpi);hhbyO6x}Qt6$$)w)Eqxno{X z_1?izr+09K%!%l>wuVn{vW!sqv|dmWjygS>q*wpkVo)kbqeUPoC1+af$`5c^)H~8O zk1j)j$|HrqX|1aeGLypDn!9$7wN52}3e=aC0Lk&edR>kw5wj^INN<*pXcI>XBGi|M zq4cIRHw2EvZ{US<gK@E3WFkXL%)%+;-;q*7Zfe|c2za`q5O_z<DSt{P#LA9Lp<6Cm zt2+&QaQV6^K}^I4{RGcQo}ljhg^{goB04Do6`-1g5&;HYkr)GisC9-QyVFRG=$-6T zmgZi3rhqMtOB3uWzRYuZw=Pz>3yY}Eta*&q%pG;JdP+$I*EDC{YV)dZg^EjJ5VadL zn^CKv*;1{!P^ZCKr|aUD+KEfkQ|{F_G0v~jfos<58Y)2e93_-MQ~nt;iJ(l7e^=m$ z)g%IVzX4sPtJkr~)SK7J<aKPno$ZpmWUWMfH{Q8c4u?vTh*!U>_pGCFy<{DY@OJi} z>!oZptBO%8D#nZ0@fNw8;_Q~Ix@x?xRlnt}GSO6#P?@+?<JH}uM+E4WI*J#}qqRuK zE#+5~$BXBF{XDAF#Q$T(U~mzc?yJK{-8(sYS3Mg1N2Wy=ZW_IC)5uMiMmIJzBqfwk z1OdkJ6Iyd%8I}VaF-78>iMZsn#tkx$A3q*9JH=R<;4ax5Q8><#xw8?~i*~98@^0L4 zrV6Oc&OhZSGw#J*rzllr)m2ooW}&9E)0Xbm6|!!bP|;@R$}9fjcGZX)^R28z!Z)ji zisD5hl<9c046qYQIJ5?itTo(V9?rRYYxbV4*}Jx9-@G+<_twna+tXa$y<Mfbd)L+s z2Z_5WaAx{VTQe$fW?F@}I8%N4?rjyghx2x%bxC@T{JS`|rtjLCee+qGjk;=c`q#GR z)pA|_o^9H6BXmTYGxwa)nRX~f%Xgh2F~=cFwoMhiSKUPyE~6^qC~ifqq+ea!qZVjq zCcCS++g7FzajF*PLNekpND}>#7ClOcHFXz!>5Leau9%Ww-vp`KlFU8ZbF9?ea!cUo z<`HH|mcLybo9;F@St-(n2S%lnr}(KpjZOSi4Ze|}op^(#B-WHrYpf|%@1!#?<`xG_ zd|q+#&j(-t{-6itxyzFgYLVtwZ*&>Ik;)}yICIIWZ!E%VY7i@j8Ww#pT%JD7LYC%q z+uNfjP7GbTW%Q<-M+i{QoEd>~GP%38MHejTkFb&qBP3W)h6N_?d;*sQ{o)^BM?cTH zlO4E#3=W8dR7#ptXZnl~PMpy9Nl0*43j*;QMp-6U)=*9trkq(Plt91Zv4j9|_1SZZ zt}`ltH3tS=p;V4X*+>IN*#h0s2n5jk$&-3Gg#_3SMgqwo2cB4=WzM)wbPcm;8FBeZ z7MJp<$Mrj3q>sYF3Uzt&UFrVEQa;u4vV6TB0?kmnbr!3mmtoZR`a4E1UK%AjI(Z5r zhtS>DHa>i(Kv+vzLrS6+jvxubpvr_nEhNDLmry06MfE3ZnwMFQRsn9ovN&Q5hhl5P z{GKLNsE!S|BAHN5nsdcMP5)}F=cLS!ALqw1h9DIdZo6&tw%3iGJx8Zvfqd?sK0UmB z7MX`{)HF&<;`ELRXc<Q6ovtAXjX<F&IXwyiBpAXtlMmSdQ0%}X;6i0JFS^A@x2`s6 z#9VVpMd;_Q8r)EWq(O8n$n#AzVTbhAHqGks@%Gt~bLU5Hy$u`<pFclx{=(??_VC&B zG&_9m9JN@D)VI-CgybBQhy{QN{m@B{1O>RvPS6Y^^bU^*7HLyP7R664?lc?gkpiX@ z7NAz_tV$hyRA7S#{)ifZLnI#H`~{s!lW7$gQ&Pd2<O3YQf&;v($5AL^<MikT--|n; zt(CYMcqhHJH7XJ5!G|&>EA$v??vgLH#$_%4>e89L&b&>)fpbG695Bd%%CI+dcgw99 z-te7o9J}?l5$y1$i)e88=1ZDr+<My>1#tD4qHC%827=<pDb(h18pI}Rf=wQzazKn| z7W|dgaU4%ICdkCC`Vo(AQ4z+s&yKky26JW$1E?!fzM$VM5WGPZv@!aiwM&<Tpj&Pm zdBd-bT?*pK<lyf1_Q=hbM)8pH3}+E36-PEUBydwAA~StT1Xp4wQE(@A;;w3)9NvbP znnDt2#H!>j)wy(=aKWV;q!@^XH3%>lXSSpTh%^_(r5A5O_%cNwXaO$J5sF~;$H9Um zTyv%obZV+-6Ff?KL36TGS(MEtC`l7i;rgID)(Cg!&X1Eo{<H%NsaZ-we40?I07_B? z7WjpmhA#&Frrau^49Y@f7?1XD>C3%>5(8ZR;Z^J#IUAn7BtOTa9MJ$HjM#TU7-NbL z;S>iLk35|2e^xDmfvDB%oQ+db5<}^TqJ|Q(!sBsBk6S=y^!D4a!_l+nF+2@V7j7Q8 zZ~>7@Wv~y9kRH`h-?{T+@lpLI{k<q59|AT`(^14QK{h%<Wm$y=`G6iYlan&3SO~G0 z1({9F0#w<kP!p~|EZi~ry4y$3otIg1K)f`#$=CUynS4guu=cQj#G)g*OEPwuz{dFE zAFAAC`D6rBwDDUJ(0~3s$P$r(^x+E^hA-SKcF6RBDc*EZWf+@KRw_bZsTnza22EAc zD@od=MZw5v{o07ms#4fhQl3`SPyu8kWQjT)S~y{t68xRXUCN{hp+34GFl&!TC6p3V z38D<@99TNSbf`(ZN<d50&5xw-?~ws5zaPQDt8MOGkw%2ID+G9z#p(&B)D&Uu@e_)L zbnq@uz3@e0bHNa=kRV!9%k?Y3B(6yR5q<TdQ_OX<7PE=+uJc{S^j9oIn6Vr&o&vmj zjT8@tzN|h13^}yp>=cUChBbmW1(^h0a)UMf(O@;5(Ildv?TYCjtP8<iD<&6hMZgF_ zmt1Zzf{kH*TW969P=vX#bEW_Xj8x`Sa3Mt?+gcr6X}Dsh<iArvRH-N@vD1VifMn_y zg0%`l)C7272S0``NJDv=P(}HQqC}5Go_yta)Mwq>EPDu}ZXif=AEt8kHzzfx<Fk`~ z$jg~MV3~$BiY>&>f8B}?*ZYY)=X{uzIb9R6)wX(L7s`>0febwrpjKpT#5~002qD}N zIMO&y8ty1oKFWk(SU~2q98+l#Ov1f8C(~Jg9MV35B(cLmj&IS34=xvWa#ym@px-Q5 z1;SCi?k&r#r?=ddgAE*o<h4!3y}L&^V#^S{n37Zhw2^i`XQ~Kp@i?AK?vnO7xg+7U zTXtb*QYGXs?Q4=7yJa|gN`<LFCx!<X_%uM&C#tb0&qV-J=w1%!Y~tOc!3E`|30dIK z%(z2D$C-4hAWeuW4dN3=mVnzS&*U3N?$Omz1RIS)acqB;39$o~QHe8Yb|2~2>Lbl> z*6TRxPY0_Q2VbY;GqAiBh5Gn0anwY**U=DZilSkP5Q(E>p01$ooE|_Eco2Z$8zbgt z0Y?%`_96cGiRwGFe2<#XgG0>fs(vrYiP%FW8zU3j<MU<Y`!1h3B_{}D(#<qhERaJQ zU~=g%b;GzfVl`MuJwlA7nyvt9S@#A<7cOc_o*E1-z=$T-Ovzc;Apqd1I`eM3FM33< z{z5f0&@X!7K&s?Z#sY^D$fFnqpjo<zlH^c8#IGO|X{Ta2*hvMM5#HTkV~n)VnqDmH zfo={hWrVeWBZWz4DjeCIz?TiFp$MeWMo=$fxR(4<3#kIEsG)-JSJhGjDgZ}GIcjoY zW6+Jb*~C%l5=+L-JJnx#dF#nPS)v73M>Q|KwDILHFC*l;@1Fc`|MlGO{q7u}&xO;^ zJa+Uy{cMvQjxT?CML+U&WcblX7M*kH(gan!$M28-SeeI<^NnR~`Fr-+H7?)y#!1qj z{!~@|d*3@j{=fTotF-*-Pb-tPO=$R&CzhVOyk=AU$xEj`^VlL}GY5R=p@pCSP1XC? zzqZ17MCkrsUfKS^4^AYAf(2P1=0~$w4lg5MJpRtM&t&pRZCTe5LCltBI?bljwnoxf zp1Z!K*M(|MokL%#O^dOiM<9RG%}nkzsxpHsHHi6zp~}J;3ov7jtutems?Ug>->-*L zUq1Qd@=HHH^@o3Wc<apg6HhEV^Ocvk$$=vXe(v%*ng97eZ31~Hgi~G$K-$zw#<`2? zO+UJDBTqfG@{^Y~9(?dHa7GLN&rdd3EyqZ#2yBl96H31AZIgBdFFY^Ja{R|1oOu8H z=TOA^-Z#hPBabXvAV`M8y&UK{RZu$Q29%%~1Tmi4l^Fshh^)JWKW*k8YD%wYui|r7 zN0^u{Ex<S}5JDhHG=;$LzDqdzo%hb^r&{NSAAIo0``$NC;{3UBwD#zuN6CNb#~a`H z#wwcPi<EpRosYY+OV(iFi2&(0yg`j{kf0)oFMe@}{7-#S*!l2>7TBil^56~{o(LRa zhbRU0J@(ilf$puhj{blDW&5jNU50oJ^7EfR%G~qPE#rUlpEsX>Zp}`hX1@assN&Pv zqD_Q>2z@)9bbQereg!4Sh8PYNSW*Gfoa3heb*n0N7;_Rk&H+kJbEaZih>fQWB^Jb3 zu)1)w4lvcwAR`gs6Sd3&KmZ^J=e_TpGx5-a@X2}q`{wZshRLN%hamEiM~>cd>m)S% z(H|bBz?<GQxp7(;1XFx#7viCi1jJvyypFQCgm`pE8C1_DDj-c?y!!O~^8(=Qub(6c zdH%U|EP+Qh999H@!NrTh(Ocg-i7WV@zq|w(U-!CkZ0x}Y7w)-d5=H#xZ%$JHM_R%M z^62Q`j@_sLgNJ4U16FuAlO`uoU=uP5P+}6FI0BL-lw7y0ZXCHTXFhj~w4eNwWj@ww z2)yV1xv6+h6Y~qb44*v<j<x^-pXmSbi>E&MiACPj&~FXI_Y8Ua=~FT2FfNe(#-FWH z7}?%&$0V1ezx&-2BnYd>q;YB)Q{WDReBw(>m!DmOBUqFA9u<xre_VRMc*__T$Ve2X zsBj1iv;=IxRENSCI4V02T=VH{eL_U!#Y-i=G|f(PmqZ{%AJrs{>2i>EMWJbt-wjj? ze7%;>+S3}B93*^Ln|6#K!YtS&f+HS;G0QWKN)6&J2<IXsuGB|gh(f}7kA&ln-u`yk zr)7@NNF!bmP?G_0$o!4pm_2bqI6`-5#PrX_Pr5(*?RAtD><s_xXBvz+xP05&)bb}k z$p|w1{`U)0XU>ch78*y0m+6uf!DRgA8b>JNl~=aD{N*LA3m!8hNJXHFl#B(%+4Sto zIol+W9oeB-1<1ct0dzt$lLDrAEK=E(Svxi%J24|DfuA^n!Gx04XU5Gt9U)9i*VVxe zwnSV<w15_{e588+{d2ry%RvbA?PscS{P8a=ITO`<;uDKb^K}RxpZK`On&qWYj+bBF zdM0YU{`HgGef{l|-~G!fig4pd6(y3!FrfcSfg{ubZK&_jM;9UcPrp({FBJ3f!4J-3 zegr}kvji+di~$xnm&!7EoRh-Lae{Bu^NTs4gM@PcpnnU-Rrm#y`Gpa;kaf#0Qk#&` zh7!XKYuY>%14_&|QUz#`D2|_TVIBv|X?u1uNZwtz#|Qpk;b%XsB3p!jyC5H_TAsvy zj7`u<K6jCGGE0J=u|NwizIci%zx{5(kV{n0C0#u5z>bzTHpUQO9S3$4f$b3tQ1`z3 zCb!NgQ64Y7M9_$n5f^EP4eXc^&X825OH#{QS;mPh=F5ist%A~<VH+GFWT5~<Vkw>} z9%s_MK$O0V_VX_rF`8VLb2<>?C^ZN%K;!Yp1rv`)Xw&q6{p+hQ|8k2T>*13`dA#`7 zr#}Ai#k_Qa93)K1FMNK9DsOp<Jl^fMPx`J~17c*NQ#xWqBaQLE!k50dga)k<RKxs> zrQpwgRt3(U!`_D8@vqbx=Z%d~i2wfgPn5b##nEhvJrfN&ukJEibApbnQ0oyE5=z#i zT^Y;xgynd`)L^Or`t8S3gSadS=eH}#XOAZM-2ntE0%W0rk`eN$o6^o(&pf?GNq$e^ z$1iShAah(?woC#>&^2|fh-bg;`IOw06#?a}mQdg=_f3*U_)k8$ge_rXKluI$D}q@7 z1sFFER1qcFPWMp(<XHvK%wr}VigC6U$hVH#DsY2|qY{s85K$dzz_<_MF@hQ5x-UMy z40-rE@-IKT?jKiTlwn$gict+|etC@_ZhP^?4N!x-BhA@bGmZ!k01;3^r?g|u0!HJ` z#=x15JbpPo{N8s@KoaUOZOm99`{KnhmK6S{&n|+a|Mi=zgynd6;yRo#L0}qTSTgaL zh83EH9u6l=SPVB6k-p2>Kh;6PEKnYPDak=56|<z};HL5%<%L;G-dHH1WLL(MO`f-& zI^A4g#7bEl;NaI=s7oV60_*FF&2Tb7mB>KsfA(jq@40`TG$Q3Lcp;6r7-b-Ab#?54 z2M$A(aYQU(`ng3h^1uDeI?4i@)TNz2{^O%)hkO?LzVVG?9{axZC5`(82ABcf4DqsV zz@iEoVXk!N9f#igJF^sEJYwM#5TOVLrc0L;=QAgQ>woz#<mDnwzr?+j{Q1?$l-Rx} zdZ_>t;xGgZCCH9NZ-SQ2P(qo~gsexm*}#z-NgScsgdq|jltP0xLVisNXZ6IFmXW|) z?vqSD^{J!4=Yt<yICg9tt&zh)0>z;kUs8Zeep8ZPUgK-79$)?}#;?Ui_LT`ooVoS; zzrXO8e^E6;Kw^<%82D9UMT(JNF5nd;)|UVaPbAq|@Zk^7|4ppd5$xUj>ys=>cx4_T zcrdjC#0U=`Vd5aIP0uik5xV(-IWGCpLw>A{-|2%$tcx_ie5dmv{URzk{x!fL36sW_ z_@zsXfktGpx{TjWt!@>AGF2@0upEW!jxL}Lm>_CmIo9ggTy$nzkM&VUssIG}CwN%p z;K%HsoL_}ot8rwKX85tusS*4ShHZg=>|?~z!{pz2=M?C0CU8K)pu?B=Lx_j3xp`6k z?6b^|HeUQ|4Mw!~=}!qq{vk;8l`S)r03znXg!j)qx6VLAYn<Qx+p{d+k^ati*4cf> z&M{ospTAHUKu!%5SF>C*r#P8IzcM)^72u<gl0Q-kk=K6E6h|nlI`>k6P2JwiQ2}SL zU=^Ssn~-BsTalZh@%+n1&|MyGf$ALK$O~wOp?{PRn}K%@Tb+J%bqw>6IxGQl!h4UP zl+S-|$@)TNzWecy5i@L~CT@{)@4dn!IP#A_He{HhfOyA9foP$_cF5Ce24aFDcAfdd z6wE1DVc;1@TLRF`uR%cx%|amu>6rjHRtNo<5Y)mBXO7ufess7Z8?O10M3cwwnZhq= zv&rwa>oR`FmhxGJ0;$c09?KzV?byin_83zn4pzC5f2tsW2KKdz7)lh5Jf<*M*F=gV z`VydmY%al(DKx?SBqgLm7>)~Rzw2Fdc584Hd=0VA;OW)<_s>%d_lSZh<CZxiF-qF` zFja&e)&p5EWX+r*iKP#0kC_FFT?9q!XJ#8JOL<3P4w8ysR9#wTdWH1lmuM3xO-)PS zrt@0P{_)Co3%gMPK!AQ68uW7}ZD>GwV=zh(L45w%A6jvCgVrF8xCP_LFvN^6Ueeg{ zz3-k3P07-bIluDBIj|$K!%qBUCyE<==IQmXeQnjs<vhxde2xq`u6y~H+l+2pzVn@m zC2qY{IBFc0NhybP>1l@$9Bza?kW8X+cf_|W6!X+lzW`MZMo2(7ny+jFdayLk{M;%X zVQG*@8sZ@Xj`&Sg?j}iLmZIM*`<9A@>2lX4Eg2f*GIff~Inos<x|<oAt6c&1h7;gv zG8;kh068AT)(DmzMi%A~vfK#2w#;~X?3m)ZcfE7Yy(4ERCk+h{&lz+;6$$VT#-Sv5 z5jzz4=}$L_@!&Vyf@)Fh+uzpM!FWVT$~^w~GQN&7G;2oC0w5wP<^Tn(w1DpTwQD_$ zV+9Yfvmrcjgf8F<bzn%w5nOw1kQUH_y)k&V@3Qpv{oF?d85I~Zh@EXt1lXJjauP?F zkOw1d4;7$9Ym=7q4+dS{Q1Y3a9L~TI;?3htZ<;2ULGreul527-bAH^G!?!YR1o@Kj zhz39Zxn*De)^7!lZkf!&WwVw;+YVC*(9F{!)W=Rmy(7TOENrch4NE)<NgP=MXf1I> zFVVQ{gs$^kCNd5E(=%h7T@p??l3-geg*ix19O|IY^p~z+D%RMOengGEF*5>6@rpz> z9$5v7>-2<|DU!lb=%1U@Iwt}IM{Ycc%mjo%9vZRO$p>p9Y+@vSa2dv-Uw6&U$jI>1 z-_lwux}Y$}=RV64(6(?VCnJs1pu>!G2pJe4WDJSbQEdlhu`6EF070k*TjCZ#vnfVQ zi1A1Z#*rN_jk{lq^xDsE&F8iXN^cB#IhtTU;D|Fpjw$DEnh>>05YcS@QOr2vY_5H2 z-Wx5jbTFeyx`v@t(6zJNtA!MW<&aQn2mylGea-V1y%2O%x??cHJ(7n0h9^OT1V7f@ z?iEK#EYQDAZ)(vyIY~J-iM{2e6J6;C&Zgfu!oW}>dlmEuX=~*4rq=4M2=ckh!L|^B zC}tDXl@KPXVJ_Qm^qZFys43yMyaghT#Lh%0F$;H1B;!bo!3#7^#1EtzN+ly047Nu^ z1eA!bV^oFgjzjho8|Y~`i<v2HqS-5Q(Uq`WW@h94O~@z+%kjgb9Uh>80^6Y*EOBHo z8a{dMiX&RUuO{!drBVIjdZn*@Pn2>n{Slja(W9CoK{Ep}yHXj6l75(i1>?v;X~UDa z<$Wi(-Jm<N*r6fm2S*&nku``XWRbx$Tyl(~1`AXlD}FD#-Q5A@lw9;u1T>=vaAX#& zi&TVhWS4GTSSHs&5lOtG0(!SMgCxX@3U-4dD0fIxqM*c)8%YavqQp_QfHU`CWPgrl z14<6gQ6I5^LWO{p(_E6^7RB<`UKQOIg56*WfgSR!+7Z<8k{x3Z^m~>>MAY^q#6_NN z(=1fsV@;~55|I(=1kHr0x^xa{AKXgr%&d#WG^C45G5wrJWBJHRbVLM>kTaG>WX@oE zhWF7<!@`c0B0^K<@_ukkT|zr1<~g2{U>wYm5q3Q2Kw%PT)*#Qbp=5`IX(kb@Rm7Xk zk&uIK#Sj)6)G{W<uV61`nhcQ<rxB!Siqydod&1-8_jnG@G)jtq5hh2*QE7@u#uOgh z*(xw>ODB*fWG&d6u^)z&M*A`H?Z+sYl+!|bfc`j2AA+LYf+GsV=rvNX!z>B%(3%4V zgmCB(Av6mw3U4MRltv3y2O8v(0#enGg7c~AF%+F-l!=Bs8$t*Tim4O=i$%Nzws}VL z+=%P6pOZ+5$A##ZV&!-Q3$t@tf)nv!fg)xK!hjXA86h9b1;Wncq!OG-bC<Mej<gFi z(I8>FjYjYwG6||oO;u^<&=-;~ouP4LXNa`f_PMz=rdI`HodG4{4Xg!J$!v(Y&dv~5 zwy;pqk5p%7#sWJ+4Sk8oDelUBnQ~-47MJiCcXftl%AhGTTXITa?wWn`f~?FV3F11s zV}d3z&W^C7L+jW_wM)6g5j#nE?tm`zd53rf0G}3E+bxbtd$@|U#a^DR0<_S;5f+XX zj3Z<Yf{Y`abBTh|gp4DbWzt3q93F%6T(;0aB6CAzh*EH6=)x)pJ0t?HOb+@<b68(o zQj)_4N!R3{P0oG(xSK~Q1pD)yIEv>lyimE$0<63uT9XpvrGN&GFb3vFP(qtF55^R@ zfSSNXWn**=!4zP@3Q|q8*)+}Ef<e-5gff$XohV6T{59$Choe<i7{(coc&Rqm>#POr zlU44+i#*tZHk_4k#E9TkwVBy578nf~6E-<H=1~$r!KRlVAx3l_5<5_4a0LM63LxIh z(gLFohuD!!w8}>#<`Ip1wZS$3h+^4|r7aSk$5nA1ir~xS%u+p3#lYBGi@PhWF<p8o zDAN1&*J##e-v>uV0mCRb;tY-q4OnZLP-kkB)VgpY$cZc92z7uX4Kb21GS@l0I{uA( zSU{Di!}(kqN1SzUNQ$#3OfuSuQVzXv<oN|OGp%5L#P(E1B93^LAqUt^2pt?j57q*a zrWukTk4zjj^k6?GJ4hBN5=YRFDN<3zf_(<E3P<$_)uumjG<m2qzncpu#u7c>=-?sj z+4Fqlp|kFdcEFJ~r7tohX@LtgX_;$^m1o05WaK~(J>Up-NI*QdAPj1`w3^6)FhfHu z#M%gDLIP5bi%AGlmWFI{EC*@<Lm(W1u_8<!1NkXZ14ldpV+E4v8bvT3#RKsj(P<eP zm4brK{rW4L4ZdJa_TOtf>VqT9tn>iaJ|0C}r=S9hvPMiTypurMh}uYT4w?Cv`Q%tN zWlk2$gj@Ex;Y=EnM8a?4I+pA>&>io%)!$+6;3#K^Wn4$&w47v=)Ivsd-C+Qlr>0}2 zJ8ofkSXxqx(;(_o3)Mg-XP$>Om^gx%Dz2+%xL6(E7GN+se__0VBfP=N${6Olu%Kry zj7PMCJp|?I0wAm3_#*|rj3Y8SH(Km)Hvxz?1)oD2dZJdRVzS^w*rBFK*pdTm2qUiR z;E1nC>BA9Kj9uYKFFz{4W-^tEpplXbw;xRG+o>eJVL~PzEo5BR2S@up9(j`P2@#TS z@?L9mUj)%d2u&R6<7OkQ7^6Odx`^mvqO{l@M_y+r+rJ{guxj^CE&nn8l9LrN-SLUy zaYEe4E{r3aAH*9+9!#x1XlAKon@{m<5)NtEfw+Qkmb*;PBPaqy3<PxASu)M`O$L{c zam9f?X@-6y&b)YHn|Cvjy^tswu_*!&Kcr*agl1N}!4clf5AwXuz%2&`MB}ej9KoYi zS%!9f;yU?|+8Nrk?8H*+`;};@&l>cgoH(*Gf$~&ea*-@FoXK@?gDHVzp)@}eZ%>%Q z2mU;H;jLbRbH1d}+0PJ<kZgohlo9sEk@~G+o-|y0BDrYeC>7Bdk8;V;uAmo=5DQ1y z{<TwEwotb0zU<0!Fs-73SZCP%c$Dz~ZRTI9GA)oq8X<;?9p;K(vF=US96?2_YZ*$8 z*2*+Mb7;ZNGtwpE%8(<8DHDB!km^eu@ep&9=ddRgig%WYmUwolZ~}293tA+Zh8XqF z8Ha4L-5sG0mnOsRngWm=g_&*;%_?9c$7$~JM;d2Nm}dr+MWHH`8lpX9W&EN+!vU&1 z9wBN3uJLGNl<y^OZRyjgY)Z)`JG?#bjI*E3&YX~d$v&$G9CQbfF;mk}h>%(Opl1=o zYG_PCO>huX(Mg(Gj6r5x6=SuWOwy_qlO`JXXhnlQ-~#!0eiUm>T6~+)o>h(e7*dW$ z0~{Gmy>O(-MQr9IqLwb|>9*%eF<q5%5xY%`v@cOHiO{JGj5MoBR43i*FV#l^4cZiY zjYsUS(}x6)YrPJeWZKS|rEiqmz!BIn3pA^>tguEeQ^N(9WI`AeGGQm-RWFEyE2bVv zGrX{{Kt5*7VUB2%Kh`chS27DpJWz@SH-Wl=BNmF!o*UmhGqQb7+dHvChju7}W0?=C z9I0@$u)tCSi*>vRuTE!X#yJ}`bi~dj($K>h@;Gx)z;uREq#fXf`Zy@bb+9kg=-v=+ zM>8xl#ihC6jObV%<P4Nz#Y3ScQy#D9{0ibIq=kg^x2N$4Ge&@*$;+Wqgdei#NlG<Q zwb)S^w?c99a@HCOb=Og*ABd>pc6?4#?1dxZx-(nVx;Ib)L9Do1zik|8-8&W)fea=g z!wC9q{Ll=bL^CWL!f2yt&=UnJvbnVrM_Ol~7Jp#PaBC3X3r7q+;OP8?iF4=q<WUDl zIVADk1ao<IWC1|$Ynq!MXH*i7W`!dQmhPYyGN4T!V0sJ+(E?E7mar3pDHKw`2h5@p z^Of4cfgG9~^Qc5&bHN#K&CZQ8nlr%+Gr$<MUgxM_fTKOlk2*MtfCqq}2+k-jo@hw9 z2%odDLp~~S+J$XtxgN`9*S}OBi7VoWk%$lNVvT@^hetZ%%TYW)?~bEDGzjvVNw{K- zq2`54NP-1&pgGC2-{umgutVP>O))MLN2LAm#VjQ8W3BPXk_Rt5wPc0i?0G(pJwc4h z+lb{9iG8ZEt(wQ3U>vZpKTTk#Wn6&}5#EgMz!5_~^h5xl1b3m3gIg3Etuf_s3YEbQ zj8Kw8s$x8iP=QRV(p+$kkeCMb9F_wz*z%3D0!qJ{aa~BOvW`8CM@VvRzFPN2&X%wn zB5lcA7i5-q<FfMPPRHYkPL3NX&#vxsnqsf<2pnyl9rJTot$RmY=O0vU;3&*s97d}4 zW0vQB$tnL_AagJ(f+!4<9ByHU7+&5bJv~#sjsj~egS)yZ=geTl{In6*8Am{dFTHPV z^EGn5Pd?tj5wj28lHe;qJU=>oc#IYxo~E*8NHXQ%YHkj6RTP@eq!8^`W#oV|z!FcI zDlbuJ4a9ZWbR*_Pab3KQ#A}a?MB1S=qbU-h-2g{>!VyMDAcPM@q{H<}OKNI=6V_d6 zjhJFD91+*?Wdk-z#(1O+{LGISmC!FyN3Ju-2xEU;2S+i9z9Qw20dNBQRawjx-<}n* zOsq67ouF1)JC@%EN31QdDTs%#M5lc5N#8k%*D4vRv^PT^tE|?&VZlvh%k<(ujYRcR z*9Il+OAS~B{aFCM#>W|$GNTjM(Iavruw>gmmH;Jy$P14H9PJ55m@&r8fk+WGmP2%b zb#;W^J5{Qtcd5=D%I9I5!G0hB_2qh9rM_7A)_(8!$Qw}dfwzad299Wfc3>eJ-z8zY zEY@KlhOM-A8^4J!ms=r~@rZ>5R=m&feFpv3eBh}5J^<?sZ~>>(@>-u+$d*kQXOK?t z=E+@2MyC6)(Ek>9eb8xYf$@k(!vuA?&Hy8RZ(>jDb+no7C#jj}Ls*vSmB?mESX}9f z(+Lo+AX`kuvB7Tk1=)T~c6Pld9N~+!SQKxvxE<UVa{&j^a%I}$C|HGCb08ttMrIjT z1Ya3SBrQ7<4Iv-_rnkHe>ghHw_~W8E^o;U|K8?%A4cIb`96UYOQo|~H00>2Pj7K<9 zzkfvgcvp7YdLHENm`z}f&=Gf)#w;N|E@9l02)I+410MpXUZ^Crt9fTt8RJkRRv+iC zI07T!2&;osegNX8o5s$a8^aX+u^L-rl+m66wgw^mnB$K{e5I$TOxb9hktOCqI1NQ> zPD2<8E+LFE;q)r*V35mDoS20R%8)}EX`~RiG<V*<f~>d&idkwvjNpj*5exF(r;4cA zZL1&j;q89?z7^Wh9xVa`LQ^ya;@H#_Yn9R?RuopP2*={J7162x$h6IH9*z}Mawuau z>r(yxr+gk(#0`QY43Evyp+1S-nj(P~;K$QgIE8pji+s|)bb=g%hf8L-RPQ5&lmH0} zf!^5|1D0{i#N>Ph6b0!Ww<CCR?e}K&n{RicJ3z$Y-9Zf;(TJybG>ai&7!ZRShcePW zf?AZ$Qdo6{PN<!kiMf3c4a-_~2(HEWD7Hbct9#_D!Em#toO1(5P&FHG@PT^p!Y7wm zVK{qs^uo<!d@c+eDYT2HNH~hMwXyL0d`_9Kzw)`53QZ_tc6QuL4el}C*yXOE1SR+Z z&*_|iNXQO(GPM~elN|UW9k-OGR;;B9Q~pC5z>`{tPV3%dxNh37Kx9{jH})_0;mWqo zLO)+w_t(+2Rh13H=tw?IU!x^~J3`vn21p@CYbJ2fum`LqyhOEN1-0Z*rctaWv&;X` zoQD;0gWw2X#CjcTTs*%(ys(cc0u8Mjhg&8SekAjF0RgRfPJskCxXUg7by8gfpsbVt z2@3(4vrJ?h;nsM@ijBp3(GWY+cz%Quaf5h85VXuY&TIO_{p`;12o1^=#CsFie>@1Y zSJxUcR2fPTz}O0RG3l;Gs9a~@E_E?oC1Q0BE&GxjQ%fQ#FL9J}3T%(Droz$5(VH($ z+<fy`8%KOeb$xvt+!29L7aTDdam<B7o0}VlNbHT(LJSO8fr!KrX{~<9jRU9&NR47p zSm7(E1xLEY$VD-7U>Wt1wz2}P#u4jsjBa={;RrbJ{0R9o9)S_0%|q}tejku68B2Hu z;G?Gx>{A6tXo{s0q6p#WuwJS)jxY)KzWQ;byMqA#VKA^J%Zax<$g~yJ_pkgv4d!tJ z;s|>NIG7?rfHiE7GfIT(h=K$aF3q*^0-Cr?9Fd@Kf5(y%Ab}9@B!n~`j|gsK+p_`& z%xp2nBmIn&KC&^Y@0|E|8RC2RM8CE`YQ>@P$T)%#;D8C)W=NQ9n-gdIfmB%Hh+7nf zBXf!`W%(;{gc&m~K(i^g26H@$z(%t+<H(aEHZ$;Zem7klyXCft)B0kSzU|3)#9d5L zIAXzMmLUMNVvWL)MI9Tkfq()w4hSBvV?1bsPH^NEA*>N*O*7}&Sz*VVI<E6jMJ*4+ z+@%ZZlHh<B#~}<KM07E~08qSwBrPbkUK@)i;QG}+wl?9@w8c&{*5M<qxX!Z!bjpJ~ zSg;{A>;WQUnxMy9q#-7aDmBtS(J&!f5n};I(6501Rhb{znPYzGKp@qBBv1;RW=@00 zGM_?$sk(BbXk1c04@-cNh_?tiBLp-UA-8bEqayZuv);vuF|WNi9AXFc`f<V`E!iO} zPtvJ~8=POj-x3~l>^xc6K}ZmgIdC^K+llM2J*+G5^3)QP`O+qB;te9s;3(B+-6f9j z-oXF-`Eh<;@RnP~<LhC<5&7UKChuDJ=6hL(k1!C(251T+%*HKSpOYjK3@Z$>6!Tve zAP0i^%l&x8EyiVLdIFspl+#lXUU{>02#`_PVfX~b9e#VlpK4(w;)iGnuo-RV>va-) zGt*C9(~m9jEG&#c>L~x90cc}U9+lFxdRkanInp$kN78>I;0Pm(MFz$iapNP&Z(L^n zo)Xzewof930FY6EHAqB3*alMA*2Q8S`@Qjj)}5CcaE~m)v~k3^7S2u0W_SIGq@>(q zJTh}hj1atJEz;c0ODB?Ys&~ba7wf<aYjnJPbo0eA9>w~XcXEp4wMSwno*!X~*ddlc zYl$Oz>H3G^X?SW;)wOVD!WY6}Ab=yc4DlM63N6q(Du9y4*vfMUCU<<e2^^7TiVE?$ z-dN%&{Q!mpg}oF3zF0yr%96s}C!jeGy5K-)`-meN%s;%MSNyCmpW)pWm|;0`GXYRy z4JL*552>|O9QnTGzREN?<)zAnF)+z;aF~tLtR+whA-+b4`ZydKK|eU+JwB;#72RpZ z!GRL3LB0{kOsX1>4#@%mV;UjNW?xX1PR}%3P^Qf}c{X8r*)>5$6Hj->5w@4HgeZ?i zZy-Y;#}D{!pVg`(zs6PmXb9Yi5l5%7^u0?QbtUO4GE+V!FUFC1>BOi<r3fD6l|TO2 z!O@Jg=J6<TRLZ}roUel5tdf+Minu{=#CU{1_jnW&K=~7*T!Lp35X?+LWY_zGj1jwQ z7l2JX46c%Mq~*!umM#e=<PT%Q6~)w-pZwA_hb9Pmn2vQZpVi_jpL=3*bY^Sh1n==h zEWvsan;BM?byxBE5pDc-Oh|Pi{Mei(H%r1E017!`c?9<;@DkNP23?b%sv!Y)UPbYA zgEB-Q{K0rx%q2_PLxVeT6mP-;{KOHzC)mMJJw?JN*c35WdxKXUM=aTuIAX--tzL*^ zo4RoXM~<$Oc*;QkYXe866G)BkX*>c!7#@b5b3<$itJ8WN<`tt10}5#@EeuSnlqwLJ zBq+tfB^dE##NM3<ga)}K1C9qY^o6y1RgI-WCP%FH@YsTbuND|4EEDljU*0F>y$KM+ z!Rj~T5fMATT*+b)IN~FU5f?E?u~4iwV~k+V4h%-7v@?@t*)OD!hCi^Ql{(Fdv;vmm zBEjX{`~)m8Me_O>b9wdvG~gD}=!{2nSK`QG$IP%dtd0SQ?<(uJ*LnNnI8QS*LZvk} za8$m6WPe_gx9@56Wp9u^0Y(})B6=~72(bBjSW@1=k^O*Un+yqT5<c%Q@ny>;@unY8 zdprf>(C?^hH_u_O9Y<lwSQ!KeO)*l)>=Q?VjK(A3!Uu?Ov_>W+{f7}!(w1h3QH+Be zLyR;?ByAjdo=ZH&6F}gQIO4Ozux}i(IgO9v656pxh##?aWFGp}cob{1?9c{=W0Nt< zV*rg6UDh15Rh!X=rzD(7g9r{_1!Q84u8AYy1IoY-323I6AHg)tAT6*F*EtY^wjDUy z7(RDyWNV9Ao^a&Q&PxsYt?GJXhU22$%#RwxT=ivgf!<-H{q->0Avod(bSfOJ#A0Iv z*yO{h$0O_(>rEUPN~N`5HIZE_mMtGNj^L4_oE)VEns-kR&AUIQTH?qHcK`%Nz(~R& z(<Hd%AqIORO~}W}u$MHsS>dRT<uG6u<`!7fV8pjI^tcN7d*PSSjfa>_W?2yeAd2gl z9P#*%^*Y=;pT}oB!bBDF5z)b2{V*Lai0fE1CO!<?ra`ddhk(_t0D6Q${(uRORNCVa z6apVOW$Bm%0~zRpX4bufSJmY&=$9vl>FBHD!*fCbkst-{4RClF_T2djNB*&F@{J=j zf{q;5*$#~(+aX<){kr#kJSQXKrJm>^$%a2Sj(B*a@yIxe#YPi<!{P|3+7B27S3Mr> z2}f8mah>KVQy80!JW$Y48ZsxdzgoGA)pf=rzq=GT>NFH~NJ$R51FdL~gODaQ$oz-{ z`k7+b4KfmeBW#b?5I_?@)59n1h@cQudIPGbGZz--^jN<a!Gg?Om$=S2f~pv^G|ob~ zIZ7626T`FZ+5G65(F95wI3k1-j!qAs4;-C1!7QT+?HV{rE)qwye4se83e1Rkq3cFm zgoFVRM@WA7#3@`{_3#VT7)O-h5m=5#=+O!_@$RLU7E+{pN@SZQ3v>$cCH)7AqYm%& zV{{C_1Vk(+XAXI!F(K1w9!Wc=!7_y~GwwG2vOIT7J9L}m&>G;4jsi!q=xt93I;6oC zj)0O!B_>KJx5QBfMHmAb1SSkdsmhYJfB)qV{_yg{KYaF~A6|Ya&JWj@&V2Ysm#d@7 zS4qmK@N-}Pa818x{#W<isurGoh$<>@`Jo>@_wXP5&aWY4FES9q0i4sD!xwJi*IP!u z^UV+a=(&gf>iLH`Nc`}*hrj#pAM`su#*uYlJLKGz{yQ$6{=X{v3(7Mm=rL6~*ZJT7 zKR!|lA-SLnA9PpZsPqYlngNu>I^$?59wL`GLSM#FYQe-O{qBzQzWiltB^UHq;wb6I z8$&<gL4F64G&$r$b{Pq{dQzUGx&?IFILI$8kWa4RPTh!&(Cix>N%PK20VfW{d-2e` z!jdzShMl!s#W)?ADSkHuK%oK-aD)UPkF_|M^?1bdqhssCs1L8mp?I%e>EcNfn*pfh z>aheT3$JY>>68<2=KuM>{o!A|@R1)q|KN{&&P1K5yJeaJK3;eb<3F-6T{k}Td+)fj zYU=q1Nx0(29(W66>p9CRuNU$AO+(vfM=oCCeb|v7JY9F{E?)Qu&|6v>^Qej`vYmkS z7PP<t7iPqwhJO38H{W@#q9>@T2#5wvK$9;Qd;VeC3Cbmtngu?JTczEp2UcsL99xZ} zlN&H)6-YJM6*?+y$vDE6QUxZy*E#K^f1+1)=fjI-MZeI`VfyWjuMdu56OLA!Q6DpX z0xe7$!U*A*=5PrRIJooy<p75?+iy5?3+0mIRX*lNWOB(U<B~3H11P1zI)LXg@#GXN z@H=iyMkE1ku3OUl2vcOab#qH^WV0{GpL=3{#MU6TG@wMyp>$|77)HnrJyuKDCr0A{ ziuuv>6m4o$B1R=t^Z7g9{I_io71mgrI_4K>;#TMG^B;NZT^DE>#lhnT-}@%YRMuOU z|JVcfp4u3P&doENS?(UabnE!*UqAl3*N=by=|6H)dH&&Z53R3HEUySk+N!!Z#%c*% zB#vy5EbP!J2TLVyzT;d6DS?q4mqw`b1Kno!ubz9D=bp5{7D|+bUM98hqGnMUz0f0e zXch3w?07Rs!U&NwUaQ2>a{V*q_Ro|_KhVYz!Y}o{?`hiSNcu}Z&;>{OvGU3Zdo;mU zz^VN(b?pHx^MtmMXgMGXj$}M}$7uO6ZtM^!Va%~^EF57Z04i`KI*l5mgV{Hd*Bm@h zhH+{qmA^L_vnnoK(hxJ;8UmyMIO2@Wu#<;X4t`1xc37`tlML(LEN=6qL0*78#~X0^ z-4?C5f*_u%Ge6=GU)oW_J_o<TN!^MIOoGPw(1Ety#<BxT;zW9EX@<`4{4f7Qn3hJF z3LrHEl%Gd{C`xvaLisO#^4&*{9D;IsdEYzVP}#7pH>!N}fqRc1XKT0K;pM?AuN~cb z+r;Z`AHV71=ntO$qZ)V7HRI894=t~ZpEx<ef(aYlVV|9%M~@z&aUbZEgYH<^3>1w1 z`Wu_$5mZ%-n2caYISio5+H()Zq)#iB?4Al0OE|P?Ug$1ygj34Nh3$vs1ysQAs~%eu zrXnh+EGlh@TE-CuNo%%7I^t+(f4?r>cr7B)@4*O4><1VtA<rz}hhc$p{{B(dk<?J4 z<@|FCZluIf863u*YW@BWIATO#LzJImYM6*m&EwmF14=~Nj8I5`F~|du01|t8DS(bB zNe&5+#Q`OlF*#Ihj7Qw!g%?a6sIs>i9MOBcH~@S&cvPevT>4_?%JBIMV_W=K18=^> z54db@j^XN0o@84ZzJ-^P^azPp50D$qT;3p><qURMNdQd{Hb1ZDM_dX=j7Mp2iJAga zHp{R>*{6@nAYb^%fB5FVU0gf_<(SIvzT?i!PmBHNAN)F#xRa*>N^6+k5R2Y#{I!XT zm&U+Rr?u!B9GyBjv3iW3gOuvoth=;49$(9sRV0)k`|x2A&mkN^e@2o<O5_9$6+)Y3 z0!Iwi4A2XQSzuvtfE7y(NuVh~1Q1Fi#8j}K2vhZgZY-D>M}`vl*cFsxkZs4_fD%gI zFZhHJ3Z6dT#q_sv1Z_qEbhdHCtsF`5;U15SBihWrY{4KZq2v~5glR|wML+;Of&#^L zG=lL91rZcMEt$xlOwxb?o8&MTWEw2OO9X^mQii*}l_gz1TEKBp3-sX<)iw4{gc+Y_ z*9WyCs2f>2sxj#F>5&T;i0kw+DVN7_^2gb4%t*uw+Tdv9=yLTfyV*Hy8mB2l!4Gob z5H#3D(4sJJ7E_!6UsYUZ1l8uJi9f3Zm$eAMBuGbGvTmRRXJu-A;6Fa|(CJeP*c-i6 z^P|pipiuB*AG()^T&!!IJI@C15e_z~-hTV|8{c@yIFhyJ!FaT+Ct_%XB}%OE$m00Y z(nRXiP@*p=$LCZy%IbCq5b*p%L~b>;LBA>Yn#S`F|KM96L9NJy=odNAEHa5O7!N64 z=n<wcC*i1GF}4#%)T_tzgKlVnWfMO~){qo9O1F$3pso$l^tYjuHn1-VIP%e80ZMW_ zO;>;)X5C(!1LJos+hoIjik)Wj&n*BS<lrNrgw}FUYw!+9W<QDC7nZY;Y?fY<edtI2 zu+ITu=>Y%^o6}Bj`WH8(K`Alfb9_GRq%_hWmX5{kn<KhAd}IPs{14w$T&LkCtWg8R z^AF#7+o{#1nWIOhmlnGp%Zt;ePA;5WpFeeCetBgw{J_xf{nnj!`)aC2(<eTB@7C7D z|Iglgf9G|ad7i)<kr==LfC0dp@FM4&36KN{<}6W+$RLP7fJu}@NhB3)Nv0%9lqg%Y zE!(mj$3D|DJ=5FUyECWvhuLsu&dfQx)7_R87{DZ{`%l=<Q_uSrE<l=+E%)x(RrA!j zEZq0rx)q-9lj^A|^g3{aB9xcssjTwV)_ZH}ygz?C{+Ri?sl)KH<z870hq<@ZgN}zh zTC|wJ3>j0KY(vPj)kkN9TKuCgp4v&xssA5J=?mGqPDU1PnZC&9ERZ}OvLL#j0_keR zkgQ(esOZ@tg3y&R0TD^F!|(MIe9?|L8A}FVC*v%TynaagD#iz9A0kE#sV9q(nTzDA zII`7#ph%)j`;R9TMD&9uO5+aq=aAq1P@<eUJus*8U*}IscD9`!a5mp?W~nE2&LF5J zH_@ys7vC2mDF&tZ5*}@f45B##PgtUfbcHH3SyJRrR-5vnA71Q<(V-ziCFb1hg$h9X z{QVh3CxLusTPpDo(rJ%u21hYHO3UPW^iV6IXiy!N5fetaxg22a21F$#`0M&-B$0s< zdfm#EUZ%s$%(ASTBg_daNg85!yKM*=tx|h~;7E}hEA8sw`KfL9SNMT<MC*{n<FV4T ze43*z;=A-@jFlM<%qSpw5JPf=lNhS8`7Z{-T1ifFa?%nN(1HHvpe0L1mX@>?G=T&< zl#mn!w1Oqo@MNy!=b%7e(bsLA=irF9oXJ9oub3pdg!wKCm9dhHie-jCG%l^=oGU8X zAG%|H5}hsHx>-+}VrNE>KN&|mg0!6xWKghuu#Zegs(>gI=Ddl-<@k`7X%g?Ns(Fjd z=K1uM8G4$4sU?ZgG}I`IG*iT%EML)t-+P9bRYCgRP%t~4XEfpTphIGLA!#X1lXf`Q zRFRvBd$-ocNZKLbMh~|x%VNHmNDQ0|tmjQEDoU)Za+jC8eqrR1LO@?MIKmhdhRNU> zf~5XR%-R+#zE}mwkXAPv`v@qhFfy6vPHeXo*2kze?Ukys@rBt$%lsK@j&?iG@RPpC zM=>*X2p|k4KPpB7GP+d@Q($lg@-PY*J42vQB794sB-0RvoG8;m)egD}aZ5RtNVwz7 z-~Z?AS7uR{Eu7ZzQ5_&!VVWR|JLpyV7FuFLpFl@yj?vB335j2M49ekoUgUM95G~W< zNLjiQM4G2qO3*?G_|!tQ0`a2MRKYM8`-R@d=)fC*^}#1#XvUn0{Tj;)?O`;@uXx_L zNvA=O>O)IT5;XBEqlSA>22pmT;j!2t@^u|Sh64n#_6;Kl!xpYyQtFN7vu~BS8W=%* z4&2NQy4e?wXYe_|%uUdpL<(hQc}WY?DVYxBC*R`5nD7L(dLjEoi#*&!9>tU~<>~^Z z;ZSZmb>JCX&`XwhGc&zP5*Znir!>fe+GZ`om5p*JPQ{fg{fBnfSz@*_Vyw4q<;uk3 zVqamAHxR%|O2o;~-jP&Oi(VI#NAhs&>%*b2HxTqN*~GZu=nDk>cv|@S(xsl2*?uaZ zb`uq#EjY=$+6&~}naYc`b^iEP`jaMb&B#Q+c^L)jNe|F!n!tVffimfw#Y^ZD{5d!V z(IlmRcoN-`M3jh~xr161L<D6KnpINbDJtd+9VD#m$QKGS0U>i_tgod1b#)lq@tHsr z=^to`#8_*BOKXCnM6w&E4S7HqGZba!UmzYO8wkcCNa-g=U4|_Al_$Zz5<lO90H{2J zMemutBV_rZ(mYLoA*0)XCK3dO?-zEhDBu+my%(o{sk8mZxM){kWoT0F!A+HG6vF3J zDp80nCpiV*Aj>V4SqX^fYT8a5sq{eXur|3#Tl7z`#;*d9BoNAg;+Mc=78Ql0f0AMD z-c}W|q_>q^X@yE6a0H`ZEw*wz6xy<KZ$W{ppva9<p-VEk=0%|>It0tto3Rvm4Yi9W z986^`6W<r5k)R@@CLzUqj4y``K|=4nYW#I7iHu$IuihQX3#Ics6$T~@$I6ue5IUqS zI7=Z#$;$&~Ls#W>tjX<pq|OQ#E0`wwT4CCOKq8VT6iSFh5>V>eJNy-uiNAO|?ypmA z5GnTV;QN<)e|ow9CzpDE{CeMyFZGf637OaW`19h^yTO!xmpUl2y4v$&%A^WGgQ=gs zDNs5$x%u4WmJ27hJ$G{Jvy)p$7fx(_{?xYBEfIPc`)kEYKSA}(6aXKJrSowW;`1a= zOKDwBjt?gfl!Flg%^->BXV%4s!pwqs$}4a}Vyn_9VQXmG?A5?NLOcmkY5%ib1LaWW z9Et+7Dl)hNBIut<XQe2v<RLTeD<N?ON)Q_a=1ei_N)_rNX$dd^h>FiKcfi+a3sgjN zfQdOeP!u`v4l9O)mUBdGCaQwWPAUpil3FNP6j&V10nr1Y#Dr!>CcP?BNhPv2ABuwJ z*|!I3Cm9aUcimVYR2~HJfB_eai}9lhrg&aEif-W*@(jHcB19-Hg@%bil_tmKuei9) zAVQfmhr|dXf&&3L!;X={!BSD-EiQ2t6*H8gR0P>@KF`gh664Dth9h32Qf@$S#JlXs z0ZWe+wHT4%W0sab$#Aj*oAW?IKYF#-(!8SJUtJx}kEHV$zd}gMmNWH(<Py=(E8M|^ zfk;U7ye6TvMG1Y6)k_I6FiM7!kM*~r&LN2uMA5v2+B$E?YJX+5;7Ff|z2$gu)_vxE z4A6dY1#cc?iJU^T`Ij%}oLPT&N4~tSA}Q`?h~06hm(;{I^O?y_R6a9P+C_^<W<y$t zpYHO?MkVQpS~gLqi;z|V3aACO4WvML1%*h=M6A5(8gDR|m@CUbkeh-djHY0S{lsKd z3mw8#1to(-GpRR2QAU^w&jdcOQ|JMj=PDGHOvgfg@)J}9g1E^Y2#h>b<V^ajQWu2E z^H3Mlh?Gx)hMAY=>pECyp3H+AZUCTM(R_D7A$(F?c4jX@!Iu+C0MLm7Cyq=ZG27f) z=-i|PEhMfe(ljZ=mP1u(H7%vKn&(e43Vbqldu>6=V(B8<sK3%Q{v<Cia+38t(V0o? zn8Cp5C%EzqiUdqUK}6db2x>(=nIr-uXmKdCMa8btGFP+!vt29>h7SP^w>Jg|1M20J zE(DV{3I)SVElE+RC=4qNq_4<pXe;-B^s4A}mc}Ii?od%Qou81-p`ee4wSN$E+1Y~7 zNS+@$L7LkH<*@zKq1|zRouk0Xf!1I!4x(rR#!*{)(&{xyH8rzw<W$TQ6cz>X`O}}h zHNe;TC|_Th?Fj^Yp|G#JW5&;5TQP$gEmn{ib4UWQv&Xtc`&|z6@!)0;1_hFf7fH{+ zcEAn;ksI*w6&g-Yk`zQ3q#|3T!xIXNTxDgjbX05D7sG)*AhQxkD+Y^t@-7{oMTM6l zZel8dB~HPP#CpYu0m2{;g;)YJo2`juDr94bjr^QM3DjR{PYI7acX%GYCwjsH;iV{< z$W!VAZ6J3*4Nm*qU}9;h8_tZ9Ly!q5(@|C^@h-`U0*fPhL$O1j*u)*}C}$zi@SJiK zQ%duS0=>>@7fpuG(<1u}U_r##?y~oBic%V^kLRhaVUI%ODm!S4f(V*HzA!Wl5K@>S zi$)U}!El)U0mSzOniNoA3R}q>78&y(5kEjE4i0Cfb{fcJD4@`iwY^+_{F;dia>#<; zTpcbgOxNyOxsp$Ni7Mw$wCG@vIUr<#7iB;@Q?FQO(Wrl5fBhT+=Fh3Y)^Io>FOTWh zgo1*E;^M@{MsMdDUtK+Z24f#7YAl^A2KA<+R?t5<f<<H+Z$Bd#40`kO{2SL8c@!5( z0wo8Eo$wJMWw815WH&4ViG$##X@o7QQAuNSay;DU&rpbM{N+RpB^8lG%R!moh^`KX zXiH*I2|gbg1;W=E9exsSmLr0RZb5e<+5`@xl*z~{QL(_v(x=kZ3{@BgtACoKa%TwX zfzJqDjPXc0AQ9=qDFYA{AEF6r6TwSi2$(-~9SEXgFl6LrB+rFB5{H#JZde=+aj&md zcn%6Ij!e^p#+->>;{F4nG}G`nHs>^7JHdJ70h&fD>`n8hNVl03a}36M)odH6I+E~1 zO-kfS$utn*3)6t(p+)2uV6(gO@=*3fS<<9vLRS~AxI#u;$DJ<Hi9&575}fvGW2JDz zSOiCwXbm-jqq358+e=`Cp4UH3O=R+MPU4F=6Z#%A{yHZazdLYzxD^oP=O+{tB8(DB zN)oDT5?fl`^$m%?d?zj@;vf<f#Hn2~&g%zn_EQt*r}=a9+NeCEFV1<LKg}I2Rw0Ip z_{7*cI)nrhHqnVfLi7xIh+luA+xe5W^Eq0lAOb-odK>r@7NOb^wGNy~G926oO49je zF^B;min<5_{HQvz5T~-r7^dRHFhd@Yim{I85R#>+IT`1RykcaWkQVYtRdJ(YG3eq^ z)TU7}2!lF@BSJ7bvPu}RT&Zn*K1ge;Rkb+cNqxl*ge4Wqk5N~Kc$g^%{Yn#+q2Uxr z4J|^=9TuEQh0T4bKS{rMe_p$etF}&F7l{-55XGh&TZ2#2UZL<<bhNY)r?H_@89@e% zu`4SlBmj{l$`XPp6h^fW@x(aFH5bsu#vR(Gu~LW-gK!?(WSjZ%YcYSFB{pzWS(>ht z1B3lT37WA<39N6gi3>77P}-)<lSf(sQDGcJrKJgVb%`x4uExg1Uw|X4yv4D=D=~t% zKgBWf!R3DYMVr~O&frKt>I9DDWB7`dsh_wy@U-Z4F=CjNF%+V7Vu?iiK|iNGOeX^$ z1Zznd3{7!_WfW5nc#>DN+m&vWIOm|rP*e<4mON}m3F%L`3TeexG|b`2hOTB5ROm!- zlpCWETCFIswY9*fK#H~h3@u3;Ern=adyM|1DEu(^E+`6ZihapUXeG8A<QLn#6m(N8 zS6m-B-X%}u+X}Hs4e(`)V02>~j7U`?d9s$X#zEq-4K|4`V`~M`tia3imFN}n3G#fA zX5vgBkeg5+*@PiLT(>7Xm#ykVAx8uQ7O+!Q?QUxE*3_^C91}6Fs%mdZsk^Mg8_h%C z6K5<>;)TFy!udc61%>#O(C6_*c%ubg4tmIr(La6(5pzF&UHlA6y7B99P30mu6#~wg z0s*-0gA>dx7)l)2H)9{gWW?3M(?{D%N>IfU%gb?+FmsgH*p#@c)7{eQ`sF(krz%gz z6Q)_u-qOR5mK@wua&ULafn6p0<LSVzvW;tlhV##=!;X#OuhSB={^Z|(qxbyr4d+j8 zyl`UUc}>SRo{y)Et3x!LL=TuG3_*1^GTJ{}>3M)-u@gk@gp_xQQdd^yDz6|$iwF&Y zm9n*9KzJRm@Gb>HU`khz7J^B6HDfKb8V{;b!mwARUVF8mczDJ>PezMUl}70bfXrbI zOdm5|%t6qf7Wj(&`vIi|S{xBoD8qeU3gB`Hh=4;^G|U`aB(A{t3W+&}G!*GCC%p46 z{woO(HTr;D3HBr91hCg+Q%#fsJZ5-B&_#nGELnMmLV%}~uuMuOk>@AI5yJ<~goOD+ zVnGD4b2%oHFTlZo6{b;G=&Gn-wgNX@Vnwy9wcT4&>lS`knpj<f*T`K`DnHfM`AEi( z<SQ!!K_a%Qs{MsU#N+@g7jsY5)qZXgDaxN{_2eNrAwt8+g$_ju47W8e#tL&LFl#E{ zLaRh3#;#;aDArYK(r6#?-f>XG0rJ#jTU~u3S{(3cYEEo!21Ks4U7pT0?q7X3{%{;e zzr8wKQ%j=+ZWWb@<rSb0b3Rr+U*TJl_^A0bU*Eek-@?bD>E*LqW-4C@7c!|p+B++m zZlO0=3^kMTkTQ~@T%#=A6<xZZ5H=-=el9K%5LMT>YHHl*1`GrV{|O0L@jP!u@<dO7 zR^dDlm6-Mp<m#ZShQL*+ODV+YlR`F{L>2#P$-Y8H3sEvd6&Gg$v<+i~4Wfb?rU!@$ zitv6*B>@FDO+DpFp69Jt#YDfA%2*s3elBE58*LIoMKzMCjaY$BOmT)O78zyYWCm7( ztn3&T6cO4Lzy$tJ9>^d9c#J#j!i^lklM{+aK%+WFsH9Dy5Ie?ub7)$C{`Wxbh?3$G zFW&+|#igFIa*s?E6$q`CRk(4}l~uTE>s=jdyp2unib|KJh9+-ay@z~blaEy2z_0%D zN)K<b%%`s2Us~p7rlY#rTUFyNH*Rx&(gaO@a5=V)PeEjGG}PI?7z%;k&Pn#8WGbs> zQdO0!y4p1{SgVkvs2FWu9en0QdvlAcwawMm=4x+ut?F=fb-6ce^sHO&`L%(MeNx`~ z{%}jHr?JUZ-#|>btG3QnQwzCD;iM{)DywI{OC1h8iad(X!^XjT>B0`JIXy;0BmqW8 zQasvz&<u<M{vhlEreXMovI`!T&Nt;yY(<5ux{4ZN;<>36e{z#wm6`C0Ko};*ba_<F zc}6oxGHzAInj|y^xJ<J2pc&{y6I7>ZIV5e^@0VT`o+4olW+~8O2e2rSD+-{0I0Jl` zYa}WVm_dQTltqC^Z6mlXj<i@R&oeg7#h?)uCiF;fLCp~>Fa&iB8skMxnE2Hk+rcyF zf&2<=QPmJka;S$)`nV7-BC}*4b(!prC0+6mb|a6Jd+?z^$Q@-(L<AQKosZyy@1d9h zNl@k@K$@YU)eViFRUN+SYR<DuEGq|1Ko64hGJG|)o{|z|le?zYUtH|LHx9QUC=?l2 zT<T>4SEZZ1Mhr`d%Oep<O8+QV&5euTS0q@maAQq{((Q9nA&lDaYRGS-$Kc3FH$jKV zJT=)4>jn`d(9ziFYHN3`UFYsx?fTXCVscRBh=K61;HAnCr=eR2m<Hk*qkJP`Vse3x zYE2&9F7}ar&VKZjr?-k6F-^e3NkT@<q&$={!%L00w;dwnWbV-CmeZ2qMePduL8THD z2%M{H5stAtQkepIjE5<N5@LFen5%}vt14m$OgTJ5KO<}6v|*_Qg28ZzC9}uc1ITaA zee=8!8>Oj4Lz)=n2S^II;%pqUr;^l}E2_IfL+dGMH6jueXbrVW7Dr+S8RJMiS~g)4 zS_eyfFEuvFq!3g!j28{1z&nbKLxEUBxCopHjg<RhE8&wNj8-<T7qf_)yn>FGDYlY0 z=kej&gyPCg=3G=~=89g5aRlzD4`@QD37U-40K?V@U-2Hp`e1|Q6<ALg@4y7Hg?8cQ zry}g5QrUtY0EY7t^9#i|;`m4g6k7>N$CWZEjc68<DF3+$KY3l^RAY9E$)MNORi_7n z)F+m(3v9ww<xF8rgLoP|5VwyEf|R^ZkF}PTQSF3^iiFBa?7IZS6CeUjzeKN7$z=qS zJpb;{-kp)%Tf?MXTf#fHgm-KX@7NUHzA?OQLwNK00E~stIV-SpQ#4kHs+6X{cfR%5 zmi6JeX<c};NzL_3X}BcQ53$}be@dTd=a^{)@g4-E6T~tKixI@v>1rJK3`Aum+Cl;Y zA@-4}6^{js!+|na7!!%n6uV=YEVWR#gEf>GbeZHOn9xBOHlNO{D1I}O781HPo9gVJ zPRmI0CiFs$BT9yn`HFm3oosPOD~21o9FXTqKIS6OJ!j&koNN`V?mJTxiz6&PeSXeW zJvOm68W+0IyqN<fL)|d(Ol`%H_;7QNUx`t~&w%Gm-_jO|r4}~;)oRl##-=`?n=L4s zs0lShMw_dcz>F-T6AZ{WVzXm1z)2W85@X7|jEry0eJ6&n4kcGq2w^g&1QGGZG0vYP z^{{aTM*^Zal)x0kTw9e6+%%bTq|65-2+SltN*dg6a1;Y$OuC&OZNo=b29(NUP-<#+ zb#{uTCw>NtAl}lvB1`^^%g6W~qJ}ng1@w!0rAj+CM6DRIrJ0PBpvgQSrOBUH2l4v} zSd0^!t9A%ibv5W6{guaTC-6n%AeF9;79^CFCxWB=g1D2x^gqu~B`MsLX8jCGT`><s zJW|?82{!M<#g`J>10S#@P^MB>3`%CRCPe`iLnTvTq&QN4$o(kL()f`5r!I>*Xi^Ya z9|eL8>8bF+|3*y|J5GlrZf$eZdb#D9IK+5eK*TH<UOwJZ=eZU|Y5YW<x|s$_`P|X= zYA4fVMN?KL;~R@ofN7|H3)4f-uc{JT2?W6jMej1&i{dEHs3i=&(uq=tI*#z#fhqEu zfE9@cetaoD4;v?GjQ#4$bV_(&viKrnk)>2E{yGW~9L2Bi4j6x33`Zi5suG%;T^*fn zBadd|NM3~09YRVGBzIz(+v7(&?MJmH+c!kbE3;j8*4+_rlr5Que{&T^vDkKw?Gq>p zMMeMAUqKU{ARh`yV=a_`Pgz+aMk4Y^optp842TRil|B(eP?ruXL#%|&h-<Pme?KCa zRk2h@=1YCx`milWOIFh2qY5Pp0qUlz9ar*-f`@>}i6b7f<>-rZKtwZ*;wljx(7##7 zEdd^OVo2LUZ~{}_I%~`<7#U6am;whJfh=aOK@CA%L=o_-Y{bnpdKT{r+$f)iiEj}o z#ibRWrW&-GnRL#7l=kL;6ufg@qV!=PxDiN|l|TtEL?Q-JRh6$$oO=nlyHVsw=x>Id zVi$PBrVz@(mmZD!Rv66|gccV0adaT^esU?kZbHdeNO!2AZmFd%rKs37&cl_!EYOss z`yUe=#iWA*>fM1;N85Dz6_JE$2ab$9a<`(_$vmt<oTYY0hH`8Yq)34SY}I8yN``7| zU2kx7-*@A$2sUS`6f0-2=aCv!OX!(7iTiqo9<XRqrlB}ODhZBo<HzL@cle3KW1=O_ zc6u|Kx}AOuJ7$&>I=3|M#LFDWIHy_X<R5}83em#($^)T98=))gL9XNh!UI91g=m$m zJklrUK#4!OFD*5^0-MFm_23qe2_OibE7VRCob$+pFcDJ<pa2VbaHJw>0Rh9AZtfH8 z%1*-Ca1)9nd4jlTyTrko?YIeiqM0jJdO6jI3Ok#O+nlun2Gla9csax$o+C<lQ?rk_ z8sI~~s<>G5&@KRr3?h?9Q9S2`9`<m60MHBx%tH)mM`1kX7x;;=f<w}8p^!I{=jA5? zs%J>fP$TwHYg48Lpam3@N{9DU6Tdy)*ZRnol5of$W8DP97)6nJ*cincbV#0g*pXIn zBv3NiU1dcA?zqlQx6$k3e($)rF<^;_q*z`hR2*OIaTgAGSH`6V71+`h6<MQ?DP-dL znRYn~G5O2S?bU9HanyLInEuI6Bqy4HhDs%YQjpajB9AbU0F-J1+*gf`VWRVS*Ak~w z3^B?|oLpz%6OU?8Xeik{;A&#YoOC!Rudi5q>4z*`DSx)o1O(v>;cDw?Q2_L8J#A?g zM?7Ys1bh@hP7v`rp&%q=hk$5_?DPvv(q-=&i7X{)+#ojzqBB<@0NjWQR^TwBDmWs@ z7Ig3y_#&>D0txmY`Vqu|BNI}{hmb`0G5A&EB1{h(210PD32~Q7GN1?!_B3E9;d^xr zOcLS5_LP@<aJXSA;>s3I7=THNGoh%+tAYj#mpNr3TPOrS2|;m0b%rDUSi^B^5Gfb* zvK}EuhjAiAudAzGQc#!_qp_@nt?TlC^cwDnVJK74Atd^}p%+hYwIm1e^lMyDoaZYL zPLHla`B9OCp@c|kXcD~+9R2#cj?!jJ4f7R?GJ~u*l(uguP~%-cy|rs*{wP+r*+tEu z%u%slUKvzk(5ut-=MG(jUQP4$6DpXTP(q_FElb3yPN;@5F&P4*P74P!mb>;dRA<zi z8TeSrd;n6uEc9+pJg5CriPH%y{fY{v`=LbBQ1bDFb5$JO4<Z#ql%vI399b=KRtLr< zkzx=5r0SW*#hDTW4q9PiwoM54OkA$sA@rT3>rBZIt;%(tiR<P{fvk_9rIf>}iutko z2`sMwP<+U;5oxvA>yijzVoJqBm?8Vppq_CsF#`kxsc&S{Dwz*5@<<$X;0R90Afo%> z=tCQfB4~sL5ZvCJTtb>rh9$TZ2^bE8Bi!;taf{>yR;t%2-Et*?qsF>S)J`}UY5V$O z`PD&$mNL2j)(iWD>Wqxrv?lUCD~8_ad!KZv7mqsW;GR-EA;bk07bnDU)F?P2H0Z4t zcKz(Fz7H<<>h-6W`y`pSc=4yE5X2>=$tomSh$Lyx<}$u$Q*-TdLIh=v((5c)nw1`S zlZQ#~d~3g|&|GcO_S&lgiVuM%CzR-Ij8h^sm@@)UASmbv3gSr>M!ZN-N>|F>l`<J_ zrA&KO6vVExgSwT#zRJ~Nij0=bhZIdP>ieODZjar~m1a6Yq*6>@)N-g8W!it*UA*E< zw3Pc+kZDWxbtiV5i$4CSJcY1w1T<+^XqnEd_MYuhZ9COK_cP(y0wrV$Q&i|q2pt^V z$RqsTg@tUug@nS=VHu9-<gChM7ZJ2I3A!-0t&#){%*sS9<i1x|60vNDHAEybKQeKu zf|PgyM`guJ=o3xR@cj2!GyCoUI@R0H?|W*z`^mBH?|u8gZ?6t1xFBpQsZ^&t99mND z4UJJrs1ClZA_=cuLnE`XZsLM)JMbsqB6yWw5nJkeR0W9=C<hv*Oq!#g&=I$!E*S?9 zEFx^>Z3aSmNK#7E2ka{p&gb|viE4ljSedpfl1HFpBHo@zRFnkeWBkMeR-@x}B`wuA zpiGM(rA#LoXnq!6W-m4Rid5$$GbO6~p+v2Os0@ynEh4Y|M#Jd=t*uto){|oGKOWQP z?I`G<T=n%iAkr#n{aI}2T!;9;yx;7upeqxd59l3xozo$<>*z_v6itX7R%I&8P|{Lm zi3lBh3oLtKzK^lf#7!MRsBVRcKH_;D#5qkv$<#I?BFSU-kpUw!Ad2ZuLj`&1%9ptE zN@j-l%+c;}a2|hJYP@iK3((`;SD)UaeXE4W*P(o+I*bJiCDrag4S@>ntK4`S(DCMg z2;Uda&oMC+JG4b9+*aU$8JSoyftpm?nUtI!e$~$5swLP)(ISNsJ*-e-E{P~0;vBTX zxjO3<2R;u|XYG6mW{z)GtYjIZtK?ZL@}LS!AvOaQ*}P_a52Zt%vDC#^l%hb>{ZOKM z*vq)SxoTButfGL2ogktdEz{zN$Fyf?pfl;~+J~%SK+&QC_H~O0=hApq_>%nQNO$g= z1;28~G#t?*KiNN7M9&@liM%GWbtkJ!W>(YBW4k$79Vuv9u)ypvY}|S@6M2NC!(tZV zi*R&f8L=5D@Ie?62F9XhV)Fz<tSiZNEjI!GvD5m*r@^W&=}B2B$th#TJz~Wl%b-{f ztA>pAEi->qQm_Opv!sRPQ7qra;uCbwPW!jVqJS<xw~yY#3}ib3?P2PSiHD~GGZv3M ztKe~rP;G)PP={Jty<O}4&8@gf1V_YXR9AUW{3HSjmt(#g*CP4`bC)a#V&$N5eo{Vb z<h_pOU|PzWcbdiuan{I_%vxiqCprMt=1*~@va7Sn+g59aMzOftBw4V`vQwUCcX2#O zrn_8AGjX&^i)6+;TS6;M;0^4H`8#)MxkQrS`BCXP2m7!TUIdR6#pmc}3nC>;CqOKX zeQCx?g!kv|>-vc~P*VP&D4=?%{W!gecF?LiQ6LqLZ_h$eRF#tLKjo!!pv0eA0_~;$ z@e*LOVBPRKS6wf!71r%06g6z3$c`>%TSeIh+#p3jp*KMgd$B5-*p`aj9p^9b@C^0g zmGpEL=F3`p-S1TUbKyd06;B0g8)Z!~8*waJOkjgJ%z->%6?u7HRJ%X`N4KZ0!CzX6 zlYx*eG$OoqUJR&QLi_UY8$fu3B(a@>Y(m2N@ny@{;)A}zIAX&P!e#vcR<#JdvOj~! zBZv8eURPS2k&(ffM?^*?krdtbx;!(btF7P{Z^zzx>4{zRJX;*JH|JbDyXQMk?f%Z$ z-Ivbox%~X2XOFFCfm?M=N?Dn&rZ$O4zo(}<-+O)kdvEMNce)Lw4re&gfQ^kw#Af72 z6Q7(|{r!sv-+poL@PWoio-Z$&gp)HI!Q<h1dUDgnr}sRzvxW^x7R+}&e{%b)&pr|g zE~HlUWNvQqME~knp4|QN6O!19VO=L{dWpUFQU8@IQu`il=E=2f`CHeO4(@C1XpGPg z8JWHnE0S1_%~;bjOEcJ7+_z{ko*$OHvF4X3Vix*&F%@A8^evnLfTKL;=X+}FeHB&I z&EZ}!TIeic6qiI!&TJ86$=;c{A05s+Y_4^Gaz3DW3gj!$utJH^fwrM=m9r4M5EVEw z`vs9#2w2qfysa?hP#VSBe~KesQ7Cb>AW~t(>#%EE0;JB`aNPlk%9A0v&EBfIg+8EQ zk6-rW^!brN2pz!@J1g=G8{U%VCv((0jgp_ZPsZ%6Exn;T!1ERWOi%Z!Y~t$x797#= z<;&ShR3@|F80?}$wBE{W2+vdB;MaA0@IY`x1QC`IP-1ZeUWH)D2aaeg1VA~6SE00Y z_%lS}U$#7X&N6@5FDRzY#r<RN4i!e1E?=I^K=2l?urqKVF#qVm&Z{pU7WlBGY8-k@ zHmz;X=M$`G-n+djCfZ`C6rUbCCsDZ7)kziQNk4x5u>BU`z4+`FEF&T`(2<IZJU@K( zkW<5a{rn?^g{gQo1HoiA{E_2et`5F(b~jrFv3rS@Q&zZ4#w!WQmHd-Sj#U^aobL_+ z832-z;m^%oaOH&qG-s;6>#gVZzyHPnSmRIFS5{UM84}%|k?Dt<(H8h8A7!H<I*@&m znc!mxSXmrl`wJ7OPxx_dJzGq$ONQXcT1KefR;gC9WE?5bsyCJ_?}r2A@ih}=T1?#! zC2(X#5=2GF0bzAqEsiV-ECg(Aoj9_ESOhs?NPEE%9&G4=UZon~NTH#v0|@NGt@~b* z=X|kb*$kh@1VKQCE3jgNXm&6LM_#Ysh(B%T$emPongJSlww2}qU<HEAF1zIAYy}3C zeME6hu(PO{nL-}9gJE_T5gg&Bt8Ylcw}5N{NBHPaGeSYZ5k5Lx6YN?5?J<biIsWA< z{D?njiE*TGHa=annDbs^lA1P>e#riH;$hH<P7yJp*A-^6Au!#zY+3S>rM}YQEcPF^ z*okGtI2s=BT@5hd?JHI$@7!3yPekvWo!B_p-#IndIk>MLg91uprug`g7GMJI-gt5Q z_g~wqKv>tAp&o{@Ue2lzH~1@0Z-4XrBU+!1mS7;q9|)#qF7tE95jUS0-B3}yoKKi~ z4i@HR&>SkTd_}Ts411OBhWeix-z2qV71E`Cn!vb3^A=xu@gM_wd|=%#uM9o5wf+}x z4e}G4glA?YlhMRLz-kx*(1iG2x|Ag_IAnw=F%QD50Z>A<D=1*%TO#LKyAhg=BMd{u z5u_z#X^4u>2kCr*-i9Fm6a={v9=_qKr7<!VO@@YrMHuEhOC$jS!I5KMVvBmGFwzQZ zovl1_$~Bs)iPtR*g%PELh#4HQU#Q9vTETFD9c_+V4rhsBiaY!XKzP99MRKtPJr5v# z0Eo&g@*Ymv^P|zpW87q`ZPTS9r^py(Pqr_k;ZQzpN0d-K9Yi8p5ya4BX&H-;{7lQn za8$xxAMi=UkcW*6jH_JshoQ0TvXz;|{#v48nleT3F`9hBnP&DSwjzf8>jF!71}l&H zbN$X!j~ECTMecjUKf645<%NUirna^<gtc(C4$jF<-L$quakOboQEhovL*+8~Gg7jw zESdF#ub$gZA?)<nxjJQ4r}y-D<H@5<ZO!vbio`4a+PNJDSwmHosgaN$EK}6J9X0Gw zmlsXT%JTpEyGOY5)Y!)NF2*O0-yJLrgCiU!xFXYZ!~d7g>;?$Ek2cA-zB>dT;MWT$ zw!L?;Z?dmzU~l`SbB`@r<hy)fKidf|S&Gm})|M__g8IrlpdVJlxG!6lgq6B-WfJ?0 zF_TCfGTzQ`1U-;Ad>>082tLO?!bDZeNL`Cosna2VIV*2>b~|Iuh`UH%hK@hs0R@zf zFDOtbS?$h>BydDDH4)%MQxh3WZ7m9{Fw)m4N-O*j9Pzrgm+}>c5HKWXVW_pT%}Gp5 z_(MrFH@{1N6<8sLJc<0teU5bDd<y<F@Zp?dk1fz<6iV8B`kXq@c5toOr`0HI$Rj<h zft3+Nbf8NZgO@073I2f-V%?*DC?_=Pgv?}7j^%{fC)zFAG_LV;TO1()?+)iIPv<e4 zes0)1bbjIZ_C@JJcqI5nMrIOJO8Ll86r}AN${}?FhnR}k`$#QLp|Uc6MVbH7g`NCF zEYRAuDeJqFJ69)FR*9d1c_q@D&+X>dUtAf4N(=H+1xN1=^gY(FVugQM7M7j&m+#0d z@UM(^M@G`sq5M#WRtB;DeGZ^OS3LWu&y&#IQNjb@Xz9|FB}*wG6@5D;**mB0jLw1u zKJ9!?Zy}$)$Zrf@sEcj-aBIkBeP;hLnKgi$q1O>!#gun>rI*kwyeQzvIC;dUsyJf2 zl&+Mh7)`~I{kk3ZhiCo}u|4p<ElNjLyXAfyDMdjfAPCntS3<<KwyKgjaioQ4f%oG` z;bX6qe18eZ6cRFpgzTV_53KxGxoO|EEq!1{N0XY<cDj8IjsOT_L=+_p2UudJIFgkk z%vrFsFdl_sal{A$L;8fG>>%nm&iOhAugu6AL!a!EpS?U?>SHu^-a;1=fLtA3Fh6z_ zk=B+g(keDse$KTlj#0Qd>j5&}yQPd69{eG!0D9%@R(@rVpoV%+=W1_jI~(RFlwlu% zqr!ws7k2UMFW(-3ETfSm#nJxlHEf4PLsC-`(8Q#0gHy0iB~cLz!WrH;-oO8{IPk#{ z74B-0nlRxtKTXb*A#u|ts!ekCgWi#`HY`FrO?UpJC*jo+63OZwGo3_l1D~Q|H>;uo zK{Eu77zTy_9O>R2b_kR+Q-L|(b=E=iiC>S>v=F|+w=69IWGI1#K<6_!$}l*ZeU6wD z_;c#)#1S20;bSvS96606^{OFd=w749Ne1AMCz0`(Kgpn>aS9S}<Gx-w5s4P*PyDJ6 z@C*#l{=~05qemn0mK;E4n(xFB4aW^jSS(vW5E_R7!ZVBy8GjM$D*+LUXGwU)am>Ok z*)0v@NVmnqScaowO2dk&IVRgY&Oe&xrCp+Ja*C5Ve;gbseL{o=ERgH)%4O+p^i|Pj zabWsBcrzwtP7HOYrE>O`3{z8O_{p(N>FIK)3f@SRrETlVC<^1HIDZlQG_rLS-Yswe zj>^isFFvu+{5sUp>EF3y@ef|#_k&mWZSKx$XkZU6-^FLQNd>+)gpS%$pMlSi%Iw-$ zmXnR`kNuS>ST<2fz_YG0*90jIR+O#)N9fyBLl2-qucL0`hu8A(udWO&n8&us(rQlb zqkB1)9myryf`JkTucLu;b{GQz*0hT#4P6m)lCDEv<<m-g*yD;L7#GX9h$O*lN=N|n z4(xbFES7H4MbHTLEYwA{*@F(1fX<N)Hz4A>O6r_nhL&OoBSt6ChRe_ubi#c@OQPYB zkw1-k!=KK?utH9TqJ$vLpThH%kZ1)7o&b($1v7>kt3%!J<m2&19--Zlhf9#Cu*DH$ zsyNb)qD=db-p~%Q2-1ubM>stBu9jdMPD3CkNL?$;)$f-EbCWC0r<t57rZ>&;d~W$O ziC<|E1{a!-cqGv1^t@xP)JpE8-~*SRs4c#9;{X&kqHTu>3yv1!-}d2p)u@K*8o!KS zIgvuRVbRj%P@%#?KkjZ)D8vrfc<sc+%?RSE%FIkc0i!KkQF7+b=Zq3E$sR9b?VmT_ zkl*Z82C#Z?M6IY>Mn(!`c6LIhTvZml|Hj~VUp(|9IaO8&`;GJa(ih+%$K5dx90?ZQ z9VFK1y;pmP(i!V*&H?O!#M;`F{{5v|0^2hD=KCVxC}HcCjFu*UO^s*ha7-us;H~~& zA<m2wqoyJ=5=q0^2n~pRWW;6Pqpb_)dj&^Vhf4CZd|rqlg|k<5!~b8uGi)TR)a}ai z2N{}0i<4<DH0JZT7B285Cwnl9pkWRUlS~pDkoxHsuIP0s$;>w;;|rqSaM93#P!|+} zB7~GNQ_KK|AVyzxt)F%J2qqXBx+ptvBBvN5LKfLf5>=45*#DV*#o0U@m|Jqv;nsuT zW%OeQp~`uh(1Ub)vgDx|67(ZRfj~)!%@VU_lrkAm1s82Jel7U9P!y9dSj2|QfglO1 zHnE*D7oVBMN^Q2>5fI^x)LnWYHWi@YP9Xp(enlKv^GZu#!{HRM@xk~^3GfFv7)>K- ztF=+onffD@_><A0)wGVQ&#%4(I7kdE9@EmadHBjW`byBmlL{hzhTbD_SRV6DDvoIj zRWkC3*;UM2!4VFBoD8VtW#yPfGRs*|AofvFF|Ik*7U2L-BA_TYH;GM;5#=cPOP40; z(ev;DaD+dE50UYD8C-l*-k-b{+l<jbK<%2r>}8913?815nMyr#a^|5m2^q)HWFN-o zuq*@RNxt>y)@mhneT-**_Vysoy0GYV;!L>s%$DDRAXCn7zdw9tyt%6@ZO!Vmx;jr= zTiR>lh%mp3+!>zeZ71dj0;Ut-lj5&?ci@K?dtox+oJG1KuPB^}X_lRx##v53e%<)J z4Ns6yUmlDEmO{Ph3;p;Iw1>IUaQ<WzkVMOtr*bsmd}9_ZUYuka3+n(}E(RhaBMCOH zqX5eVN5~`WqvB%b9b~ymeUqPAJOnQ8J4{sUBXkCKr(_u^&r|IT2~jpUTI6#(lsf32 zk8*{yP~@N)rHa&4^ccSA72w2i1Rvu8()~Dscob!13?UhJu{rGy`bQWs9ciSJ=ykLO z9*anV<_Tp9g*>w9fzj(wc;HlYGL6Ncn1dtjItyX=18I&hnu8;WBPFQ7oMA^zZ0Doh z35yWfA<7#Wm;iUQ{vx50K!>mknorXNO+En&4?vCJh&&*I|Hz*PN2zJ}^kUEGhmc1M z>l_?GNNoFwLz`W>a8y=T``A_*93hNEuM0^OD=~EpBD!BBf`3WQfY7K6V<{(5Aaz4& zfzv`ER0$Rh2VR)&_xn9tyQ-!J){Xb9ne6Wx?^!#tzq5CDTUv^r$3W2X6{)}t)=dqM z53c{&ThO^2!-sP9vo{CN9N9QOP5cb_XGmowOCKLyKiSv$#Q3@=O&Z$YfKo?@9r1O= zMG56)2?rj@yLe&K>o0CN_*hO;lY8~*)YeviTYJi?j`{4$(z~zp!s+hwr@Om4a<WX! zp4b{h_{>i@ysKfVe{F5`N}OpKOOhu0*PJ-AZpoq~IxQzRZCO_Gt_{_r2RoVM8a=dn z|IWtrh0<`^yJShylBFokqKncfxEX&kI_RqiAQDoEt`MmNpceZxGE>Z?IrPRF6M+(l zusAY)Z+{>_a2*p6;0W>LV#jaRwlD-NRKcfb*gHs+xoKv=okvAmih@X#7$7Hvj`CsE zVIU!)BBOQlyn=}56J2xV5nMf4%mG0dS6-pL@O+~?iDH8{m04z>0ggZrJQfJZ9DSDT zg~c{Ls?=E=@z|dQN2U<;H>rcg5tSr?Ad*7E=Ix)BSI}yjqfhcHW)kd0@uGj)pUipL zUKLez7ae7eZI!PhRpAMShtO&lQ>(<ruqcVmi`b;DT!fLZK@tOsUWYJZ5Yg+RQ5?Cl zf<whCt}5gawlgF|4;!UUWGJ8Z`7oNKJ^V=>5UC6VnvV=L6*c#LUKgkGq5HuhxDTU7 zK|+LOXXDmK3QIi^c61tcL~d>xK{e6*1;k(!7S0cal2&lo7CTEAVMK5pt~mmM>gzpQ zx6R-E$o$o-JuHk}-#xFj)!W*d)U|FtOMM9)Y-pU{*t7tGq(!(^uu7m|LJK01d6XXt z&(lDQ?3}dRKpGHco&pfjOpXQ7DxsTYWu*WUdJ@|(Gb<GVL=Qk+DXCr>1#nQd=?zY{ zg@Ezq@vx|KX&jI4%UZ^}$P_<H(aP*(!t$LsqE;AvI3e-&pcsV0iP)#IPd*!K$Ph4C z%-#}(f-GR_K@QD<n5hXBm_t#pQ%ej&QJACgfBcYSbbcKOwVUEU&ioHIP(_YGWHcc> z22pXuRqZ1LBFha7H%QFL5_!a27zd$ZA1RK25>|uCqdymp9w^bMq^6k${DB;gfg{+9 z{T=#53<-5U=pQ{Pe8w;ntS7of*(T(nJcJQM(<UfI;!*<4?BijOX$#^R6h~Zbj4=Ut zXn;^1JO>#KBU-xD4@uY&g!jVe1St=43Q<MpeK1DFQvB{ki{Z&q2*xtJ9m8S%JdSCm zr88+BQ!Uxa1Ql=!5|ocv%+F6LDo)BrRz?yEj4&buh{dqAwFzt1dbaOO>ss$=ZAoD7 zqt4FcwswC@tDi6-9N+{#)z+k7xzjFn<|C4Dw&dg{=j0@>SV<TUq=Jwl=EqM)6yP-2 z2nsFYRiLd`GRl#twn}+iD+?F+QS%Hx5yO@YP2&m!fgk}9-ftepmR!8px5T)<F*8+- z5kEsb1UC>&EG%SiG#5C6S47!t&72hr@L7<;lOjW*ScxY=Igy&!QP56)5IM}cr#jE9 zTlf8;lmiCIaD{$IusA+J6OgJYoLO%Uf1%S%bfwyQ1fGd+iikm+kSIK$9(<{j!6}cN zb+#XeCbdJHs@)vD?rY+RZ_y&>KU(zgf7+{DNr1@W$jT#X%ecTaWF9t~HRdrKF?<Ro ziz9q5>i1S0naNyX(b^kYGU(86QBSR^!bhvY9Uill;YE_)o0t?oPtczX4T}p1F~pTh zGE)yRljvUjgwz(Yhn#R;fd$!cQqGu=I68z;O-({WLqg|j_r^`0b?ZE>Z3#_H2`ofv zXke2%*-Z$Ug&D;wfdKw|!4XB#D2ipIKoehKxaDfR`YLwg6-Z1nRnm${CF4#f#T1@B zaqcC>jbG_-%n*q}(auNi`n|%+AbXmI<t45j6E7Vf1*sDL1jP~i5-W~Sut_RFv7r=4 zItq{_HL*irJOANS!LK?xU;3Cnz{8rfd~J@h5kkb3mgqObT?GYT2Wmk_)qSqGqqU_c z|13CyheIc(8__l;_5gP%HKfClo9cTsZ4~Uo0m#cwJ~5Zbm_Nl2$*)$MMd%=;^kJSv zLg{0w_nMy=aq-pQ1VA*?=de(mMX+32XXr<8WQa4dtQ`BuhjNZ(1e7p%B}g@ZCL<>B zij@*tsb^U5I<Y-O?lHxKlt(b($3QDnq|hiQg1D(kN8D>@i9AWEQLjRx4qAnbNpl7W zrxuB+Nvfxo5jaBDfRwsAHaSUH+vVP})zjVWX<r411WJvK=z9cy%l2G6%zC9zNM46U zK%5$B13VQ?fQUr5=y$aO3MdugN(m5;CaJkmm9+`lD25oVfhKEvB_IEjpEOYp#qup7 zJj2bv2>ndcz)?}53mk>nr_L<?5^fgX=)mHL*D1t_Bis4Vz@PD-#gPnaoF{85Xf^$y zJ!5f1PlBL-J{;j5gbPst#G(du!>_2A!UUy=49y1=;&U*-0cPmf{A8LS&K7`U)H%6B zq6DZ{RXbw|dMJTsxXD|*s|1XZJ8wQVi+p<V67&u1R+&tv$rwi*IfOe7d4$uuu{jwN z$xtcFD8%7_21TE6EO;m^e(&4>mNnjn6#NX}2)`4vAq2pn!z{$uG3?j&w)VW#!4Q&m ze(V|t5tLvPBcci3r8KOR24NcwK`4zx_0%##z941L=l~IT0XXZ{ySHukZr<$eSe?+; zme2~6431FwR3u?cA(BD{N)RojDU%0Ee1Z<)%IB1eDy;Mholqr`<*Q0UT($lHN}3jr z=TuD5aLq99Y*7aJX#*))n}+ky_`TyeDl#~V2#!z;kVkelTp>^OzOgu>!|6b!B9%wb zn*s!JgY19^?`I?2xA;m;^XZ?MMMxRo#-F(6?l+Nu5@v6_eEdiRl;X-09N`~8uV&!` znvAdxbAFBLbu7}UZ)DvB^EE=NY-Wf^V)Gwx#6pAo{AA`~iTP)}z{-^=*fN-z#F$Ym znm<#eWGsRdzfJ`4D{WW44dIbd@)H>pH`$cBER89dQAv`~KZTrxV+UkIDqRMPFhbTe z)Qd0zIN)f<PQlTdH3=OZ3GM9yE|Q8QpoB;QN4yRaRbNt(q-X*}nk<wQP+Y+g_2EkO zY_h;-a1~J6KpAM-Yp_GBwe2>;ue_LM^i@6tG_-ZdN0mpcr9vLzulp)E(qgs4b;R$d zqOWrY61B;WFCQh*5L!)J=#W2I9#OdcM-S80I^y=KW1)PE4>@oolUYEC;B6|#lq*P4 z0b~o*jLIWsCHRvEaBK4<?jUdkQuvb$LPzyF`!2Hv{6lQvhBf>UFRM>yz4?{|@XLxM z@lsM%TyS`S<Oqyx4sP%^wIr3qal{~E<T4M7QpcfM1SGRmJP>5T4neAZoUU2Rle3n| zEF{6|c%|^}Vs1k-w9Z~di;E+OjP$$_KuUO4`p`crfGoLEH|5n3Hk5`TgYpTE;Lj?I zRHFk#U<CaQ5P_PFo87zjcz0~~uJ2A*vpQkbD!EAlWju!ZhcSf|1B0lA%Id}R$dd9& zpozriNPL$%Xoi~TXeyMrs%%p6MCG+1+9>4`w3MX8M#ir^#F~C`grWdbKVe%3j+lOx zHHqLTFOimNCAqI!DD~kL#?H#4Z!C`Rb*OQKWdQ^*UbrgcEfzF`oKo!Yr+E^*VOx2) z$sK%mX=y%uaS0AYa~}jHr^s|0&LXZL4kA~1#1JoDOw6P#gi##fU166Jkivoy!u4BP zld+FL5HlC~`9O?arjyM2GPc#iUF->mSg^y?E$fDuAdodjf}nJ%22Nc7C4qBBnNbn~ zP)bokOL5U-;iGiORTFeYQleD?gKU&nt40S=nYxKsL8C*yfFt8iNa*NHSiL%7%U1WE zN4z_CdN*!L=;}&XyH;+hVB#^fJ3JDsO9D!2C{fysFU9Ps0*+Kd@m-Py6!jq~n&>)B zRGSJbt5mkk6*Q@+)rJeK;;h@cP_(_2mTu&c#SxVWg%eA_5&N7N9EoCJqE!_~ROw%E zM8_KHN;Gj+;>-a)XlO_o5lP0kpa`;8#1L4}KS2Z-Az4L^JGfZw!<wN?Y$Y+QB;G@G zEk2=62ELB3gZ0j4DqKc{ae;E6QUVwV*RQN%S9~|r6~y~m#PQ|$mYH1=7a4F{na!Lm zvWz9+gtZXQAYx8zF7e_rCxT#2AR<~3WT{Ar3hGiCgL^xr4@3w}LXBLZE2^ZLl@$<B zHIhhlp5<cKkWkEY!bp8|s?mWLfU|vv`>}oA-MhUTHz#b^kg$HeBz{6L@fZ$0aX6U$ zPk<8I9Z7jUZR8Uq&Cnrymqh1iP38c~i75*u&|zhhwwh}UR?0?<6Ow*NHS(7xQ_hlf z`2^oW=)`bj4s<hHWE%y0HjeO1@FL%$9LlG+Rr;d_FxHItpZ6aH+C=#zKEy|Llyz8X zwT`2<=#TO<I4i7VK%Y31@-Agod?+bdII~uOn%Gv`N`7hc!J0LfzVu<O9#?HRpQE?= zIz2DrXyg$T%Lqa$(2wA#(8YF7?9u>^6iOQP4QVM|@h}afuh8wKMHmIDt{5WG)=@qg zuA2CkGw~LmrcZ3Q({&0TuBx<H83cUzu0gR780HKhg7Rf12w}vokBuUXz({9j!n$<= zoSnPe2M&7n?)7Zjp0H_C3`*cjp@g9Xl<-TS-8rR_>Q4Fzz0x6kS}UM{;!5*XNU6%F zR~=>gM7qVai#C#IwbGbo)CRP7lq%><8mk~u97!9IM{<}BGq9r9&5=hu%y;>gVwO&3 zOutb$BHkNWpu~n=XJ+kV>YUO%&_E<1JFLTjKan^ps(6MBx||7-5*ehh0$Du9eFHI_ zcone)e9!<DtqNO<BN0hU@U}4}gjvM?1G26h$l$5turP_QixN%8{?Zsn60?e4hpPcI zig;s&eu2?sh;d@2DmcRRjW9}I$ZWohDKp)OCtMjyGpu;kIZa552|K1!2@Qn|EPRxf z6gx_#;98*#f=G}S30w<^%yA4lVT8Sdh{5);AlkAe;nBVBo?h>P1KwS`6Si$j;LgU4 zlDfM^$FqhKQi(zkYCuwLB`B6psNP71FRFClN*xqd&@f3Q6ji0pB<c@gE1GB&0O6`c zu7FZZfu@;E@{Igtg$_jlB47)IbBtccX-5^6UxFh(M1kKx95H!~-<vrjC=I_iP{KY! zX9FN4{YNGl!#y4vrye;%Yk&zqsZwWgB$$#2G{FvzZV)G-DJXu%iATu`77_pvn+LS= z2oT{SV0AgO%*-`s=YSOP$PtdhmLQFdGJjNA<p)YEjIFFp4hH0~YzQeg;34E2%7JFs z3?yd-P6od^4VX(>v4Y@jv`6YsnQ3_Ql#19nBot1?NzS<QVs>^?D2&gX<<&xdl%`iD zQLf7T5d;u03Bu;<5H@s<B*JSA<zp6M=^%{oEg+0=&EZwpyg6a()`Z9QxqJJ(hYx#q z?@8FTD`CeDxrtx`N=PdZ$16Icq?5CtNpXbRL4_S(A;T9{5Li*ApjJR>CAn&~6;skJ zCV?Y`lA?*L&Cn+*iL^Ip`(l+xsMe;*G*;zNd8I2VM?=n%M|2Bc<Smtb-%uRMViPD0 z5Xr6!$Rol<kUpS*WdE7Sb}@oTiX)K1V}wY7AbfGUM1torr({OSfQ~>lq!RuIUg1T9 zHF4AFQdy@wg67#AfRSaa84-fLnHw@NNo;IRYHCix+fY$K)UnJ1R#YTGNWzol(0NZ$ zQ3~@-Dot1>FEh)=--`o~rQf(6REOac+1V^Nz}XJ7C3-Ct>_B6@2=@+#lUdCT?eTSZ zJJd)X3Q;A>A_z(*LDEXzxCQVns6M8?1%!)&sC$Ee1?jVUcf#Qw_rRdHuh0AFV+lZM z&mOr6pb$*p2n7!)sZ;`qD0ocH0?fi9L6iE!?F5tgv`{kDpcAwoR6HR&RO?g1)+Q)V zpn)XqBChlRkkO=Q(mX#cV81f-YIQ|s81>c6FXN^|9x09l(GEX@e(oENBj#aIgwX2% z5yHqVdY7OH5RvpBSkUNh+yd%h07N9j3J)l_z?7no`(~!q=y=51CCi_p3L4+Idd1Q1 zNKPCf8c^yKM=TE^-g^c|O-Z%2zPbh$Ws5xG?68W;7>)|^eFW{3SVIQ^;A&u-j?4_! z)Ud-FLC8r<miT}Y(P%UiG~tEF&1H^>-3C&YuVAh8JQL?H0w@wm&My!gS*{LE0%R3H zTt&Uf5%@sEBoKs8KqV30HiS{kEb0(k;6?yJAcX{Kdi&fXBi_M5@1es9`}QY1`e+PF z2qpv;iC2(c0MJe<flXELu$Tl>#w!l2_#z%N<P;K0p=2c#)k8c{Rf~O<P0Ac-qoN7c z0kZ-!3M=w}Nb~%}GdwR6&G>mJP}Nrs{!kooR6$rJqXs&f*xG-QM^Kj<M;H+hwo<r) z$l^%<jDgDhXMfV0&OZfo0x`i6|C~ROr+mFh#)%{JE&>t|Nen2l?tvhr9+O8+P02Mi zzDij=!Jco#+Iba65H{X#!lc0wn|Q+y(>Y%ziyenN_?<HGelG(@B9fSv3P(~YAJs9M zpO%x8low6S%<>kO%r|Rk6CzQ6QE@8Hb_h?25c&Z`TvdMqJ|yTC_#hx4X2cM5PSW@v z%p!0E5J1F+?wBOnvnLVA95~<}9P*5f`$k87z5R)Y4ka8sn6Q68fJy{nK*@L>61%%y zYt|&9;I*_QHaENLI2N<kQ&q)Q4}erQlPoW1Z%O$y31Vh?nz#<dlmg0%C+bYi;R7^B zWh->9XtGdJWzUHzdY)hDM!}Jh#gstg56k4G;StmTIgby$E^L?y_|*^5V|?WsE|0Js zz7$77`d|IueG%aIzp8+8;t0zWy&6)-&%lTfT!(5WdR;EVC&wsP)eyQM`#_SAN&#~s z7>mdv5iA`7fmr1&h5-9MsTIKH{25uYBcepnr=bBd--HxPV#S}xyIj`MB(ZZT1cpu+ zEnxadb_lmJNQnf>Bm;tA{=kO>d{jDsAjA;59HdUrX;V|;>ea5UE*Gu?)Vb~3!H8?$ zzQh9uT)n;S;Um7uDgVTTe|W^**XQc#N$BlOJbc)7;6UQOeePYmT-&$1H*9dPU+=<$ z*V>A?1daqsEcXLVwY6--3XbRsR(7))5ex0H6Im22=dc59&_oRpQV=}-qY_G;610d! z(`YHwem|Okk0J;V(T6IGgr69t4(Z17UbMJqgbK)U&um}Ghl0jZvw&3`(f@SyH`6}) z6LFL{3mo9$5B}4i;t%MP7DqViX8d(>ZiQe091$19&@&Gkko{DJ4Hgz8s!#}X91n45 zMyX&N!J6_z2tb&vv34O0RS{KVp-h2Td?pBLQ7#R&r~ra{Yg$QULfnA>LFyMFQD_w@ zfO2I-12QO)laV3vrX~=?K@#rvb_wU+u)&3rwrv|A^5C5VM28L~4h*=*kNHlWPCaoV zWpvDY<cN1@$lKrV?&)y@v4h4R{>US~?b|&B4sG1%>+WV@g}1HEPsxpqELrlhpF@4U z8#J+`k+YvFD>-_@!+x#oC&|tgY$=JZYlM_+zRkW^rsfjU3zTdZ87@Ju${GjQ6rC)< zF-Ik;7}9PBZrUw$EWwT0@iRtYVij^Qq6`E$k|8kVGkpe5{{=@_<;Gtp&SA_V5*inD zZb+TH003i&C?HfdoNrvYiA_X?s~SGI@-Tl$Jj^qgQK)wOMAEreqP}@vjU!W_SXBfw z=*kxaB0d2;0H|cR?4WbDxkk#cEkGzN=hq{T2>H&FoxM46-b<tq-fy!Ff}4f0CN#*G zA;)X7PZwT3mLRdW63cm5IwTt#vJW;mqFCj(_{j?kQ}73><`#~yom5ImX$qnZPkUu$ z3cCvPEsPP>;($+aF;Ow%Iqd9ATeBvmp~2J8;O*{C-M)Rns#V^O4sTbNZ|~lPJ-rL} z?D6j3pENSEU}Pk9;@F~*qiN&gsb`;Fa{m0Hvu78cJhkxn@x{+RyYiW5a!;PjnwnaE z>eR~9j|V3va{K!;`v+I{_pj*bS@y`Ii@Um#)~reD>Pp$Qd(qZy3)|ZGGi~S2CGD%y z8XNsxT?;xo7OY*nprs`h@x&7Kw)Xk;^(j=9g@JW-DOFV|#j<mz+H|-yiHZkSY@X@Q z&rb^E`VcoPA`S-qIk~bhAI8OD9634Ij|5z?qTd~g$m9YcSZI&s<;**Hnp=_^>b#00 zpsIya>_c#*Q%Fite~{DuNk1rw>Xq_Is5gd&MZeP74fR7>f&0%o4~qeA=8r&1f}d@= z)0q8_IT-{FNfPP<OvH6yV&{Mc7!j|6EQ6KxdU)#e3W7)k6ag8+?SLN51TXXFi=&%7 z0p65Dfizh*u}PIx=S=hvl0;~n*`btZ1P_dnqs<s@b^r(j6G2dWM@m@*V=6jKO-&Lw zDlPRz*ukd6&$>A_+=%9*tr5b?^5-NrWo0ow%ilsFoC*GDekxnd!-O@#Y#H~e>iGo) z5R9<vn%a3KWl0cTLqi&DwxuPlwS68SV)-Zb2+|M)p~cnJdAIFYylPeQmMsf6Y*@gW z*0pPsA9-}qrcJ5c-Trm!y!-Yo93EcL*SB<JB=hkzfs?1RAAe%S$&<^@oLTnjt95U` z-FWqC`-Nvq&OKFh;px)zXG_nXE_&i*;Zvtd&OcRodaC5uNdA*2E1x`FGdWiN)Kjff z$LqFlU$%E|&XJM){rhv)ty{cyZQ9nYOFCE2Z*ET7vSrDJ4GYP)w53*7`Z`w6->@mY zzMh`(tm>FoSD#v2m(tvviXuvjYU|S~t5T3nD9Hr{Nfj0IfC+*rI|o;cCoeA<G{IYn ziqn{GAkQA-z^$Y-IlzXN<*ZL+qQOsMk0Uyvz#MpOafJ2c#1TrhQ?L8x;0SqS?IWXN z&5}n#{l-@SKtKeP&mDZ=DvW><2ok@y+1UVRAIKu<E9O-ogFi5~cRvxTl)$7C3GX-I zsb=1a64(}i03KK(8+5qwyP|mH=K~51qQsgye`|X(R2>S73BbPD*abyJC^r63h-pFg zJV}b?v*kN9lMFjmxr1zCf89_xIhvn>L8Kr;{b10ss;a8zRj`X`gxTJN=9c*Yv%1>f z-aa2gqq!xuqjO%{s+6vE3$O?{;+ez=5lv0ZqAuCAX~B*ii#BYKwc&gAWDXw*jEsi% z?p;1IQg!TD<<wa5$z#Q*juo9bS$yuv@~6*~0G4OYl)QMZ{N?8>zICDOna2yxo-BBB zD*y3gd8fytr^fP5jpaXata$23^w?1J^my^<@zSZ0l9S^VlSj)>PE=1GtvGcIWK|CK zl=b#jZQPi(VMAtndva@g8c^!)UeM6sZ)iwrZBN;_aWS)OsC*qA^N>x=t@G;Z)4&lu z#?hbQupAN!(_s6u@`^NNCTM!>^jKJwV%BhZ@U%oC{$RkLUqGh`j?f3n4USM3*(`_y z-KuI>u_CsZXuL+)soqG(GHM9@|KH#U0cZcwC~HEB?O>8x3K$MLalmSNorgspvHQIQ zV8`W=&J$^A1T!FpKofrg4e~}wlaO!SaSLb|9O38|93i%tRN_gi%aLb(7BHI0S<wtx z9K?>_MB?FcXS)M%gb$6)8IUHNrk9uJV-+xA#>^jebf(l9KZ6V?Ub}pZ0_Z_D-{9;C zV!v6bl(j4|T9CrxZhYW)-VjgO*}iC0c0nOeG6sU;2-9X>MMW|&gv{7@zp*K$sX1A# z_|<C`puepGN^L2SWpy<RSH0LK7%aQ@EZMR(ee>p}8#gZ5w=ehPWX<Gg`4cB=j*pd% z4ip_5DLQ_%Xlf*SViZIa0F$%Fi_c6JoIO$W?Bm7HoGN(wWWkwZkuzhFQzPM%!{L)h z!Y778Cyz!>kLFJfgeC?<Cr0w82BXJ^3r`*`o#-!|7%ZF^Dmgw<IyO)|+*3SosCeLT z$zV@;Z*SeUZP@^7$Ihi2H!W&zO<v!<aO?KWrY3(yg?shd^wq29AwIC4@I{aso7kQx z70L%qxH_w9(on`!r)7hSf&%)%hsp<h@O&1Rpd2P6tfTopwm7S;OD!lwX33J|_Eq!} zTq};FkSL8aI5K{oZ!C`34#LVKG&%%?>R?C{uw!F^6iv=6Dw&ENMGZ0DAccfR#}%-E z6!}RubrEDa|53Oqv`9b_6~JGI2VUI*2o(5RNM?mx=yes9o~9OmNs$=QoGDgUmqd&Z z8au2N6<xhj>TMvDh>0gf4JDAsa|J;po>Agq^wE53YEzil#eA0Iu}Uy2@Gz4+s7Xkl z`g+WH_MpR!fXVM;ho7};7w<oi+tU*o87dn%R5(6Vdg@r^_)y^qXnvqze4t=rFgi6% zikuvdoF0juIuZd&kB>&qjORT$8GULp@5y6%XO4!?jD}8)gpMBxoEQ$CJ`y~6gg+z4 z2ZNIX<Reo@B9nu8Cr6@_1JR>Bkz@V&Q$s~#z0u(V(ZPcSg9i!*4i*mgmYtZW86B=T ze!O-6{!n*!#<p#Xckaq)YfG-H^Q~I7pu2lfeZ8!FM2I81YipCpBbyLRD0nrssSrO4 zQVI)Y_N}xuIUK<(5(MSuxC;bCNd<*|KorS?ji3p5YHBIX-O-uc+TugYr6?6iNOQ#z z0uG7K5v3MKjHwPTIy_^o%88Q(zGj{RZK8Z7r$3{8M1l6-SCL15n!k=Fh;PA&CqAb} z6Ib$p2#D$GB>CxUfwjxv_wos*Ntkw;AbRo7soh;c;hHwVRH^WvdWf10|a>~x7j z2JA4hDu5J6Y6__zn-`%d<XTlVlqP;`<4oolbVLsh1e{|iOL9a}bF+W_`i0mgTemLj zJ6JS$xM+O1bn0l?(cXfQo+$7^8Jif$8|w{^_JyYgBNP4MWBsA2fuIPQk<jUp;K`%G zGvlGNQxVeBQ=zAi1<p+dpPdR`I1xNQ6?pD=@B-J9!E;lAr^W(LO@tmF4W2$47N89W zC;NgEy&(!5>y3;Z&Ko`$IdU+1<Y0lMp5lq&3X<r12TM0?TE1h)a>P(uTWWK2GOFF0 zwF`g`Yypc26Axa2Ll62#D&eAm{$W9pu!rT4EYe3jkvM%IFN!k<Z-XpX$>)rTB4j;& z2Jr{hRC^Idwe_r6K?jg>=*HZ*KQM+Pv-6(XNB<wi5lB?ve@z@&?xA3}kbFo6;PCGu z4>*6)2PvEk-?H*Z9W2NramJc$Loj3*TyRuY>Z+=CvG^rQkc^qf0Z_^hjkSwaB~OAB z6*nq+c%7tB;sJHiLOklTg`yw^5JX}kl~5ecLq~bT3r9kulYOzeu;nubMWHGhJXAPz zxbSF?z~|`U=+Q%wk)H6_;qZ8Gc)Tx!D47}zo*oH3F&2DcOptPZGVt8#z_*?Zyz)%& zJLf{LKOg$u%i*i9hktS@{OhaXfBRne-@G6G%O6F!{trJ3|GN(&fB9bcFMb;S>D!?n zy%v7wV))eyq3=8seDR6kx#OX;6N1O%1EI;jumMzLcz<O0K;H17f}w-?LsBu(_Xc{( zwr*XyapUsVRy+*JumWTgMjw81cF6-!2quLRZKnfOl+!IF#SvFJN*NB^iKN{X>#Gu^ zv%9V#h9gP{#aHw3N=AIUu$VlGPf9YrmZF?w@b&XbpL&Isl$^f4JbECGtjEt9M`Y&M zM{HIG4f8r0og5Zsjs~N88s}p)J#o9KeS}#AYUl)hMO)K6e!O{RY5Dz~gKCF^&Uo-p z7iE7)HJ4~Lwh{rcl+V7P?9w3HO3x=k8;`4Z$ztY7IRK8cT2L(jk-M!u3D<YAOgoC~ zU>XJQH&Egb1RQrIB|ba`kU@Svp+0_ds-5_>2?)nh#z_TvSV_cN6_wsr_;yQj*LwU~ zu2pUR^&94G+%RwLTKKtt*REyz_65eq8j(JviQ$sT;o_r*^N$|RJ2seqtUrng13i!T z1dk7g&Wwl8od|vV$<QlLhu-;i=m)Qd-+wdwi+95R{s)o2{(0Vi{7v+K`HQ^&{ohAF z{7(hbe_wd>qrw}%FSzkh>CKOur$1@E`Elosk2I~m`SGgjzi+$tVdJ&m6@K~;g}?jX z3jXu|6#WnXI{MeYivHyX(O<tCednd{3ui*7#)HQOLlgbMiT=oVU*33M^vI#;Xiwqf zP|4^}`SJ0Z;r{Z?o0lIt6xy&M9YEnB$J|@JHVp|?RV8z{IL1k!0Db~YM5dTXIZ&g< z4hMXYk?sn}1IA4uf{a6!Woo#=t@21pV3CyCN6Up@q1UklNpWPAod0)mga<$^1@#hq z6~FhNj3fNs*d|C}g1rfiRuc&g4aXYMq#9oeK!B2js+x_6fe+9?sZ%i|D0Ap|7EOS~ zEPWNDi9EPVlTG2+b(s?!BwCfteE16653;cjrz@JxrDgsCdBn~Pg@sAXUxdPmxLZ3` zr&LzBQSA^Scz1CKu&fW?8oC)c0!{K{NR)q6!LsrcbQQ3J3!=VZ9-4^~jFJRA8FK1e zow{ljVdO|3f)IS|tGu|c4<5|kv?=T8VA)V_$?1vevB8p&!}(*q1ye%>V|{s}hY$y$ zlY^1t!{IYWL+EC&o(uixjp$$fJo?}NWB$kgSN_L;SMbT-7hn6Z`r3!hH$G~e{$&01 zr(17b+jINc{<}B(?%o`_JALHN&9S>TC+<!kyL)r$&W)+tH;$Wh;?B*Jx2_+%edE}z z>*F^+9i6^*Wct&Ao1YxK{?YbNf4A=1hqb@|KlA_gFQUKtVczBE!_Q2GP7Mc-^#zah z=S}qG9XSv_Hc&LyUrZYADH`rA9UrOc?Tu{Mu#`QJckaYjpSp3=;?B-g&Z{LcAE$yz z)iX3S`bPzm^U8ga3M1*XGQm-OgPRB?{sc!6quK#Lkw+%ToCyo!Nzm*5xp4%^ITO@H zf>F<rNB@uFNY>rRRBVcDpa+y>C8^>_WRS#ZivXh9#!W4G9CRjfTVZ5zGdDxiz!AVP zbGYJdz(FTCS|~VTE(vFy**aKo#QqEf1#ylrID)f*qXNN^i`jXYYUdh!0<J<6rP<h| zIFiu>N0n7c_@J0bG8<5*gd>6`5M-DtMiwq#AqF1C6e4N-C#DdysDusZTA?l57WVY4 z96M4nc(`B)><ku89Vs5`6&Zx+nHoeAVff${2%J9=e(l-tyBEWM^|Q#w|E1vC@5*m} zvgyW0dvAWyd-Iba1A*~d*C#;7-J2)x+&q0}`pJ8@&V6?0xzF!B|Jj}A@7;d!?yVO- zyYn*X-Yt`EfBW9;m+#$v>F)GPcW=FXXZpq4H%S*X-MaC_^tBVy*N$EPc;MQHkACtG zEg$~Z{QvQ{k@w#UUwkg~^zq2lP-yIM@F*H)Ulg5l=wNjCFg}p7Q<JshBbD2>Wj(ep zV_o;cjT;xPT9sk~_LvM}UTg+R)?;8ngpeZ9Z~O#afLo#BsNUV!>;_OpX2U&w(TO7% zAe<lSwLzOsc?1dlx&AppL|$>k)&Wi&0cVRNbTBkA6KwV+``3MSc|?IU7WvCp_?E6e zB1}}Ka?AmIWT==COd@x{5mm*jFr(D@Wv>#P34r3^J)?RZx}5p|RmY<o%108hpO2(@ zD0?PIHG{xZACYp*t+SJAK^~{RCPwlSTbRo4N^NMwQ{=`<VivNl-jB{N@i4^%o)L|} z*#|C|YC$2(l>D`|spgOuY#*lJ)3}OSQY;AKiYY`ePiw1(NS>WL(d7u{NgL?NA0IB7 z94R`|D_*jrJ$c86@?rJky?D~XkB{IJ2)}eT^!-=EfAjO`$NwvGr~3Lw8>g@J-TY+u z_6<bIQ@3uMyLIEj?HkYCzWLnUX@SOPcV4-7n{@HBJFk9z_q8wXz467p*FV4W8h>*0 z^Sf_+cIVPPNpF2dy8ZgyTd&`{^Tyrj*GTtny>`cBZr`|gclwpvH(!{(cK*gEPu%!; z;`&GZpZ;#g$A91O-~L1NFMbhy`=#)O)1i~YXnNs^{=B1yBjPO|zzb14HCiz;P(Cma zWSXhHJ%xyf=4P2l#S%m$0VNbXdWNKG9@tSCq<?Z%{=;L!e=1N6+)XX+@(SDz<}ITc zf+L-Z#Wf0!pjeBe`&|u|{vS>@5Bb%W;LJcyYHRaFO$bCo+d}71JGDYqDvmTJ%4ywz zdMiNx5RMdyPW#B>2-T5qQHbhwT7p`IRE&DM%`q#Gz1Eowl88LN0xo^V*_^ME=Pgaz zaQGDsSEo1qPm^Wwi#ehl#}QFLC~viO?o}QB@-i8BfKXXQbQ$wUB4S94HH=YtBV>>l zakaF}W2ay4u;LF>hzK-&k(dM%R+`Y!$yN#TwrojybZ^?WZS%&4qZ32XsiOsx!}+6! zg&L3bho=U@$B%@bo(R8kHvGMpBY*wN{Ez-K@F}_R@unLeAH4DL==7(j@7z3p`^NLo z`JI~=Z{NIl=jN+-Ze6;2>(ag3f{4!qDQ}Va{O(&{+#|jH#b<Am|NI`;%O<^j@6P3W zx8M5gF6r{!+i%^w{kBP0xZb(-*4^8e?@YgO_txdR)34vU{_6DgSEjGObo0~aZhUh3 z=BEG(t#1R$<lp}5yr2Id?^{oYPaef>7y|wi{n1H8>PX3v-r|Xoio-o&1XE{c5<dK< zCLdA>k%W^U4b7;^Vs$EZkU>ZvMG!a1s~o4>D=HIF>Y7_)IO4wac|2Mbm(Cm<S)#Hc zNyq)G5Xm3)j3p-sSV6?6|0o=R0>u%pJ5gZatVmQ4fk%rbl}8pwbHHe!L}u1>lI+DT z0S;1gv!GR*@W);$mPGfGwC%RlpdOxvry4H-Dp?>XI3mWlzCj`+!Hx;k5j2rNhlLV@ zuEc;to4FEVk|73u<$2x$L5LyU-IQo*bh++s@2))yAAK}^uqQZzp)n}H8SM>?9u7?P z1)mrVoj(<N<GIkk`yl$!e*!+G*M8r9{rCHCe0=ogrzdV*KRbQ>{H+@=3vi|p9B<s2 zzI12$O`&`te&ArxVFb<Rci#p$Uwn225dGt4R}7}E7$}Jt;@8jaf+lcu<=!3ObLBIx zcdk&*?P*Gr%$@1W<Zs=)eCx(#&~)p@#ajZX7j9iYH~r~}>mLt&`r)>Z|E~Oh{>$jq z%aJE00+ap0v7XQvQuQ#JUcpFT(Zopk*l-!s#~mHSY$Ox*fak5Ul7#0$xDy>kk8xGt zXlH8Qa@B4JM@`Lwqsl6oZsRQ;!$d+2KqTR3h`GLJyBeTO9cUeNu751GIG?xp;%1Bv zjU-ZXf|k7TEjTPisXT)6WAcb|E#on|P89I`{lLE;M--w-p+pHJ#gPT0RActu6t=du z&e|vz`r#r_k>qTq&D-v>y*DT01d$3OszH^g9>$U4NSD2^+6AXK-T<y($4r<CE=Y_o zqp1l3U|6}5^u7~5EDmBL5nX53(UHL7(@mRF`VR+(djq2bxuZQf<Gnd!y}1*IbEk%K znAUm!jqrc_o9IXXJ^#}W*Bkf@1E1+@XHl+h-FWHN^^3P|yn6fQrQ0{(gu?HbboaK< zyukuE5?lyIKnl`F(pz7AW<(O0x+iE-!6cH%fC%^~f{;W4M&J`mSNO#3o21K{44~ei z0=KSz=hpRaQ>B}qoWB0?;HMvM`rUtx{_4HR3r{hn8yM>WP2tg=ypi6#qkZ{D`-_J9 ziZ^e@+mN(smA|b`-1}y(nN=7P39Jl9xs!Gvc{19KsKiy(f}@r;qND^z+^4G%Noa$_ zgv0j~N01rgm^xd}(c$JghYa*j*VhA=7DD05ll`-URA=GnYo8BmaYP1Mbt;DoS%|$r zT;H$`{B^h*@H1%L5Jp%@iVp4o9OMyyk|9nT(+ST59s}JLl?V6<Gm1YsI)tCN!}i_e z=ga29QWUYN<ncDpWDXc&17VKhVmo3Yf>^1_0#z0SVH~Yk=E}<#Z+2m!n{9&dMXy<# z)V9iBQ7OxC&`erde2q;$poBBFo--ord=0YUs!Qfi8~xm2F14lxZ7{iOT}t~ZCRJH; znzCgJ6O^u9yHj`WTrf43cYHK*VuUHqoMQvIQ-gu2f!xPOb1yv`{M+9|KK{G>>%ZSL zeGR|C<gFV|-n#Mpo$2q~zWM6yY1FnijJhT8iK$_C-Z2OQEbky(zPR_!=Xb9FkS{)a zM|3&S=-&Fr&)@mS&yh!>+98#=@)O|VvCkD&qU`Y&qKZNcBn>bTNs7}ux8A;O1d{_$ zqU;$oy)=F8+>K9;U;F)mPyV6iZ~ijx(zgjQ3XJ#Se-IahcuV>VM*0hn^p^moHEaBx zod~8RY$bY$Ra7hkp)&ys08wVeRWqe!GQY+%HFb%tZSK}~LKEd-aD=Er=%Y*HpulBE z069ERO(a-!vQd^SlUEk~a6l>5S#JFBj6SSa3nFM(l{%~yI5X7%)N0y5`JAxKN)YEc z%T}7qF_9GVRvy_BD1-(onyg3ys^&v%JR)nZsl$SWg!&LiM>vp(V^CoBJP|emrtn(J z!gCH97I`H52``v0(Q&x=01F)jQot7x<M=B$5QJCQ7T7e6txd7`Jp2hr$?y|zfmx=F z*trp3$Kplo-$*Q_H!BO3jJP=B>s*x;NkzrjJKj~Re68(1R6Ew=U@H-~13M*dr=`VT zU+;qq2rUCUOrGMK?IakF)9%`d%EPiwXkUd(Az|xw-<~}wTeqh4_GO-&$U8BSH$Euv zndr+tK9qZWIQ!Yj+#kLc{^-9%um8U3#>a=IKRt!{b7%S`gP_;$-bVVofs9bg#TYN> zV@mLEqst*p00J7CQRE~qx|~WP!O@j}`r?Y<$mBJ{1ES`|9+Ov$6eEMO_YP$m715}6 zqAtb(h4{Pm_MK@1D<h<C-FzKoZ~EHv)7PFt^St)qrvKw_^L}zQ^z2D=yui^z!O@=J zXm1oK9UUk<I#jxS`;s+ll3D%H)=ta@@f#i%45IgvSRGFSIEo$MV^Aj7`Ub&KdxyKG zmIZw=g;`X)h~Nn2LA~EV2?7(5r03k3jn1F}LmsiKQrDcT6BmC}o^mLhPZ&xQOXq&2 zjw(U_oHs!<6xT(%R89A4iwBzOi?*s1YyT-^6hz7^6iwW>B8f9%^mrYdX6!wM;|?5Y zt4*1LDcZ#q;^&HYk?C5*3Shxs4UWJRf<|P`0%VO_ul$LGMcfEpWE&z`k->RAY<|T) zjeLb8ec3_*9I;+?f$V(c%U;Qjjvm2LRCaod<`WK-#D>xUXZ`x5mNpzsNE~323_w<| zPO7PKF$cscU5s+2FjbT{4|mpYNMl_#EO&i(N>`U><3=xv+>RZ-!-p4-kK~;`mUnVA zbb5?1(ZGqJ+{wO`kB?@*^i<AYeGvNO@1xf~Y`t}D0B`f{8!z0w^_{!7-@JQE3?G3H z0_e^=YQ?Aur^*<_k0J+xkVJ7HkOwta5JMt*K6~q*zCa#v1zB$aqJQGP$%uF|dE;sT zg90K%k`$$el0lOJl(-=7ivQuVq-m2>NTFWdd>zl;t^b?7_wbJ5${KyG48~zRGahWz zp{lwS$Y2Z%U@$r7oNRIifrJ7g2Z2ZefdG?p6o{ORO|Z#1nylElTLRC2@P4O`C~Ls; zU4M7x-TUskPwT8&)vfA^`&WCPefHkRnL)?RRXEv^HvpA-Y@co6Oad*G@k5ljVfG2b zapeh=`uDHYwrzPbo0>HXC-Ig>9^&8s9)$IaA4a-jzNjtOkyybOU;e#8P?N7in&}+z zFJTPm#lfU$$0!4)o#Aajz<5iSqV&&oTn#}jOV+#VLehS(Nl`TZWeBPPk<>)*DkJ0{ z(IVc7CF?-JNy7VEDyggjEz6Ms5x<qqK#4tYvE*@+^~P~At_UX}2}t*W3%Ugq`sA&g zEt-f_I}(NX9*$VS2xQ4|*^Cu1VOd_x6U|P<I{yM9=6#@%;=~1_dcX&*C)X){ML`Az zf~imP+2>;7Fv1ujD-pIGRwXtpCN`LvVW|Mw<ZCj0!kacD=$c*<`9Yy*C`hUM<$KLr zpmB(Md9QJk(7!i8TM_vnvg)W7f(b`rDNec0of%`L9>NDHlVg(NY)Rvl$zv=KG<k$& z@+kB4Nv2f`EVs^RMK7WpxlLV#!@SN!zk5Nzvn=4%t+-O}fpDN9$tC`EQl3j?+lN*{ z!qG>_zp%}8ZGx83RSzi9Eh^4>U9#%e60{QQtNDf%@qJ*mXkr7=T@p5)&_sL$H=&zK zIo0>iQLraz;^=trXgX7V4<FG@SzfoK36$o$ic*~gxW^k`IAPCBSK~)v<0%9I5=lF8 zRON|dtM%zqu|tRQ?c0$Lh^_~v;3iE_?xG7xZU1`pN~@0JnW28smvv-4v7qKHf}1rD zsaKy|U_luuNpFKR?PO>ceOts#<WT6+g~0<&NEc6BHu>5&mI%pP4FUT@P4CVdTe1`O z$su$}7KWD5GlCZ=;H(&wBy^A^>yjghQrVMaC+v#dBJ;-IyAZJlV<(16Vn6Te)y#<f zM&RXju`7Vm)l=z}f(B|up7~qXZrql4SBx9T1<J;am96Z>a#lP7UTByH%!N%=d@Q=Z zH(<z>h-**^Y0xm3w<1rrzW$Wuv*tzGvQ<R0=Hcx-5D^!O7+}cJa3(ZuD*OqQGo@fc z@80Dw<fcxxCylctjy5NbHYE%<O&%3FKf$znjV1qyt>Br>nfJB3aDb;M!S9*Fc&OmW zx6<dqmJ<>y`~JEz(#^S2qYE{JGXZ_Hnr_bPV)W5!n(otHr8B~E<*UG|*8-)i*TpMd z6|Z<*yz+Hm`Kw~SU!k`wv0l7V|CQ)WiGGuhod`FD?#+Xp)o?1@fMsX`s8Xi9Sb9Q9 z36ucJxy<Wa#E_P=U{ukIW@nGv(`Tv^M}iU|ueSJ+F$rU<OdMCWU%$V0?Hb;`eHiKR zEn9}PXdc2H!<k8=7%V+XfI>sb22G8=3Tn|ZxOod6L=X=GRVByc3~vJ}iD$<Xlqey4 zQoy8Qk~A4IU`WNg0%LshmW&~IZ+%ntBfl~r;#i0lYQpH(pgY81N+t4f1V_?EFHtfm zkY~tF*cE%`aK;}$m*DV2+2qHvDoN@!DcD@5+|R$d7UO$)+Q!}Zr<FInus6BevP&*d zHu<{XD&$FWdN_P|5XAEk!w_X-z+FUo<8Ed4y5`M88hu6lzj&;FZ&2!a<8jk4OE5No zh)O$pu^mzD7mlb?Dr=VZ=<!~^eif49h`Y9?j5Q~YG9`^PO&J@xWS05-AtnE*t>C$h z*fw`TKTpv}uWN?S#gNcKMukAh@1bY3LRfdgo2|R1b#qG?a)xXR@kY)WCtAhms=mxD z31q(VFMAcpc;#REDzM}=t#~o*RY0~yuL64WFM8!)EVl78GAkQ{wkwMLD~o-r7^np( z_RKQiTcr;+@lm+=0$x4}ibVrz0XsCU!u_r*CQw@9am*sb0!#JiKHHpRWzujAJVI*i z38P~Y##N3VUv=O>a;d^83em1zP^*^WwL^m@x|8T8sh)&}(p{ZjH4bXoD!6qU9z>8V zRtZY@B@C5>16+o=;sgIDl=Nf@<GHg^RvuV?7p{L2CtZ=16+G4@LGnvuV?*8$EkhX@ zs)SRb+y^83EamByrGV|_iIqjb;K+c89~$i~lnm9zuH*%>L*vrqZYc*RSL8XD{cqWO zQubaM>&8XN_XFU_Cbg}Eh;!rSONgktfGZWN8+Q;EIHMJf8wa;&8S+(QlJ80hLgUB> z%@THa?y`Xo5Xq9-)K~1HSCISWoA)P;wIq(Sq>MACj58&THqD%9TAOaU_p=H?g*rs8 zf<B(2VIrQ#G1&)7?)iQXQ9AUGR)|4WFGH)Vr17Tf1p(2UmKE^nqpseJVw!Jhi7%tX zzof*!sKlRMLO76rc8PyhiGS)V{}h%bzLXMgQi*r6Y{lM$VsCP>H?`P1t=Koa*f+P> zx1hwgsKmFJUFnT|(ujhf3Ajpu5(BtznDXI;pdZIKI!ZcC3~YH_OFYh5uELQ8&tkH7 zY18ACi6aQfBO}9}I6fwELgj?Gs^1L!Q|HdX9XpD~eWQVr)aKk$bQ5=&yUqKmY15!K zZG&64<v|c=SK5t|E<T<V&#P>DtbvjttHyI@1xcVu!7${c>`GaoDl2Sd*WVIF@e`d; zL*B{?7&0&3(p0flgIG$A_)@AQi2y(39N3RM3i~(y*iz!dPGplGdHM4%d5u&;pv(nV zM@NZVRJ!~u@jPJTG5INOG}g;rmt1GAQhDL>w978#T`Efr=V>&~+;~NB8j>Kos1hQo z0AXzNP;dkh#DxW3=gXk4n+3OOMaKsNPdrn}4il~Npn2jnCX1B#$O4S?hG?P&W3Tsy z3@IN!-jW<=NsTj48E2Y2+B9u~Y3*Xm^D7zz35Z_SapiaRIEK=^&hb8HJV9}O_bk7A zUcj>`;32T5EJ`{)x(o-r5R@sxenfN}TM|1rx7a(o*gGo#8lJ>r@1%fdY``<J*fS#F z8C2})U+nJdcXjf+I{01feU4V%qA$HgfA=|>`<z|<t^t1c;DBdTu_rFznH=yW2fS1D zz0D1H=M@XAB&Ve`0hH)cp|kuFYB1L|l+aB$M)W37%J4Wb@CH497`=JDmN*WS6hiWn z$3`Vhh)$YVdDyVO^z2D|6qQ|rDDKLA;~vrkO}cL4_VT6zsOBw#+II+U*CFKVrbIl7 zJ``H17S<gO2YmpSF<IGBl3IypDrw>=BWY6D47ru^V8CU_Oj$va>jq!%3L)PZ|7C^k z<$l<$*uU<hM$RP#$UpJ_aKw^z10_yOo{aph+#!30CgYEdB|cmcO|HwG7${M<?azA2 zIF3$i8-*_@ugxhz6XijGNN1|_?IADCxa!iCGAhR4g_TeA{++ys@^Uz+Y!YYA1aq1j zE;C;+3`!xg3u^(J0T*1|dZI2|n>Gvv;Q$v86vKlCII^|UrxW7Q(+|RsqwH0;ZldaM zpFZym8dNSZ&YT)=nKscpb)ry4Q^rRwo^HPVgIe_5R`ddMjwsVs?!um)q5)pVaGz7e zWBZ82b|?Ei)BT>=gp~>{<E5{ZsmH<*4u|%EEW8jIBDmBu&+nP(cc=Q@34ZqkJ)-*? zzq6Om+0j#AFM45rc-3~}ymtAl?WYskPseO$bF?!#wp06U$M<MQcWOs>XeYC6Kjzqe zI%dCq-d=b&+MO5U&X4suI{KXbe6GQM_ox75xgiUzh<9D2tEY@NhM!IoDCt0zHTj@P z2P)I&qOX+VD(HLhf-P&Ynm9&D7_N}mo-)BcB|au4A!gXHkNWlv;*N3OxO<>PF<9;= z^<7&u7dIKEcxAO{8PuUeaK}zOh@h|Z>CZq(Ivjo*mbI0lL|=(#%EOgX$Ky60y%aq8 z8aLpQZ&!mdgD+#n5IHG<?=IyAa(iUYkU9=0Dd1#qdedbPu5X<Mc~<gF%A&;1B~1oL z21M+{Xm9PLQl((>ee~nv5)A&Es3{tZZbC_Y_BnGO<IO9z#5hTLIAev6@(#$;HctL6 zYUH)Z%i)wb0eLb~4RON>ECC{E&e3lLA}l&=1|AdMp;oPe+qEatf#6c1eR!-qVj4Xl z9yg{4&mAj{DY|&0@@nnhUo;Aqju=rPHNiYR!8~n}dHMu%>bS_XWYd}bO3@<$5sj=L zcVTBwQ6G<EfY&+H=N#^HjrEh-;KpS)CE%GJ@Sv3z6nhs6jU&K8J)wFQ>iEp|xl{bE zIDX}I^zjrnb>-QgKeAsrr~YtQJ-kcF-eldi#<FXbW!oyt&Q;dE>$Uw`V)t*0Ij}wU z;Lgf9Tch`HjNZS&zITmn&uVSYcj}%s>YjDl{!QB99VGYJe>i5p{G<JsTT$-Z7~t|c zy7}EB10L+a8O7c-0hB+}ph@pc36rn1>m)jKf+K?c#Q2vpjid}`euq=Xwe(qxnpu-Z zsmWxxPmG$95HohnCj$nEQpwypP@;%sr#A)sxwqV8no##`QCPuUy7C|>_bLo*`l_g; zFZ7w4cwR)~8$Jg{lz673GVzFMJZ>Jk6g>GF|6Q^SxTGMx1(%dP(xoLV23hi>l*zKv z_!s@9Eu~J19L_q;CR}#%eB_x(S>=cZ#m1h?a%2dt!BN?rAmL^+bwn}Ycw^wlU<gU9 zP-&!M#gIyojE#zQc?rgKl|5U79d>2#!pWDVM&3i?Oys?lhMf6Lh8>znBsje376B2S z)jGsxHxk|3wrxXj7V%b;5b<PT2L(jq{VB`Qv*e{prC+4tn{VD5HL83H_#~KTPBPD$ zXi6O)IS=pLcb3BIr4Tvu>Pn8hMSZ=F0Y2w9I!7b@?y-J%oZo{=N<j+*JhK8QCeiTY z&4L}DE7|KL%zK!puzSJFsGrZ;j^`-*w<){VDNwT|%d(x8Y1y^fvUj~Td$W3Imv$^W z>O@ZL@tn#>vttkMjXjcG?a2OW#|~6GmQ&+sPVFQ6YaiNMD`#ho?5$PzZmP0xbCrD? zD(_sa?aoqnuTl4H&~mnEKOVL{zZK;vtmkv~^t&+>0SfiBu-Ly`4~WGV0YsRZ0wvkr zphOHg5#w{*MPmz}N9SZ~(-W+Tqm-nv>ePw0X-QEtrbLe#MedcjZy3XpChjUt-eE~o z+jc=+x(0XY#)F{8DhzD=4~9yTzPrkLyenq8Ou;}a@qDE}oX0JJGMJK5Az$@UVB}H? zk`!-a`MYEplK<}e+z>_Mz0J`f$fk3|I!8AS{VqyS2~Eb|TcRrkSOO*Y!<jQI#X(DP zcw@)n|K}SS(f2Mj{7W8MUUJ!+K=CVadiu*p-Y9uEd1$fJE0;<`j#rkv;dD`LddgU= zUig=85fGt_zN||RH;7`t9XjIQ4wmMed_&4dj3I{(;w>tR()a5ps?ZM}{NBis5mR(c zG&{*OJHa${LgcIj)7nLr=Rav!bdHxayDPteyP&zJuobU*ucN2eiAoyabB*-5&`RXo zP4s)vN|SZnM4nv&CZE?i!s8&+p{p~m#iRSSlLxg;Ypk1AShg;=Y+q^Fxze(0rDe|= z>z<8D_Et4#mv(TMb{P9D+ji`L{di8)vHdXzcSYxHkILB+wI6-7HHLOzTjiWx)er2b zx_?{MgS%=R+WSS$o;srK`eOg~8v8a?-T9q;_Zn^YT3gOm?ZRpM^V`v`r<L7>t$fY_ z^rUp%v{cX}+<F9=OV1uO2`>blI9)3dOuN+MOm!6uxP8sOdO6C-nl#2bB~G0_*)}8D zK5pDcym>&07ZDAbxSx1wKnX?9trkkZT~OC<!QHxtv}zUfwJ1U^P?9PMH@Feu5Cckj zc{B_Rnp8~mm`Z8V)ze#YDCNYE>ayZgmMJNsrOP+*q6nw)eJOOhi(7JJK!gw?csRYO z_RkWiCC<h{%c5l9X>jzm48OUGw{{}W7BvJotg}z!+)7v8jN!i7@}E?XJQ;a6#8S5* ze*;JNA#mp0N!hroGzpQs+h`&gv2R#(_*8{aSMNQ%LrnJFxpPSCHh8~FZ8^+2o-YK6 zBEVh5E0jl%07y+VWXOA?N54NK*)%)RJa@8bW}IopcvHp<^Yt@o(L)K5&6x{F^#n&n zt!Q3H51*qql1cNshWcG2NniE3M*Cc2e9lo`VYz+dDeU6P|GMaT)Wz?$1G|+iS<2Q- z1$=g_u<Tfk38(DZsP5US?c1U4-(x?N9d&qL)S<n$L)o@Nd$fZ)H7MA#*2YgZFSTx1 zV%fA@*^;4b%TzWk6K(TyW$OxcTUPY0^;NUCfK|-{J8R|a`Qq^YFAwee^1zPjdp5=H z+av%ykrQ?KjQz=#Xvd?f?t+#+*C65R^Wx>B(<D%097<$u2xo}yd=NGsDk;O~O7lA6 zoViU8?$c&ZW*p6uI$oJES)Db-79an~$dQ60ZlIh~MrtK!0wrEnpwyv55D?MYv<_<4 zR5%}`N~(+RP7f$5RY`grI8PG;gU0g}T1hX5B59H`fILVIRVpX4-%;lED~0NBZ~V+< z1<#OqV+ARd>n!D#{G4&3N}mf8j>b_q9JQzHQPTDOo3+W7kSoQWpR+5eIM8v%A5jqK zG61CEIj4zry&4R?En@Z}O~RdyCy*g3Hjav>erYfti9r&lVG`dnnHS%%C6lr8Q8p^e zk-^Qs_}**@R+M0?63iZGnnn_9u+0{tYNBeEY?LdJQzTR8Dz-AkggI7F)oLL$BKE6R z2_nm~W{n_5i@yAlgd<!E!Ht^`5roG(xNEo2UVX#5b_?s=CA4#wU>eo4nJKb+_h9Dd z`sUk^fqE_a;Uj`+W5x!@#g(5i#WHWIWqztTElHr1KE-rmuTpqjbH0Qi(Oh{pPvKXd z!X}=g7G6g?pQDT4*~91T?Q;$ExdsH>-}>Fd{O)gku5Z1L{$58HcR}5}=l1g_w7na( zEi2Wn%at8j%Fb2Fe)=_Qwe6duc5aK_vpYIxUrf%fsDpd$#}8LMd8FFW{W1HuXgjm4 zn=>t&mYFv#wQgE&-AZ3+gK}uIdT^I|I$Qfb+jeBP?dTrc{;en-b;l}g^D=ewO564| zF?%*u&DmM=NH&Jw7l*TJ9@$&t(9WudcEujw8~fw2m}_Tap5BacJ`<K+F^+WK0(}r_ zWl4ZRVOnX7gorr8TaI_pv(W3B;x6oc^|Ed00)-*zsS~WTQ`EHS_62id5)wZeH!gV0 zxX@w4LcSeLg@0~rD7Uv?e{MBuD42Po2Mi4B(>Ih}QiqPA?b?T8Av9~w5IM0B!Njjp z0)-IPI(34+tP@Hl@XA$~$yYBwP6dEyA;1Kvpbl)dV7orABCazj8$vRzh)oD$BZZUd z(8wWj#R>w(5_z+jSw}d7O=c>53TecYlENuvm~|<f;=ksgsF)Bc!LoBff!IG~j)Gz< z3zfui<<X%)f>26<;4X+lhzLJA#o&lu6$T;AZvU;xZ`dueE%zobgk!~4mZ@`GQ3$6& zjyB2KQPCl)8eFAncyvq%ywE7zL`^f1XBxwF4}{!PlQXnRHN9?dba2(`6g>+kO|^0r zqP3aV6>zw#!PTfw@?{ty3QU?TYEaiFNISgIS43!2)<#s;s#l)?hG52tnl}sW)VX}8 z&JjI&mh03xv}f<oK|{(79bUfwfbd?uLcbjpK6F^Q;Ugjj4GI}CB4T{p`%KX_DgOQV zgzyP*A@T7c$;ltipJ_>-VOcoMnwDr;kYuLM^60$g`o-?fx8n_<vEnJL=`F<b{FTqq z0!MVf)h*!a>38)FxCaK@z5Om)Pp_k`yP%#k&-TM9W!D<(mQ~6Q+G=IbT06>R@5ZR? z9o6>is<v}S?A|@GhY!{~a;W;zgO!i$k3PCTHfLMR&NbS$3}wS&^Oj8O&b8L;E$a6< z+WF(QyI1XwXHmYw7++D0-%**RD>vr;jp*waqt2g-K7AnSz-IflEOm3HeaEWk-D}xZ zmBah0o;XzNcuwu(2WlP7u681)^10(xul-o%!Ic>2lUiO!XMvJ`L5V+u@CngG+!5gr zIP?gyAXp+(cuPDpyv{*|FQayDRj0+{!?eszR+r3<Su#I%=B&R=NsUNOd4F;u#mPfQ zj0_n&uH1x)<wuMv2T;R?mm4xPV))2%gNB6n=^NIsUqrut<$CohN52(2p;M=F9Xprj zz1QUH(3UMC$jkWp>j<jT@MJ~&aD(tK>yoof;8p}R)5xr(t|l@-r5b8f3JHnPYpK<u zb_9uI%>5C<+>5+yNyelErDkIrz6ocYH#3cYQ4q`)Ma2LFEEFk?juF*45KE>#W&7AF zAxJ*ELIM#y{U|{-Yg3_xYL+_PWL;H3qy^XF#U6{mBm9WBAP#|NpXddHBQO!LXu?fl zH2Dqx`b|AiQ3o(BL2$v6slYWGDnrl|t)D0V6^KQN#5zuu$|3gX5UVOK3XZDR3g_BE ziFK8?O;m8LFT%mfMp=6rMY&^wqhm#@RwJ}-{fJnK6B6^oR4jGEzN{Bcxm2<tYJEY` zlAyZvsh%3ts&xd<g;cxlJ<E0J7S_E-NdJN1Lxz?YI;cnRuo2}4enTz#(1G6u4;>ah zF~0op5uuafE5uC<9~T!qIjQ`tsg`-uEQ@AX(^D<;6D=#|S#F+E^HD~^mIERi5a}(- zTl9tKxjUNagE;N|u5Nx;55KFI-`UOYYz<<ryr{w#+OZsEbCzZ6GRuxEZSPw9E_Bd_ z*e&a#c5JP_ZEN){TVl6ujo!VZ@}d1T_EXzuUv&0%{BO368P@fSEt@l}d)8S_A5gBH zxB2s;1FojUo-QT6!LR(IN_-Pu`Qu&(CcXAgD)GgY_{NlY8D{F?E2@0sV)U6~_5(X@ zTeEB%mup+IqV{c!IkLOPu>&<v9;tl{VE0!&mQ&@2qg8%78GHZd%8o}hypFD7R2Qv8 zD22{ZNr2I%RV4vzyv!0G<6MFxpKF9Gzw!6qtBdBEQ^ylts4SRaPoEu?o)$Z6&R-Lf zBF2mn5Dgw0JY-1d*zx5D4-OwNFl5B2_XiCQgQIT-h4<*mn=QP1kMJ&C!&<ctMk_H& z-n@Be!$!ePnufJ#RlZK$;JS4}n7NM<PfT3JQ?B2DD#s!98bs7!QpMU~6l~`uOhGWp zK_ect+M-x4A}0ifOiaFqof@?$0~L&zA$3)%g`us`P&9-bWROV>f}%x{L!=b>7c{|9 zl;8p(*UcWW!>ZK<RyAs3`~+98DGI}~F5mFr!_hf38j2%I;|&dh5~LX%NwZMeqVL+J zZ}pN;XE2Cfqx>~Xy+{$p8|!+(1eNI<sJ2ZsDN2?j3RO!r;Lj^@s$r^vVq#{8V2*`) zCF?;^sGudn>1A(7?+^*yP3#;>oW>i5nMb%|XseiLk}-oS$B^bMX8CE{B#fxkdiCks zMzm=g)~RzyzX1{b2S&7SAJn;15VJY-=@Z(kS4fW@%+eJya#Xot!^6gmjTk;Wbi|0D z@#96$C@s~zFx5IQ(VU)SI<ZT6cusZPwK?%E<k_WBCl!;Yu)4dTmba)8&F5rnw5^xn zQAZ0*K6gQVwtRG7&E9I=yv(vS6HkJ5=PGT_y68<=QR~-KS+yd1{kj_K)>c{jUCjD* zG21pq@7q~*=cedw->F-cS=TSJez(Z7W0m#TF6H(m#qX?D;_dayH~f`<;wyj3>*5)| z7SDejn6F0)rN1s-$oeb)+}FhfKM?aUsn|QzTUh1J_2^T_Y<Ml!uTZzFwCz|My?0CO z;p}RMv#TH29h0-C^5N_%#}8D#aH8_P%dv%zYSG0DxRdZapp^tTenz|SKj5ohTrBFS z%=5cv;w^FIw|w%_wtkHzdAw=bc<Y=LZSE9X+RW&w(>|RL$88K@R;GUanD2~<ILmW~ zyLJs8Ft8lP!0-{}`}HUEH?&)KBJe}owj*Ge6idPzg6e$1+)NmCR6(aUvS5S+Odf6x zYPwbx4U<Ncz}4r-=AA6w+h%kD>PE;(R7{wPU8f4ULTHgOMFp!+f&}z_H@ZNq%kC0V zhgga{wMYy<QScvO!wj=3A<_bbEbKI1^1y}p#EO0_O2r1(u7mOtFMp^+BS^cBb!k1a z6D&IR$<A>X7#ta$tkT}xJAMY~8<CwXc49QW<A&>7d_%X3eL|C1>UFdE6&J<8ll(cG z381)4-C4((MA<3V1AwB7N0UeA=D=6ws^QYfP^F5vtEffUA;rmqtB33`2K7jYAR~sc z2_93^ri847^yw?!et3;KbPVp-KcY{cuwFfxev81lkl`cB4g4l#&>-HQ?+qRL-o&^{ zGm|3cCY$CZn&wS55kz<OxcdC6=6C`}rJW;*l5X9_xbkA%1$8`yjXj0U-386u1yq)+ zj~c?KckQyeeT`*(hJa`rPPt`Pw8Q3Au`8BFEl#&DT@tlsb<OYA)ckIB?3yff)7q$A zn_{=EvaMTUS--@*ahYY`ChJe96mNko;BNiOH}cm&%CE(9Uk4WaTAcA~@$z4bGk-0~ z)C0d)5W@Ov$!cQ431od8SX$y2Oo?y^_aIMR^ratcIs25YtCUSy>bCE+>}|2xyJGfi zkKVIAcF&H=IlE&|?2A2*R=N^X^t7%=)c7Klg5hIPgDBux%uur5L&V@bpL?cPc<jfy z3%fCPcIcpWb`mPdGBaM8lcdd^7BwZcA{@~_5*+mn8Za<)z<@C3auS2HokX9sZ$Duh z5RAvLIQ3z8G%~OOf1M2fW)z8<4>hWbnv<%iI7BKLFIe%O#{rJG0*fkM$cU?u3SPMs z9<*A-gmF|F=S2-Qx{E-(qV*TJ@Bko$)V*O?Q#unq`yBZX(ftXGa*81v-uYs)ilTQT zyEgnpba^U?=mjK@4nF4~jJH@i^5RQAa&%oj#b*3U?utD`ngmBgBN!ZUR%Iobvy~s^ z*-8rJa24RlCY=?A>(BUTtjNve73tSf>LFoW?$Bhya22|V8=}8VjB^kk337{coyA08 z)LXz-1f};>z22a#s31pR@z?QmaI1dRB#2q+x^-u+2XqsYKjNkf?t-_Wv+&LK9}qTT zL^)obxNU(*cXvn5N{XDHY?_l`nwx0ay25hpjQaAL=6J4ir0XL%dZU%1TzN6B{2Dq< z_3_}j^6Ky}#O(Xy)(tBJL>re{Hn7aFu3KVVpBcR-vufI0b>19x?i@8eJvw7)%<`pL z)-rYN3U%`eZQ~N_hQ*ext1QR&SRY<heMNNx?!K?E-vU#AEnfI*$+BOISBO?Z3esA# zkY1Op*HdNJzb;<?Ysm&ZRaS<GV~J6oi<(`8Dz&+JSv!72-LhWUyh`1+M%%H`zHL+V z%H`4DWyS2+9D86_%<=4)pH9X6axKR3;%kp%u+Ke3j1&t6G}rH@ei6f71Pzi@mEd)Z zbrtk1dJ%p8oRTr07!P6E%}P{frr2lCt~z2wFyq&ZViOI5#{cG<h+cif%xHK=J9Y}f z;n2NTNSii6I8MtBA@Q(&^Ly*b=DZtutT?@mAtaOz&t2jpg^(rUfdGSyd;_zTBJ`GA z0hC1{#YRlI$iJ9$h8ddvtVhR5u{5MtiX}@ajdHh=0uGIOl74Rqf<XZr%OA2Ib_hXo zz|`PKO0sd<Wg(L1Z2VmAft|1iIW)}htJvWuB!icZAj_SzG?*%T6~-lS)lB#BDOkNB zOWd3{0e;*!PJ;{KuJTT>Y3OKix4H9--!UMLN|NJ8aD?BxabwuQM;Agw3L{6TBv9hX z!V#@^pWuG|Xu@I3ysN{9m!CGd(j4r%$)>sSrUl8SliAkW=hWPrnu92y7r*Hvfl{9E z+Bt>WA<A7)U5CrA4=veF9JOXGG_P4;S+`iU?-pCK(yhzVl*MWGd9$@y)0OGd)tNK2 zIkVM;3)GB7O6Fo^?J@<>HY~MnS!Ox0&-(J7=5y2!cm|gECcX~LeqFraA3#*H{MV9| zzZTO-M*^aCzm{?YK^uN8*~pS?beO_LAQCS8gw@R<;?C#j{NS$raJIU2t#!*9p_MkT zx3A8Onl~$Y>B5-p>tpush&`DTd+kSx8dY)Tx5iPghbj@UG|lgx?sHEUnn)<4c#lYy zA5iqN-qQyfrd{d;Q|biEtVCsYvTfGX=rLnH8a$Y(Hbs~a>K>0MquX*ownIn!-eUZy zb(<gt#PQKJYeo)*FdN|LEvGjSDSG`A>FbsRNpPfWOI}KsZ=%Hv5n@H6fq=ma1QDes zg;PX<>Tv>6EDf17#8Up2<y$BTj@}uEl_wyND}`C^P=+)Z9I=^1N$Lf;G%n<=pG$Cb z7>TI^79tsVQIL5T^r4>0!AI8l7ni_w(d0q-;inb(2y~^08Se*H<WZQnm+N}>(zwIi zYB=JygAytUl$do04<5Bm8sNVBDu|$<?mfcrwaQqaPMt(_O3z-{?L2EN`QX8Wd2_xu zWJp9xf(fGzj?z=i=%eNH%$JWS_kU9J?h1VbBRVW^FQG{~@gzjI?r5u)SXM8zz|oq8 zmQ@SY%yez(JnNik))}eF^l33uQ=<|Sl_@F8+}Y6!7er^IYbzEhtCv{UEn^JGdU~HV z_pas@ny7z?FP{Dmw%k8TGXC*u`9EG^%dNzO6OANU68iLf*w=y}p^{#S<wiXRkQ6^$ zZOdQzse?Di?;huMw7GS~ma|9QzFyh7PQ%NwWkc-Jg|V}zMK78kyLCgALwl>7JraBO zLQKKq+U~;cB2bVhK_C(YQIV3ut?^#xSdU|*yKtZ*w=prg`?4*wlL_AyrX3v3nHC#2 z@sklF!iElIM$V8veL}i*6UvD3BYLLYyNCAb&FDi&tJXm+TM}Us*1kh|Qp5Du9etnR z>Ux>hm?+^W!(2D(U1Pc`Sol)pSkjyRTyzk`JkC<o37gSZL>!uwWXa2KfV_E)OWBs< zCm}Mv5nt+JY0zW{o<x8{LovM}OgomW^Nj%!8yg3e`;;Me21jM(*0>hq=bXRz`5PSs zI0V#z1L3KE`dCcW`UxCWWV%UmT?IIN&*WSjh)e#fm<bU*D^P;9zg5J<rTl_WUTn#{ zRBS2ZR5?UhtmFk6C&r*HDABN=4U}+?Gf_)}hN3J3T_k$7J$pxV?-`DlwSD{GK7Av) zcMs{?mwF4KL^9w2$DG3yA)0P>D!t~&`6+N@nV)3ZxmLM)QYAkk|ADmYa54x#!@EuQ zKZyV4-qZGMQ?eFWNs?WaX31KhE=!9_pA$WAW=wLTI%{U->C-Dun_4+BDJCU3YQenf z3)7-jERN1hSJo{R!>Kvjm4}yrsCvNNtHd|%RUq|sVBYJ%!e5IQ{o~b&e~7GDmh^_! z=uK2U`L!6WgbrH!Iv`4*h-_Jra=zx3pF}^}GEs=tJ3ZhYg)`*pS@rN<b=wAPyr><U ztE^oeJ$F|0w3O(1vtl=`jybqH>gVIOr&m$3O}x%;^w_@y3Lrxe@fh@sJPyW`hq(*; zN{)^kR^}#KrcJQUnXJrC(q>ITAN^_IKzg7I%!Lx=%Y6nSMqqpO3h&lEl%6RDcDr_= z9Xf`$Xc5}BZA5*FpEMSwhw6%wDR`}et5>781_L)?h%4RzO~cO?ZnhBo{2tQ9>@bwF zp{FB7qEcjNrAnd536c{TDSAK>khd^-H!AhRGFfa==2;4w-asd%j)T&qz@tPAj#z)2 zf;W{G<lYc?LcWbZb|NKK{>oU&{TmFzvOEoNAiA4$2{=Oa{P{0rh|_}$CFLB5KK_^z zB_b4-sVD#X*AV!kwu8X!6Czy&Q~Z}k0V4JzHJ7AYUZC-Y;kY#8+{C-0;(L+8%o8Xv z6i%U3s+ZK~>C_D(`x1S`2yD0R;T=1ol|uRtc)v%FuwH!_B@FN0olv@nAw$9lvm809 z!mKIQc~eY_rdb&?T0Fyi`k;FKjP~e?miI_=zOYM`BwcnwH;L$=-@+T{6FGjdpE{*v zEwp6Kx2~LP%}fI#d)kbsDT&&gnbqRPYtyFHoG>AJ+&FbSv$3Saq|dLhaBj@<^r#i- zqW83SlXCft>dv?Mo$YYAz4FDs@=t#qm?iykzn0)$$apP049oE+{6nC$>UDs=lBneH zD~d^^&C+xwRg5yC{%Y1M;d#SjFqcdUzq7C7h5h0=LME)+H`umqjNSMhy`;)h5@Tkh zMlYTpwSB$)_&(dMA8dv9t9gn#dmSUZ&WVKGihK~)1dn5kn?yy&5LZDjDv+a(PM%g5 z%r;Mpv&>0QXHHfL5E?e@W9}qxr(V5+za3P*YuAu2T}12Cw>$$7aMZm!?o+alnP?!m z4II@EVzlTBG2e}t)q-Apty;1wdl&{h{dbEsl-e~?*MJOD(DJ%QHW2vFKBE?gn73C7 z319M2N)bXO+wbN|7+FX%yMd3a$nB*BN}2>px|m5xL(Fi>p(t6h4i|iHXd-zUQoN1b z8XT2<`Adl8&)I_k5mzCP&Y7TDfP!i#6+Xaz0}W9T3z{laz-$Ypkb)=!{yusNwH5ML zF_A0(5?HY%-vAvSSyG1qQ_#3N_AC#<Qr<Mkl`5Ds<dnEB%vX~hZijV;X-C!EhK(q$ z#aJH0Nx_U(ppP&oI&})|*(<zPPrwQ1v0}Xs9uofTAf}jnZ_JoVvs0|;)2xf8SQe&O zR?at{Kce3FQG0Mr%e$|0RN6%nD#;+|&5FI~iS6n|ZS4xio2*%B%8CWrlG*mTQ|+^+ zMJL3^Oq>`yWUw-EVwG{@Do>hJdHlHO#CUt!?5Ydr#H?H#y>fwN(@N#^A=Uld?sI$< zaP<{qL%!r!ff=v-GhYYNUKgkTTD({g6j&;n@HS)uk!X5?`D@V|BF!AK&_}o$Rxol} z;>UMK7l}}FJO)#VMJKBK@jctg!^+;R+SZLxTh_*GT2~E-#*K=ao*K1bl|5&t?ZRO# z{~Dp}O+1BtJt7%oESg9})fNq<kh0e?m^=|jZhcbezdx%ko@bpp!7_W2Ix|6?nqVI> z;!nMLi#V$uy+Q{JWWbKeqsw>dgk8-mD}3NL@Av2#hR3^o`)~?kv~0z@PE1pXQO6*W zJ_87&Gv)L$H4&eGhFgpo3c@2Rg;lHwFGR)QePT8QUdSRbhcauFxIs3M6WN&3lo_$* zx&aIIyNrxiR^G~iEt}0Je<+1bq9kPuX{RCoc<mS`V#&JvQc@rx;)gVOTzMdaBl+5w zKQRd6qk*A>=*_jDdIUIJsb1}beNx<>YlIy!{Wo;5E-wV2XmXvOpsM&NFY2R@@OX!_ zG;T%dihjG~*_P6zCt?WLMNDj|b%)!5fox`fql-k1wT6v?8K-F9A+&3^aJoqC+lTh- z8NrhsIIw*G{^8xb5tS<RQNMoSNpX?$QkC>n^MVvql4bKM%Y|d=%?s-N>sl^$-BWwv zGvRGu6iN6T-e@AZ!pr&oO>N%+WyxG~#w^Q{8I}dpmDG4^+-P&$INP`}(ftP~y?a^u z^if6(j~Ou{YS>Wg*iqKhMBDtCwk30|E9P6WH&}09(ioQVIok$2!%BP!uY6O`M<sqx zn)SMPKK?q9S{`7i2#y3zuc*>M;yG0sAjmJlfgRd%G5RC&YH4sph9Fr^q!uQ7iv~FJ zYF$069L!d?ZPM1QwBc=-J;Oe9a8&$+sH|o7T^ntuvb9G)qkO9qPwOrk<Z+PaJHk^m z*e%*1Pa!4!d*Ek)qaQCQ%NLU-Y?&TsogS~wNVF#;RMy=Ks3dG=LV!X#b_gMwkx=0- zokQuR;_zwKJO~d%<HnR23a&2-b`j7*pNPu0(q$xuet-yh!&<{Kp=%&h*gpF#?DI-g zh@z+zWkC3E2y@fRbv`06Oq3u6&)`K0*zYcl;tc%Pps6fM$e8i2M&>ymqK0sKvy>bm zc+y5PD3F3G56AwEzp^|^n%;tlJ-mU46`^`iLo~pl&O_NoF|L39SehemTu#}Qw=P^> zrg5>HE%i1zE-xis1w#M6sYQ%;)NEnWJs^s}<gQO?wfaFFJ4f(7B)+ayD-!yIZtBv7 zaoF&l#C>(c;~g<{7-1?ADU%}8rVzkjnxAN1G~IG+xAOBz_3C-;;dSlBeXZcJP)Q=# zTW`XOd#NW-kQMvP_T;|y{Uv3|eDi`-^P;I{0$eALGmjf#9x>G1zpuGhFLT!}mJS^( z9XncB0jPlktYavD7iXE3Y*{+nvM$4N^q|%C%;qVmO*E0<$V+@ea*2;z@|mxE(_aPV zybjEL#lWlJXrW%EfhENmDC2<Ak&Uj9XmU0Rkpt^pNPGgBwqz9g2}KYE`A0H}`s}WD z`iQb~lXcx{HEWq|!5sU@p;4noM5WEPZ(40TyhFQoS}S~LCq>a!(AzE45bYb>bY%0n z3wpZpI~KkC5{@ohQnNCNRy9orrAb5z*-*9Jx|g~`@i54Y3EVrReYI{K#NeIG<0CN{ zS1KL`>Fy@F7zYtHIhHwL)krBqD_`}7fQg5$+bU&+f#Ok2)`PSlZ-4m<l@CRYsejeV zil1D6YfA}~M9Hvx%A$m+iR+u?TNJP{(pVNEx&OB~5-)sRwUzxj`<K@!I4V`0qB@W) z5X63DWiVMNjCJZa>ZP=p%ksCvVse|emhWD#@r`le;%4e7ade3i=SJ@jj&R@MH6`i^ z(@y4<H*Z02H;kxn@+KI$Xxlc3mn8KB=mKNc_3llH)Q|xK$|c8rJ~JV5L2~4RMAOn4 z=2Lr>3&)k~KdJYws?Y9dxsNGNC%g?1B$HvqQco?1qZ_x?EgLO3`sOE@=i$PNGmji% z?%&7MyO+6BCv(RR=GLvvEnCto?b=$pbhh;CV;M2TniwYnke19dZ(VJ<dQQRb=Phh1 zBJ@0?O1y;n5IYJ=sU^N?ulzG!qnJR+pGGV3&n;mkKx8Rxp{V4*(zjSI%ODInMp21C z2zW>;r)M;W94LI(dfw9ncVUmhXR(*gC<k^bn>Hw`GPOl>?W2Z84I30SEyccerET99 z?cxco;11co4H+sD>=X@h74)Y$^Lsn;Iy>{)7rv-VftMS1)eY+`DPzei5iYwKlWob9 zqNxc(uag_gm=T(Y`X@3awx!@GguZH%uc=`xAY$xQy1OX?z$2ru2Ay17VT^Ymay(Y# z6XBHLAmql=XT=Z+<c)Q{k)^2Kk|pu+U&tH3k{cVl(sv>bXJ{oPTxuL?m=Uo<*c(fP zO=50Xbo@k~D(5M8$j*&FV<%jfZ2a7KQAmzTuT&^U0g>2=u6o#ytgTArJ-&e>QAYJc zQARaX$BK$}l!D|V^&vq_R*9r6q|{vempzm(AENI^6zpP!&8TR{%ZE1)?fnWOX<aWw z2}EKXnIUEo$f4qD5K)E12oZGGvUM2I#m$-rH)|fkyRmg^ympW!(#mkm_UJ|6H-kqX zBu%I^Coz)H?(`|<)$=W<_bca4Dz`4Ex38#=?`SU`>nJ_d@}6iIc#<Xzydsp*9qr5& zbxE3;QKz(I^Q?IDgb}81`<uFUHg)V^YSDsb{^~2y8aFn7{k1@;cTdZh5thUWmbp_b znQ4|in=D1Y5Vlu^&~ZOuuA(NxSW(Hum#A|@k&|h!{nIh<UioH~_@<ZmW|a8nh^3Du z$*ojiNF$yn;GGi?%QQU?cdk@J_^$n~DL~{Cla4XZh45P6xuPCBsBBxWtXZipoo^dI z%06^ZRLW#~R)%foM(x5;E&sNy=w&TuemhFI=&iRazbg<q^4b->Y*P55HXPk~tZmtf zCNj@p2nmi7;3%q3pAUb7NY8}j^@Tpdoa0s2t|J|y(mE$_MDU3$aw77K%2fGA@WlIB zmQ;OH#>$XSB*AE9U(0`F9ceV0++OZV?i`dPwj7!hkXlJn06WAg=uU6Jk^B+_3}wU* z%R<C%jX%kwWXD*(y9fEMK)k8Y2o6llSN{DFiV`FIfWSALIb2Yqn9|&wJRiY|im7l! zt#9CBGb-nYg#~^1fnGgTuS?9wPd<s@=S*@$(Qmf-<j<nKDkW7Z8c8u#I$YFK{rq$K zn<!j5q)e+9!EC=olGLaX_GMk>J7yW&z9a5dra%g5-ys~QYxf?af7GjYIpV&=nESUP z25i{ykEc#H&7UGVM>xHSZ9BDJ`RSx`6^^c{kM3#DAJ|?#vE@G#Rvf({IMTaI_WUQ> z?Yrv1Q`WQ@rnw~jC7M$vm_`mZ_30TYAZl)I(!|uLp{ag-Q{B4edi4ZN&6}CKbh3Qg z&oX&}W&Sktn#Gn=2ds{#HbV8NtDx&662Qk5dnORuQ{qcPE4}h3zxJb*rr~@L#-2b) zZz6SQx=0oG&`4t^_ZAoT48e|QQ^jy9byt8$aKr%61W(ZrXMQWjdC#3tcI~jPg`+fW z(m4BwA@-C+`>G7v_VwDC18V*)E;GuR-^Q8W*_Dqi*Uc$7YVF8lcE3i2FRH=O)92c* zy%sJRj+g*?dc2K_%{_a5h$ceUql~}@i1blc)&)mx+J!W1#6+>Bfj|tJ;}pWhibW@t zkrYwm6)i;TO$R{={JXFiT>S1zaPWI?wYN4iXac4GLM5R`$Oa;=&!|gWRvAf%_&Ga~ z=gCowKgki`7!XNiRCW*OBY~lAmm=80eybqZVWvD35cBbgS@|NwmmwjzS;E*q*Tt8B z!+Ka4{i!g%0T!6j)lDedGu<8+_@_@Im^Dch)vrJSaDiTh3Zb9=jV~FM);aofSjEpG z{`?7D)N&ZrQPB|$+o>8;OEA|}D1F#3>frYd@6ij6LOXT}$LB!FwT_*{SOzMIG1>kD z$}`e2WXNYzCRSQB)j|b^h0`tT2r9_2o;|HxxuD*<p+0)3J%4I@`P`QKQUj$t^bsgM zv*kb4UOd$<-BkA;w9e8)iAbBBG|DufZ)DFNrZ%ljO&UiwXke;S$5gA9Xm!3Y*Q;y( zx{0}SN31?`+$h1(x)qk6&MNo-J%tSjJn*~vqmKffF{q?s?|4wsX~GANR!T1MCg{c< zG_fw4UUX|}v4?UHsd}3h5ctR@Az~CYo=Gr$&N$t7Js2%h_}F&wf|9deS-(bIny$r- zwT&EVpF7L8GDF+4Rz04rKEEjnBI⁢i#)KzmpS9l-nF-1V>b0hNA~hwcT)(WS$vk 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 YzNUxzKmJ9LVfrM?8S&qFG_?Q!1^3_N6951J diff --git a/indra/newview/res/resource.h b/indra/newview/res/resource.h index 1a1ace82ae2..da27e47dfbc 100644 --- a/indra/newview/res/resource.h +++ b/indra/newview/res/resource.h @@ -36,17 +36,9 @@ #define IDREMOVE 3 #define IDI_LL_ICON 103 #define IDC_GRABHAND 104 -#define IDR_MENU1 112 -#define IDD_DIALOG1 113 -#define IDI_INSTALL_ICON 133 #define IDC_CURSOR1 134 #define IDC_CURSOR2 136 -#define IDB_BITMAP1 138 -#define IDB_BITMAP2 140 -#define IDB_BITMAP3 144 #define IDC_CURSOR3 147 -#define IDB_BITMAP4 148 -#define IDB_BITMAP5 149 #define IDB_LOGIN 149 #define IDC_CURSOR4 153 #define IDC_CURSOR5 154 diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc index b360871f209..908c4e1da3c 100644 --- a/indra/newview/res/viewerRes.rc +++ b/indra/newview/res/viewerRes.rc @@ -62,7 +62,6 @@ END // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_LL_ICON ICON "ll_icon.ico" -IDI_INSTALL_ICON ICON "install_icon.ico" IDI_LCD_LL_ICON ICON "icon1.ico" ///////////////////////////////////////////////////////////////////////////// @@ -70,55 +69,6 @@ IDI_LCD_LL_ICON ICON "icon1.ico" // Dialog // -CONNECTBOX DIALOGEX 32, 32, 187, 246 -STYLE DS_SETFONT | DS_SETFOREGROUND | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | - WS_VISIBLE | WS_CAPTION | WS_SYSMENU -FONT 8, "MS Sans Serif", 0, 0, 0x0 -BEGIN - CONTROL 149,IDC_STATIC,"Static",SS_BITMAP,0,0,187,246 - EDITTEXT IDC_EDIT_FIRSTNAME,9,180,80,13,ES_AUTOHSCROLL - EDITTEXT IDC_EDIT_LASTNAME,98,180,80,13,ES_AUTOHSCROLL - EDITTEXT IDC_EDIT_PASSWORD,9,210,80,13,ES_PASSWORD | - ES_AUTOHSCROLL - CONTROL "Remember password",IDC_REMEMBER_PASSWORD,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,9,229,80,10 - DEFPUSHBUTTON "Connect...",IDOK,98,210,80,13 - CONTROL "Full screen",IDC_FULL_SCREEN,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,100,229,50,10 - COMBOBOX IDC_COMBO_SERVER,98,6,84,30,CBS_DROPDOWNLIST | CBS_SORT | - WS_VSCROLL | WS_TABSTOP -END - -CONNECTBOXIP DIALOG 32, 32, 282, 174 -STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | WS_POPUP | - WS_VISIBLE -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "First name:",IDC_STATIC_FIRSTNAME,152,24,36,10,NOT - WS_GROUP - EDITTEXT IDC_EDIT_FIRSTNAME,152,37,58,13,ES_AUTOHSCROLL - LTEXT "Last name:",IDC_STATIC_LASTNAME,218,24,38,10,NOT - WS_GROUP - EDITTEXT IDC_EDIT_LASTNAME,218,37,57,13,ES_AUTOHSCROLL - LTEXT "Password:",IDC_STATIC_PASSWORD,152,55,38,10 - EDITTEXT IDC_EDIT_PASSWORD,152,71,123,13,ES_PASSWORD | - ES_AUTOHSCROLL - CONTROL "Remember password for next time",IDC_REMEMBER_PASSWORD, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,152,84,123,10 - LTEXT "Return to:",IDC_STATIC,152,97,32,8 - CONTROL "Last location",IDC_RADIO_LAST,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,152,109,56,10 - CONTROL "Home",IDC_RADIO_HOME,"Button",BS_AUTORADIOBUTTON | - WS_TABSTOP,218,109,35,10 - LTEXT "Server:",IDC_STATIC_SERVER,152,119,38,10,NOT WS_GROUP - COMBOBOX IDC_COMBO_SERVER,152,134,88,43,CBS_DROPDOWN | WS_VSCROLL | - WS_TABSTOP - PUSHBUTTON "Quit",IDCANCEL,152,152,50,14 - DEFPUSHBUTTON "Connect...",IDOK,225,152,50,14 - CONTROL 140,IDB_BITMAP1,"Static",SS_BITMAP,8,7,133,157 - LTEXT "Connect to Second Life",IDC_STATIC,152,7,78,8 -END - SPLASHSCREEN DIALOG 32, 32, 144, 34 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE FONT 8, "MS Sans Serif" @@ -136,35 +86,6 @@ END #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO BEGIN - "CONNECTBOX", DIALOG - BEGIN - LEFTMARGIN, 8 - RIGHTMARGIN, 180 - VERTGUIDE, 152 - TOPMARGIN, 7 - BOTTOMMARGIN, 239 - HORZGUIDE, 44 - HORZGUIDE, 57 - HORZGUIDE, 123 - END - - "CONNECTBOXIP", DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 275 - VERTGUIDE, 152 - VERTGUIDE, 218 - TOPMARGIN, 7 - BOTTOMMARGIN, 166 - HORZGUIDE, 12 - HORZGUIDE, 17 - HORZGUIDE, 24 - HORZGUIDE, 50 - HORZGUIDE, 55 - HORZGUIDE, 84 - HORZGUIDE, 105 - HORZGUIDE, 119 - END "SPLASHSCREEN", DIALOG BEGIN @@ -178,20 +99,6 @@ END #endif // APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_MENU1 MENU -BEGIN - POPUP "testmenu" - BEGIN - MENUITEM "test", ID_TESTMENU_TEST - END -END - - ///////////////////////////////////////////////////////////////////////////// // // Cursor @@ -269,8 +176,6 @@ END // Bitmap // -IDB_BITMAP2 BITMAP "bitmap2.bmp" -IDB_LOGIN BITMAP "loginbackground.bmp" #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/skins/default/xui/de/floater_preview_gesture.xml b/indra/newview/skins/default/xui/de/floater_preview_gesture.xml index da385b72d6f..327d0b70f13 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_gesture.xml @@ -30,14 +30,12 @@ <text name="steps_label"> Schritte: </text> - <!-- Revert translations as interim fix to VWR-9985 while the code is not properly internationalized <scroll_list name="library_list"> Animation Ton Chat Warten </scroll_list> - --> <button label="Hinzufügen >>" name="add_btn"/> <button label="Nach oben" name="up_btn"/> <button label="Nach unten" name="down_btn"/> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml b/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml index 3f7d0973b97..6c373030ad6 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml @@ -33,14 +33,12 @@ <text name="steps_label"> Étapes : </text> - <!-- Revert translations as interim fix to VWR-9985 while the code is not properly internationalized <scroll_list name="library_list"> Animation Son Chat Attendre </scroll_list> - --> <button label="Ajouter >>" name="add_btn" /> <button label="Monter" name="up_btn" /> <button label="Descendre" name="down_btn" /> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml index 61665a124a3..177895f44ec 100644 --- a/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml @@ -30,14 +30,12 @@ <text name="steps_label"> æ‰‹é †ï¼š </text> - <!-- Revert translations as interim fix to VWR-9985 while the code is not properly internationalized <scroll_list name="library_list"> アニメーション サウンド ãƒãƒ£ãƒƒãƒˆ å¾…æ©Ÿ </scroll_list> - --> <button label="è¿½åŠ ï¼žï¼ž" name="add_btn"/> <button label="上ã«ç§»å‹•" name="up_btn"/> <button label="下ã«ç§»å‹•" name="down_btn"/> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index be17f1f3905..f72e4a8b7c9 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -171,7 +171,7 @@ def construct(self): '../../libraries/i686-win32/lib/release/llkdu.dll'), dst='llkdu.dll') except: - print "Skipping llkdu,.dll" + print "Skipping llkdu.dll" self.path(src="licenses-win32.txt", dst="licenses.txt") self.path("featuretable.txt") @@ -578,13 +578,6 @@ def construct(self): def package_finish(self): - # stripping all the libs removes a few megabytes from the end-user package - for s,d in self.file_list: - if re.search("lib/lib.+\.so.*", d): - self.run_command('strip -S %s' % d) - if re.search("app_settings/mozilla-runtime-.*/lib.+\.so.*", d): - self.run_command('strip %s' % d) - if 'installer_name' in self.args: installer_name = self.args['installer_name'] else: @@ -628,6 +621,17 @@ def package_finish(self): class Linux_i686Manifest(LinuxManifest): def construct(self): super(Linux_i686Manifest, self).construct() + + # install either the libllkdu we just built, or a prebuilt one, in + # decreasing order of preference. for linux package, this goes to bin/ + try: + self.path(self.find_existing_file( + '../llkdu/libllkdu.so', + '../../libraries/i686-linux/lib_release_client/libllkdu.so'), + dst='bin/libllkdu.so') + except: + print "Skipping libllkdu.so - not found" + self.path("secondlife-stripped","bin/do-not-directly-run-secondlife-bin") self.path("../linux_crash_logger/linux-crash-logger-stripped","linux-crash-logger.bin") self.path("linux_tools/launch_url.sh","launch_url.sh") @@ -642,7 +646,7 @@ def construct(self): self.path("app_settings/mozilla-runtime-linux-i686") if self.prefix("../../libraries/i686-linux/lib_release_client", dst="lib"): - self.path("libkdu_v42R.so") + self.path("libkdu_v42R.so", "libkdu.so") self.path("libfmod-3.75.so") self.path("libapr-1.so.0") self.path("libaprutil-1.so.0") @@ -650,12 +654,10 @@ def construct(self): self.path("libcrypto.so.0.9.7") self.path("libexpat.so.1") self.path("libssl.so.0.9.7") - self.path("libstdc++.so.6") self.path("libuuid.so", "libuuid.so.1") self.path("libSDL-1.2.so.0") self.path("libELFIO.so") - self.path("libopenjpeg.so.2") - self.path("libllkdu.so", "../bin/libllkdu.so") # llkdu goes in bin for some reason + self.path("libopenjpeg.so.1.3.0", "libopenjpeg.so.1.3") self.path("libalut.so") self.path("libopenal.so", "libopenal.so.1") self.end_prefix("lib") diff --git a/indra/win_crash_logger/llcrashloggerwindows.cpp b/indra/win_crash_logger/llcrashloggerwindows.cpp index c938f209ff2..c9e01c8418a 100644 --- a/indra/win_crash_logger/llcrashloggerwindows.cpp +++ b/indra/win_crash_logger/llcrashloggerwindows.cpp @@ -259,8 +259,8 @@ bool LLCrashLoggerWindows::init(void) if(!ok) return false; /* - mbstowcs(gProductName, mProductName.c_str(), sizeof(gProductName)/sizeof(gProductName[0])); - gProductName[ sizeof(gProductName)/sizeof(gProductName[0]) - 1 ] = 0; + mbstowcs( gProductName, mProductName.c_str(), LL_ARRAY_SIZE(gProductName) ); + gProductName[ LL_ARRY_SIZE(gProductName) - 1 ] = 0; swprintf(gProductName, L"Second Life"); */ diff --git a/install.xml b/install.xml index 07b5f781442..ad559a0e906 100644 --- a/install.xml +++ b/install.xml @@ -153,9 +153,9 @@ <key>linux</key> <map> <key>md5sum</key> - <string>aa111fae0ac550bba5e280275eb25904</string> + <string>946c2e106f14f7a1e521d4a14e0e146f</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.4.0-linux-20080729.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.4.0-linux-20081202.tar.bz2</uri> </map> <key>linux32</key> <map> @@ -256,9 +256,9 @@ <key>linux</key> <map> <key>md5sum</key> - <string>e6d4cd23f5df4c74072d5d0437ca999b</string> + <string>a88e8285b3d97a21bf43cc5f90e87eb9</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.0-linux-20080812.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.4-linux-20081202.tar.bz2</uri> </map> <key>linux32</key> <map> @@ -460,9 +460,9 @@ <key>linux</key> <map> <key>md5sum</key> - <string>07665d74d37c56fd884610ec80a1d19f</string> + <string>eeffb03bd6672b6e7751448e5306d874</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-linux-20080812.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-linux-20081201.tar.bz2</uri> </map> <key>linux32</key> <map> @@ -694,7 +694,7 @@ <key>copyright</key> <string>Copyright (c) 2003, Yves Piguet.</string> <key>description</key> - <string>An open-source JPEG-2000 library; a slower alternative to Kadaku. Used in the open source release </string> + <string>An open-source JPEG (JFIF) library</string> <key>license</key> <string>jpeglib</string> <key>packages</key> @@ -709,9 +709,9 @@ <key>linux</key> <map> <key>md5sum</key> - <string>41085a9915598bba0e6bcb0da23ff929</string> + <string>8aa8e01e0c21f60f0ede0ffb04e9214f</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-linux-20080812.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-linux-20081218.tar.bz2</uri> </map> <key>linux32</key> <map> @@ -891,9 +891,9 @@ anguage Infrstructure (CLI) international standard</string> <key>linux</key> <map> <key>md5sum</key> - <string>0878662f8c1c695a82477f7b0c57a7af</string> + <string>8ccd6155e0236b78548125a8aabebf79</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.18-linux-20080812.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.33-linux-20081201.tar.bz2</uri> </map> <key>linux32</key> <map> @@ -918,39 +918,6 @@ anguage Infrstructure (CLI) international standard</string> </map> </map> </map> - <key>libstdc++</key> - <map> - <key>copyright</key> - <string>Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/></string> - <key>description</key> - <string>Bundled library.</string> - <key>license</key> - <string>gpl</string> - <key>packages</key> - <map> - <key>linux</key> - <map> - <key>md5sum</key> - <string>1464a75ec87ee28e3b4f7840e9af41e3</string> - <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libstdc++-6.0-linux-20080812.tar.bz2</uri> - </map> - <key>linux32</key> - <map> - <key>md5sum</key> - <string>1218347dd70c3b471530793d0fc09b69</string> - <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libstdc++-6.4.1-linux-i686-gcc-4.1-20080915.tar.bz2</uri> - </map> - <key>linux64</key> - <map> - <key>md5sum</key> - <string>9a191dc453017b19c5803b046d82f32a</string> - <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libstdc++-6.4.1-linux64-20080909.tar.bz2</uri> - </map> - </map> - </map> <key>libuuid</key> <map> <key>copyright</key> @@ -1022,9 +989,9 @@ anguage Infrstructure (CLI) international standard</string> <key>linux</key> <map> <key>md5sum</key> - <string>344bfdb8448bbc4158a99300cf4e2b4b</string> + <string>6866c147730c83b7858765355df75047</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-linux-20080922.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-linux-20081218prfhk.tar.bz2</uri> </map> <key>linux32</key> <map> @@ -1171,9 +1138,9 @@ anguage Infrstructure (CLI) international standard</string> <key>linux</key> <map> <key>md5sum</key> - <string>df1809565b87b1dc28e3ca70db6e7d46</string> + <string>6dc0536329a0aadf76e3054ffd4da61c</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.03-1.1.2-linux-20080812.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.2.0-linux-20081201.tar.bz2</uri> </map> <key>linux32</key> <map> @@ -1301,9 +1268,9 @@ anguage Infrstructure (CLI) international standard</string> <key>linux</key> <map> <key>md5sum</key> - <string>c333219c88462b8b22c815cd2b700218</string> + <string>02af0dad64803e0d821bc09e6038682c</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.2-linux-20080812.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.3-linux-20081124b.tar.bz2</uri> </map> <key>linux32</key> <map> -- GitLab