From 99e70069ad5c0e3f133c6baad8e846eee6403b26 Mon Sep 17 00:00:00 2001 From: Torsten Wierschin Date: Sat, 24 Oct 2026 09:01:01 +0000 Subject: [PATCH 1/2] Adds external dep dtentity --- .../dtEntity/include/dtEntity/FastDelegate.h | 2111 +++++++++++++++++ .../include/dtEntity/FastDelegateBind.h | 245 ++ .../include/dtEntity/commandmessages.h | 457 ++++ .../dtEntity/include/dtEntity/component.h | 60 + .../include/dtEntity/componentfactories.h | 29 + .../include/dtEntity/componentplugin.h | 113 + .../include/dtEntity/componentpluginmanager.h | 169 ++ external/dtEntity/include/dtEntity/core.h | 44 + .../include/dtEntity/debugdrawinterface.h | 211 ++ .../include/dtEntity/defaultentitysystem.h | 335 +++ .../include/dtEntity/dtentity_config.h | 32 + .../include/dtEntity/dynamicproperty.h | 628 +++++ .../include/dtEntity/dynamicscomponent.h | 88 + external/dtEntity/include/dtEntity/entity.h | 129 + external/dtEntity/include/dtEntity/entityid.h | 27 + .../dtEntity/include/dtEntity/entitymanager.h | 421 ++++ .../dtEntity/include/dtEntity/entitysystem.h | 155 ++ external/dtEntity/include/dtEntity/export.h | 40 + external/dtEntity/include/dtEntity/hash.h | 39 + external/dtEntity/include/dtEntity/init.h | 53 + .../include/dtEntity/inputinterface.h | 175 ++ external/dtEntity/include/dtEntity/log.h | 57 + .../dtEntity/include/dtEntity/logmanager.h | 80 + .../dtEntity/include/dtEntity/mapcomponent.h | 372 +++ .../dtEntity/include/dtEntity/mapencoder.h | 48 + external/dtEntity/include/dtEntity/message.h | 90 + .../include/dtEntity/messagefactory.h | 77 + .../dtEntity/include/dtEntity/messagepump.h | 194 ++ .../dtEntity/include/dtEntity/nodemasks.h | 43 + .../dtEntity/include/dtEntity/objectfactory.h | 147 ++ external/dtEntity/include/dtEntity/profile.h | 137 ++ external/dtEntity/include/dtEntity/property.h | 1017 ++++++++ .../include/dtEntity/propertycontainer.h | 147 ++ .../include/dtEntity/rapidxmlmapencoder.h | 77 + .../include/dtEntity/resourcemanager.h | 87 + .../include/dtEntity/scriptaccessor.h | 53 + .../dtEntity/include/dtEntity/singleton.h | 73 + external/dtEntity/include/dtEntity/spawner.h | 176 ++ external/dtEntity/include/dtEntity/stringid.h | 77 + .../include/dtEntity/systeminterface.h | 116 + .../include/dtEntity/systemmessages.h | 994 ++++++++ .../include/dtEntity/threadsafequeue.h | 82 + external/dtEntity/include/dtEntity/uniqueid.h | 30 + .../include/dtEntity/windowinterface.h | 124 + .../include/dtEntityOSG/cameracomponent.h | 255 ++ .../include/dtEntityOSG/componentfactories.h | 34 + .../include/dtEntityOSG/dtentityosg_config.h | 6 + .../dtEntity/include/dtEntityOSG/export.h | 31 + .../dtEntityOSG/groundclampingcomponent.h | 186 ++ .../include/dtEntityOSG/groupcomponent.h | 105 + .../include/dtEntityOSG/initosgviewer.h | 78 + .../dtEntityOSG/layerattachpointcomponent.h | 128 + .../include/dtEntityOSG/layercomponent.h | 198 ++ .../include/dtEntityOSG/lightcomponent.h | 112 + .../dtEntityOSG/manipulatorcomponent.h | 153 ++ .../include/dtEntityOSG/manipulators.h | 96 + .../dtEntityOSG/matrixtransformcomponent.h | 128 + .../include/dtEntityOSG/nodecomponent.h | 113 + .../include/dtEntityOSG/nodemaskvisitor.h | 49 + .../dtEntityOSG/osganimationcomponent.h | 120 + .../dtEntityOSG/osgdebugdrawinterface.h | 293 +++ .../include/dtEntityOSG/osginputinterface.h | 237 ++ .../include/dtEntityOSG/osgsysteminterface.h | 101 + .../include/dtEntityOSG/osgwindowinterface.h | 144 ++ .../include/dtEntityOSG/particlecomponent.h | 231 ++ .../include/dtEntityOSG/pathcomponent.h | 98 + .../include/dtEntityOSG/pickshapecomponent.h | 96 + .../positionattitudetransformcomponent.h | 105 + .../include/dtEntityOSG/shadercomponent.h | 101 + .../include/dtEntityOSG/shadowcomponent.h | 111 + .../include/dtEntityOSG/skyboxcomponent.h | 84 + .../include/dtEntityOSG/staticmeshcomponent.h | 115 + .../include/dtEntityOSG/textlabelcomponent.h | 157 ++ .../dtEntityOSG/texturelabelcomponent.h | 145 ++ .../include/dtEntityOSG/transformcomponent.h | 97 + external/dtEntity/lib64/libdtEntity.so | 1 + external/dtEntity/lib64/libdtEntity.so.0.1.1 | Bin 0 -> 829752 bytes external/dtEntity/lib64/libdtEntity.so.2 | 1 + external/dtEntity/lib64/libdtEntityOSG.so | 1 + .../dtEntity/lib64/libdtEntityOSG.so.0.1.1 | Bin 0 -> 1335472 bytes external/dtEntity/lib64/libdtEntityOSG.so.2 | 1 + 81 files changed, 13770 insertions(+) create mode 100644 external/dtEntity/include/dtEntity/FastDelegate.h create mode 100644 external/dtEntity/include/dtEntity/FastDelegateBind.h create mode 100644 external/dtEntity/include/dtEntity/commandmessages.h create mode 100644 external/dtEntity/include/dtEntity/component.h create mode 100644 external/dtEntity/include/dtEntity/componentfactories.h create mode 100644 external/dtEntity/include/dtEntity/componentplugin.h create mode 100644 external/dtEntity/include/dtEntity/componentpluginmanager.h create mode 100644 external/dtEntity/include/dtEntity/core.h create mode 100644 external/dtEntity/include/dtEntity/debugdrawinterface.h create mode 100644 external/dtEntity/include/dtEntity/defaultentitysystem.h create mode 100644 external/dtEntity/include/dtEntity/dtentity_config.h create mode 100644 external/dtEntity/include/dtEntity/dynamicproperty.h create mode 100644 external/dtEntity/include/dtEntity/dynamicscomponent.h create mode 100644 external/dtEntity/include/dtEntity/entity.h create mode 100644 external/dtEntity/include/dtEntity/entityid.h create mode 100644 external/dtEntity/include/dtEntity/entitymanager.h create mode 100644 external/dtEntity/include/dtEntity/entitysystem.h create mode 100644 external/dtEntity/include/dtEntity/export.h create mode 100644 external/dtEntity/include/dtEntity/hash.h create mode 100644 external/dtEntity/include/dtEntity/init.h create mode 100644 external/dtEntity/include/dtEntity/inputinterface.h create mode 100644 external/dtEntity/include/dtEntity/log.h create mode 100644 external/dtEntity/include/dtEntity/logmanager.h create mode 100644 external/dtEntity/include/dtEntity/mapcomponent.h create mode 100644 external/dtEntity/include/dtEntity/mapencoder.h create mode 100644 external/dtEntity/include/dtEntity/message.h create mode 100644 external/dtEntity/include/dtEntity/messagefactory.h create mode 100644 external/dtEntity/include/dtEntity/messagepump.h create mode 100644 external/dtEntity/include/dtEntity/nodemasks.h create mode 100644 external/dtEntity/include/dtEntity/objectfactory.h create mode 100644 external/dtEntity/include/dtEntity/profile.h create mode 100644 external/dtEntity/include/dtEntity/property.h create mode 100644 external/dtEntity/include/dtEntity/propertycontainer.h create mode 100644 external/dtEntity/include/dtEntity/rapidxmlmapencoder.h create mode 100644 external/dtEntity/include/dtEntity/resourcemanager.h create mode 100644 external/dtEntity/include/dtEntity/scriptaccessor.h create mode 100644 external/dtEntity/include/dtEntity/singleton.h create mode 100644 external/dtEntity/include/dtEntity/spawner.h create mode 100644 external/dtEntity/include/dtEntity/stringid.h create mode 100644 external/dtEntity/include/dtEntity/systeminterface.h create mode 100644 external/dtEntity/include/dtEntity/systemmessages.h create mode 100644 external/dtEntity/include/dtEntity/threadsafequeue.h create mode 100644 external/dtEntity/include/dtEntity/uniqueid.h create mode 100644 external/dtEntity/include/dtEntity/windowinterface.h create mode 100644 external/dtEntity/include/dtEntityOSG/cameracomponent.h create mode 100644 external/dtEntity/include/dtEntityOSG/componentfactories.h create mode 100644 external/dtEntity/include/dtEntityOSG/dtentityosg_config.h create mode 100644 external/dtEntity/include/dtEntityOSG/export.h create mode 100644 external/dtEntity/include/dtEntityOSG/groundclampingcomponent.h create mode 100644 external/dtEntity/include/dtEntityOSG/groupcomponent.h create mode 100644 external/dtEntity/include/dtEntityOSG/initosgviewer.h create mode 100644 external/dtEntity/include/dtEntityOSG/layerattachpointcomponent.h create mode 100644 external/dtEntity/include/dtEntityOSG/layercomponent.h create mode 100644 external/dtEntity/include/dtEntityOSG/lightcomponent.h create mode 100644 external/dtEntity/include/dtEntityOSG/manipulatorcomponent.h create mode 100644 external/dtEntity/include/dtEntityOSG/manipulators.h create mode 100644 external/dtEntity/include/dtEntityOSG/matrixtransformcomponent.h create mode 100644 external/dtEntity/include/dtEntityOSG/nodecomponent.h create mode 100644 external/dtEntity/include/dtEntityOSG/nodemaskvisitor.h create mode 100644 external/dtEntity/include/dtEntityOSG/osganimationcomponent.h create mode 100644 external/dtEntity/include/dtEntityOSG/osgdebugdrawinterface.h create mode 100644 external/dtEntity/include/dtEntityOSG/osginputinterface.h create mode 100644 external/dtEntity/include/dtEntityOSG/osgsysteminterface.h create mode 100644 external/dtEntity/include/dtEntityOSG/osgwindowinterface.h create mode 100644 external/dtEntity/include/dtEntityOSG/particlecomponent.h create mode 100644 external/dtEntity/include/dtEntityOSG/pathcomponent.h create mode 100644 external/dtEntity/include/dtEntityOSG/pickshapecomponent.h create mode 100644 external/dtEntity/include/dtEntityOSG/positionattitudetransformcomponent.h create mode 100644 external/dtEntity/include/dtEntityOSG/shadercomponent.h create mode 100644 external/dtEntity/include/dtEntityOSG/shadowcomponent.h create mode 100644 external/dtEntity/include/dtEntityOSG/skyboxcomponent.h create mode 100644 external/dtEntity/include/dtEntityOSG/staticmeshcomponent.h create mode 100644 external/dtEntity/include/dtEntityOSG/textlabelcomponent.h create mode 100644 external/dtEntity/include/dtEntityOSG/texturelabelcomponent.h create mode 100644 external/dtEntity/include/dtEntityOSG/transformcomponent.h create mode 120000 external/dtEntity/lib64/libdtEntity.so create mode 100755 external/dtEntity/lib64/libdtEntity.so.0.1.1 create mode 120000 external/dtEntity/lib64/libdtEntity.so.2 create mode 120000 external/dtEntity/lib64/libdtEntityOSG.so create mode 100755 external/dtEntity/lib64/libdtEntityOSG.so.0.1.1 create mode 120000 external/dtEntity/lib64/libdtEntityOSG.so.2 diff --git a/external/dtEntity/include/dtEntity/FastDelegate.h b/external/dtEntity/include/dtEntity/FastDelegate.h new file mode 100644 index 000000000..48d90e269 --- /dev/null +++ b/external/dtEntity/include/dtEntity/FastDelegate.h @@ -0,0 +1,2111 @@ +#pragma once + +#ifndef FASTDELEGATE_H +#define FASTDELEGATE_H + +// FastDelegate.h +// Efficient delegates in C++ that generate only two lines of asm code! +// Documentation is found at http://www.codeproject.com/cpp/FastDelegate.asp +// +// - Don Clugston, Mar 2004. +// Major contributions were made by Jody Hagins. +// History: +// 24-Apr-04 1.0 * Submitted to CodeProject. +// 28-Apr-04 1.1 * Prevent most unsafe uses of evil static function hack. +// * Improved syntax for horrible_cast (thanks Paul Bludov). +// * Tested on Metrowerks MWCC and Intel ICL (IA32) +// * Compiled, but not run, on Comeau C++ and Intel Itanium ICL. +// 27-Jun-04 1.2 * Now works on Borland C++ Builder 5.5 +// * Now works on /clr "managed C++" code on VC7, VC7.1 +// * Comeau C++ now compiles without warnings. +// * Prevent the virtual inheritance case from being used on +// VC6 and earlier, which generate incorrect code. +// * Improved warning and error messages. Non-standard hacks +// now have compile-time checks to make them safer. +// * implicit_cast used instead of static_cast in many cases. +// * If calling a const member function, a const class pointer can be used. +// * MakeDelegate() global helper function added to simplify pass-by-value. +// * Added fastdelegate.clear() +// 16-Jul-04 1.2.1* Workaround for gcc bug (const member function pointers in templates) +// 30-Oct-04 1.3 * Support for (non-void) return values. +// * No more workarounds in client code! +// MSVC and Intel now use a clever hack invented by John Dlugosz: +// - The FASTDELEGATEDECLARE workaround is no longer necessary. +// - No more warning messages for VC6 +// * Less use of macros. Error messages should be more comprehensible. +// * Added include guards +// * Added FastDelegate::empty() to test if invocation is safe (Thanks Neville Franks). +// * Now tested on VS 2005 Express Beta, PGI C++ +// 24-Dec-04 1.4 * Added DelegateMemento, to allow collections of disparate delegates. +// * <,>,<=,>= comparison operators to allow storage in ordered containers. +// * Substantial reduction of code size, especially the 'Closure' class. +// * Standardised all the compiler-specific workarounds. +// * MFP conversion now works for CodePlay (but not yet supported in the full code). +// * Now compiles without warnings on _any_ supported compiler, including BCC 5.5.1 +// * New syntax: FastDelegate< int (char *, double) >. +// 14-Feb-05 1.4.1* Now treats =0 as equivalent to .clear(), ==0 as equivalent to .empty(). (Thanks elfric). +// * Now tested on Intel ICL for AMD64, VS2005 Beta for AMD64 and Itanium. +// 30-Mar-05 1.5 * Safebool idiom: "if (dg)" is now equivalent to "if (!dg.empty())" +// * Fully supported by CodePlay VectorC +// * Bugfix for Metrowerks: empty() was buggy because a valid MFP can be 0 on MWCC! +// * More optimal assignment,== and != operators for static function pointers. + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include // to allow <,> comparisons + +//////////////////////////////////////////////////////////////////////////////// +// Configuration options +// +//////////////////////////////////////////////////////////////////////////////// + +// Uncomment the following #define for optimally-sized delegates. +// In this case, the generated asm code is almost identical to the code you'd get +// if the compiler had native support for delegates. +// It will not work on systems where sizeof(dataptr) < sizeof(codeptr). +// Thus, it will not work for DOS compilers using the medium model. +// It will also probably fail on some DSP systems. +#define FASTDELEGATE_USESTATICFUNCTIONHACK + +// Uncomment the next line to allow function declarator syntax. +// It is automatically enabled for those compilers where it is known to work. +//#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX + +//////////////////////////////////////////////////////////////////////////////// +// Compiler identification for workarounds +// +//////////////////////////////////////////////////////////////////////////////// + +// Compiler identification. It's not easy to identify Visual C++ because +// many vendors fraudulently define Microsoft's identifiers. +#if defined(_MSC_VER) && !defined(__MWERKS__) && !defined(__VECTOR_C) && !defined(__ICL) && !defined(__BORLANDC__) +#define FASTDLGT_ISMSVC + +#if (_MSC_VER <1300) // Many workarounds are required for VC6. +#define FASTDLGT_VC6 +#pragma warning(disable:4786) // disable this ridiculous warning +#endif + +#endif + +// Does the compiler uses Microsoft's member function pointer structure? +// If so, it needs special treatment. +// Metrowerks CodeWarrior, Intel, and CodePlay fraudulently define Microsoft's +// identifier, _MSC_VER. We need to filter Metrowerks out. +#if defined(_MSC_VER) && !defined(__MWERKS__) +#define FASTDLGT_MICROSOFT_MFP + +#if !defined(__VECTOR_C) +// CodePlay doesn't have the __single/multi/virtual_inheritance keywords +#define FASTDLGT_HASINHERITANCE_KEYWORDS +#endif +#endif + +// Does it allow function declarator syntax? The following compilers are known to work: +#if defined(FASTDLGT_ISMSVC) && (_MSC_VER >=1310) // VC 7.1 +#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX +#endif + +// Gcc(2.95+), and versions of Digital Mars, Intel and Comeau in common use. +#if defined (__DMC__) || defined(__GNUC__) || defined(__ICL) || defined(__COMO__) +#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX +#endif + +// It works on Metrowerks MWCC 3.2.2. From boost.Config it should work on earlier ones too. +#if defined (__MWERKS__) +#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX +#endif + +#ifdef __GNUC__ // Workaround GCC bug #8271 + // At present, GCC doesn't recognize constness of MFPs in templates +#define FASTDELEGATE_GCC_BUG_8271 +#endif + + + +//////////////////////////////////////////////////////////////////////////////// +// General tricks used in this code +// +// (a) Error messages are generated by typdefing an array of negative size to +// generate compile-time errors. +// (b) Warning messages on MSVC are generated by declaring unused variables, and +// enabling the "variable XXX is never used" warning. +// (c) Unions are used in a few compiler-specific cases to perform illegal casts. +// (d) For Microsoft and Intel, when adjusting the 'this' pointer, it's cast to +// (char *) first to ensure that the correct number of *bytes* are added. +// +//////////////////////////////////////////////////////////////////////////////// +// Helper templates +// +//////////////////////////////////////////////////////////////////////////////// + + +namespace fastdelegate { +namespace detail { // we'll hide the implementation details in a nested namespace. + +// implicit_cast< > +// I believe this was originally going to be in the C++ standard but +// was left out by accident. It's even milder than static_cast. +// I use it instead of static_cast<> to emphasize that I'm not doing +// anything nasty. +// Usage is identical to static_cast<> +template +inline OutputClass implicit_cast(InputClass input){ + return input; +} + +// horrible_cast< > +// This is truly evil. It completely subverts C++'s type system, allowing you +// to cast from any class to any other class. Technically, using a union +// to perform the cast is undefined behaviour (even in C). But we can see if +// it is OK by checking that the union is the same size as each of its members. +// horrible_cast<> should only be used for compiler-specific workarounds. +// Usage is identical to reinterpret_cast<>. + +// This union is declared outside the horrible_cast because BCC 5.5.1 +// can't inline a function with a nested class, and gives a warning. +template +union horrible_union{ + OutputClass out; + InputClass in; +}; + +template +inline OutputClass horrible_cast(const InputClass input){ + horrible_union u; + // Cause a compile-time error if in, out and u are not the same size. + // If the compile fails here, it means the compiler has peculiar + // unions which would prevent the cast from working. + typedef int ERROR_CantUseHorrible_cast[sizeof(InputClass)==sizeof(u) + && sizeof(InputClass)==sizeof(OutputClass) ? 1 : -1]; + u.in = input; + return u.out; +} + +//////////////////////////////////////////////////////////////////////////////// +// Workarounds +// +//////////////////////////////////////////////////////////////////////////////// + +// Backwards compatibility: This macro used to be necessary in the virtual inheritance +// case for Intel and Microsoft. Now it just forward-declares the class. +#define FASTDELEGATEDECLARE(CLASSNAME) class CLASSNAME; + +// Prevent use of the static function hack with the DOS medium model. +#ifdef __MEDIUM__ +#undef FASTDELEGATE_USESTATICFUNCTIONHACK +#endif + +// DefaultVoid - a workaround for 'void' templates in VC6. +// +// (1) VC6 and earlier do not allow 'void' as a default template argument. +// (2) They also doesn't allow you to return 'void' from a function. +// +// Workaround for (1): Declare a dummy type 'DefaultVoid' which we use +// when we'd like to use 'void'. We convert it into 'void' and back +// using the templates DefaultVoidToVoid<> and VoidToDefaultVoid<>. +// Workaround for (2): On VC6, the code for calling a void function is +// identical to the code for calling a non-void function in which the +// return value is never used, provided the return value is returned +// in the EAX register, rather than on the stack. +// This is true for most fundamental types such as int, enum, void *. +// Const void * is the safest option since it doesn't participate +// in any automatic conversions. But on a 16-bit compiler it might +// cause extra code to be generated, so we disable it for all compilers +// except for VC6 (and VC5). +#ifdef FASTDLGT_VC6 +// VC6 workaround +typedef const void * DefaultVoid; +#else +// On any other compiler, just use a normal void. +typedef void DefaultVoid; +#endif + +// Translate from 'DefaultVoid' to 'void'. +// Everything else is unchanged +template +struct DefaultVoidToVoid { typedef T type; }; + +template <> +struct DefaultVoidToVoid { typedef void type; }; + +// Translate from 'void' into 'DefaultVoid' +// Everything else is unchanged +template +struct VoidToDefaultVoid { typedef T type; }; + +template <> +struct VoidToDefaultVoid { typedef DefaultVoid type; }; + + + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 1: +// +// Conversion of member function pointer to a standard form +// +//////////////////////////////////////////////////////////////////////////////// + +// GenericClass is a fake class, ONLY used to provide a type. +// It is vitally important that it is never defined, so that the compiler doesn't +// think it can optimize the invocation. For example, Borland generates simpler +// code if it knows the class only uses single inheritance. + +// Compilers using Microsoft's structure need to be treated as a special case. +#ifdef FASTDLGT_MICROSOFT_MFP + +#ifdef FASTDLGT_HASINHERITANCE_KEYWORDS + // For Microsoft and Intel, we want to ensure that it's the most efficient type of MFP + // (4 bytes), even when the /vmg option is used. Declaring an empty class + // would give 16 byte pointers in this case.... + class __single_inheritance GenericClass; +#endif + // ...but for Codeplay, an empty class *always* gives 4 byte pointers. + // If compiled with the /clr option ("managed C++"), the JIT compiler thinks + // it needs to load GenericClass before it can call any of its functions, + // (compiles OK but crashes at runtime!), so we need to declare an + // empty class to make it happy. + // Codeplay and VC4 can't cope with the unknown_inheritance case either. + class GenericClass {}; +#else + class GenericClass; +#endif + +// The size of a single inheritance member function pointer. +const int SINGLE_MEMFUNCPTR_SIZE = sizeof(void (GenericClass::*)()); + +// SimplifyMemFunc< >::Convert() +// +// A template function that converts an arbitrary member function pointer into the +// simplest possible form of member function pointer, using a supplied 'this' pointer. +// According to the standard, this can be done legally with reinterpret_cast<>. +// For (non-standard) compilers which use member function pointers which vary in size +// depending on the class, we need to use knowledge of the internal structure of a +// member function pointer, as used by the compiler. Template specialization is used +// to distinguish between the sizes. Because some compilers don't support partial +// template specialisation, I use full specialisation of a wrapper struct. + +// general case -- don't know how to convert it. Force a compile failure +template +struct SimplifyMemFunc { + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + // Unsupported member function type -- force a compile failure. + // (it's illegal to have a array with negative size). + typedef char ERROR_Unsupported_member_function_pointer_on_this_compiler[N-100]; + return 0; + } +}; + +// For compilers where all member func ptrs are the same size, everything goes here. +// For non-standard compilers, only single_inheritance classes go here. +template <> +struct SimplifyMemFunc { + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { +#if defined __DMC__ + // Digital Mars doesn't allow you to cast between abitrary PMF's, + // even though the standard says you can. The 32-bit compiler lets you + // static_cast through an int, but the DOS compiler doesn't. + bound_func = horrible_cast(function_to_bind); +#else + bound_func = reinterpret_cast(function_to_bind); +#endif + return reinterpret_cast(pthis); + } +}; + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 1b: +// +// Workarounds for Microsoft and Intel +// +//////////////////////////////////////////////////////////////////////////////// + + +// Compilers with member function pointers which violate the standard (MSVC, Intel, Codeplay), +// need to be treated as a special case. +#ifdef FASTDLGT_MICROSOFT_MFP + +// We use unions to perform horrible_casts. I would like to use #pragma pack(push, 1) +// at the start of each function for extra safety, but VC6 seems to ICE +// intermittently if you do this inside a template. + +// __multiple_inheritance classes go here +// Nasty hack for Microsoft and Intel (IA32 and Itanium) +template<> +struct SimplifyMemFunc< SINGLE_MEMFUNCPTR_SIZE + sizeof(int) > { + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + // We need to use a horrible_cast to do this conversion. + // In MSVC, a multiple inheritance member pointer is internally defined as: + union { + XFuncType func; + struct { + GenericMemFuncType funcaddress; // points to the actual member function + int delta; // #BYTES to be added to the 'this' pointer + }s; + } u; + // Check that the horrible_cast will work + typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s)? 1 : -1]; + u.func = function_to_bind; + bound_func = u.s.funcaddress; + return reinterpret_cast(reinterpret_cast(pthis) + u.s.delta); + } +}; + +// virtual inheritance is a real nuisance. It's inefficient and complicated. +// On MSVC and Intel, there isn't enough information in the pointer itself to +// enable conversion to a closure pointer. Earlier versions of this code didn't +// work for all cases, and generated a compile-time error instead. +// But a very clever hack invented by John M. Dlugosz solves this problem. +// My code is somewhat different to his: I have no asm code, and I make no +// assumptions about the calling convention that is used. + +// In VC++ and ICL, a virtual_inheritance member pointer +// is internally defined as: +struct MicrosoftVirtualMFP { + void (GenericClass::*codeptr)(); // points to the actual member function + int delta; // #bytes to be added to the 'this' pointer + int vtable_index; // or 0 if no virtual inheritance +}; +// The CRUCIAL feature of Microsoft/Intel MFPs which we exploit is that the +// m_codeptr member is *always* called, regardless of the values of the other +// members. (This is *not* true for other compilers, eg GCC, which obtain the +// function address from the vtable if a virtual function is being called). +// Dlugosz's trick is to make the codeptr point to a probe function which +// returns the 'this' pointer that was used. + +// Define a generic class that uses virtual inheritance. +// It has a trival member function that returns the value of the 'this' pointer. +struct GenericVirtualClass : virtual public GenericClass +{ + typedef GenericVirtualClass * (GenericVirtualClass::*ProbePtrType)(); + GenericVirtualClass * GetThis() { return this; } +}; + +// __virtual_inheritance classes go here +template <> +struct SimplifyMemFunc +{ + + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + union { + XFuncType func; + GenericClass* (X::*ProbeFunc)(); + MicrosoftVirtualMFP s; + } u; + u.func = function_to_bind; + bound_func = reinterpret_cast(u.s.codeptr); + union { + GenericVirtualClass::ProbePtrType virtfunc; + MicrosoftVirtualMFP s; + } u2; + // Check that the horrible_cast<>s will work + typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s) + && sizeof(function_to_bind)==sizeof(u.ProbeFunc) + && sizeof(u2.virtfunc)==sizeof(u2.s) ? 1 : -1]; + // Unfortunately, taking the address of a MF prevents it from being inlined, so + // this next line can't be completely optimised away by the compiler. + u2.virtfunc = &GenericVirtualClass::GetThis; + u.s.codeptr = u2.s.codeptr; + return (pthis->*u.ProbeFunc)(); + } +}; + +#if (_MSC_VER <1300) + +// Nasty hack for Microsoft Visual C++ 6.0 +// unknown_inheritance classes go here +// There is a compiler bug in MSVC6 which generates incorrect code in this case!! +template <> +struct SimplifyMemFunc +{ + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + // There is an apalling but obscure compiler bug in MSVC6 and earlier: + // vtable_index and 'vtordisp' are always set to 0 in the + // unknown_inheritance case! + // This means that an incorrect function could be called!!! + // Compiling with the /vmg option leads to potentially incorrect code. + // This is probably the reason that the IDE has a user interface for specifying + // the /vmg option, but it is disabled - you can only specify /vmg on + // the command line. In VC1.5 and earlier, the compiler would ICE if it ever + // encountered this situation. + // It is OK to use the /vmg option if /vmm or /vms is specified. + + // Fortunately, the wrong function is only called in very obscure cases. + // It only occurs when a derived class overrides a virtual function declared + // in a virtual base class, and the member function + // points to the *Derived* version of that function. The problem can be + // completely averted in 100% of cases by using the *Base class* for the + // member fpointer. Ie, if you use the base class as an interface, you'll + // stay out of trouble. + // Occasionally, you might want to point directly to a derived class function + // that isn't an override of a base class. In this case, both vtable_index + // and 'vtordisp' are zero, but a virtual_inheritance pointer will be generated. + // We can generate correct code in this case. To prevent an incorrect call from + // ever being made, on MSVC6 we generate a warning, and call a function to + // make the program crash instantly. + typedef char ERROR_VC6CompilerBug[-100]; + return 0; + } +}; + + +#else + +// Nasty hack for Microsoft and Intel (IA32 and Itanium) +// unknown_inheritance classes go here +// This is probably the ugliest bit of code I've ever written. Look at the casts! +// There is a compiler bug in MSVC6 which prevents it from using this code. +template <> +struct SimplifyMemFunc +{ + template + inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, + GenericMemFuncType &bound_func) { + // The member function pointer is 16 bytes long. We can't use a normal cast, but + // we can use a union to do the conversion. + union { + XFuncType func; + // In VC++ and ICL, an unknown_inheritance member pointer + // is internally defined as: + struct { + GenericMemFuncType m_funcaddress; // points to the actual member function + int delta; // #bytes to be added to the 'this' pointer + int vtordisp; // #bytes to add to 'this' to find the vtable + int vtable_index; // or 0 if no virtual inheritance + } s; + } u; + // Check that the horrible_cast will work + typedef int ERROR_CantUsehorrible_cast[sizeof(XFuncType)==sizeof(u.s)? 1 : -1]; + u.func = function_to_bind; + bound_func = u.s.funcaddress; + int virtual_delta = 0; + if (u.s.vtable_index) { // Virtual inheritance is used + // First, get to the vtable. + // It is 'vtordisp' bytes from the start of the class. + const int * vtable = *reinterpret_cast( + reinterpret_cast(pthis) + u.s.vtordisp ); + + // 'vtable_index' tells us where in the table we should be looking. + virtual_delta = u.s.vtordisp + *reinterpret_cast( + reinterpret_cast(vtable) + u.s.vtable_index); + } + // The int at 'virtual_delta' gives us the amount to add to 'this'. + // Finally we can add the three components together. Phew! + return reinterpret_cast( + reinterpret_cast(pthis) + u.s.delta + virtual_delta); + }; +}; +#endif // MSVC 7 and greater + +#endif // MS/Intel hacks + +} // namespace detail + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 2: +// +// Define the delegate storage, and cope with static functions +// +//////////////////////////////////////////////////////////////////////////////// + +// DelegateMemento -- an opaque structure which can hold an arbitary delegate. +// It knows nothing about the calling convention or number of arguments used by +// the function pointed to. +// It supplies comparison operators so that it can be stored in STL collections. +// It cannot be set to anything other than null, nor invoked directly: +// it must be converted to a specific delegate. + +// Implementation: +// There are two possible implementations: the Safe method and the Evil method. +// DelegateMemento - Safe version +// +// This implementation is standard-compliant, but a bit tricky. +// A static function pointer is stored inside the class. +// Here are the valid values: +// +-- Static pointer --+--pThis --+-- pMemFunc-+-- Meaning------+ +// | 0 | 0 | 0 | Empty | +// | !=0 |(dontcare)| Invoker | Static function| +// | 0 | !=0 | !=0* | Method call | +// +--------------------+----------+------------+----------------+ +// * For Metrowerks, this can be 0. (first virtual function in a +// single_inheritance class). +// When stored stored inside a specific delegate, the 'dontcare' entries are replaced +// with a reference to the delegate itself. This complicates the = and == operators +// for the delegate class. + +// DelegateMemento - Evil version +// +// For compilers where data pointers are at least as big as code pointers, it is +// possible to store the function pointer in the this pointer, using another +// horrible_cast. In this case the DelegateMemento implementation is simple: +// +--pThis --+-- pMemFunc-+-- Meaning---------------------+ +// | 0 | 0 | Empty | +// | !=0 | !=0* | Static function or method call| +// +----------+------------+-------------------------------+ +// * For Metrowerks, this can be 0. (first virtual function in a +// single_inheritance class). +// Note that the Sun C++ and MSVC documentation explicitly state that they +// support static_cast between void * and function pointers. + +class DelegateMemento { +protected: + // the data is protected, not private, because many + // compilers have problems with template friends. + typedef void (detail::GenericClass::*GenericMemFuncType)(); // arbitrary MFP. + detail::GenericClass *m_pthis; + GenericMemFuncType m_pFunction; + +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + typedef void (*GenericFuncPtr)(); // arbitrary code pointer + GenericFuncPtr m_pStaticFunction; +#endif + +public: +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + DelegateMemento() : m_pthis(0), m_pFunction(0), m_pStaticFunction(0) {}; + void clear() { + m_pthis=0; m_pFunction=0; m_pStaticFunction=0; + } +#else + DelegateMemento() : m_pthis(0), m_pFunction(0) {}; + void clear() { m_pthis=0; m_pFunction=0; } +#endif +public: +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + inline bool IsEqual (const DelegateMemento &x) const{ + // We have to cope with the static function pointers as a special case + if (m_pFunction!=x.m_pFunction) return false; + // the static function ptrs must either both be equal, or both be 0. + if (m_pStaticFunction!=x.m_pStaticFunction) return false; + if (m_pStaticFunction!=0) return m_pthis==x.m_pthis; + else return true; + } +#else // Evil Method + inline bool IsEqual (const DelegateMemento &x) const{ + return m_pthis==x.m_pthis && m_pFunction==x.m_pFunction; + } +#endif + // Provide a strict weak ordering for DelegateMementos. + inline bool IsLess(const DelegateMemento &right) const { + // deal with static function pointers first +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + if (m_pStaticFunction !=0 || right.m_pStaticFunction!=0) + return m_pStaticFunction < right.m_pStaticFunction; +#endif + if (m_pthis !=right.m_pthis) return m_pthis < right.m_pthis; + // There are no ordering operators for member function pointers, + // but we can fake one by comparing each byte. The resulting ordering is + // arbitrary (and compiler-dependent), but it permits storage in ordered STL containers. + return memcmp(&m_pFunction, &right.m_pFunction, sizeof(m_pFunction)) < 0; + + } + // BUGFIX (Mar 2005): + // We can't just compare m_pFunction because on Metrowerks, + // m_pFunction can be zero even if the delegate is not empty! + inline bool operator ! () const // Is it bound to anything? + { return m_pthis==0 && m_pFunction==0; } + inline bool empty() const // Is it bound to anything? + { return m_pthis==0 && m_pFunction==0; } +public: + DelegateMemento & operator = (const DelegateMemento &right) { + SetMementoFrom(right); + return *this; + } + inline bool operator <(const DelegateMemento &right) { + return IsLess(right); + } + inline bool operator >(const DelegateMemento &right) { + return right.IsLess(*this); + } + DelegateMemento (const DelegateMemento &right) : + m_pthis(right.m_pthis), m_pFunction(right.m_pFunction) +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + , m_pStaticFunction (right.m_pStaticFunction) +#endif + {} +protected: + void SetMementoFrom(const DelegateMemento &right) { + m_pFunction = right.m_pFunction; + m_pthis = right.m_pthis; +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + m_pStaticFunction = right.m_pStaticFunction; +#endif + } +}; + + +// ClosurePtr<> +// +// A private wrapper class that adds function signatures to DelegateMemento. +// It's the class that does most of the actual work. +// The signatures are specified by: +// GenericMemFunc: must be a type of GenericClass member function pointer. +// StaticFuncPtr: must be a type of function pointer with the same signature +// as GenericMemFunc. +// UnvoidStaticFuncPtr: is the same as StaticFuncPtr, except on VC6 +// where it never returns void (returns DefaultVoid instead). + +// An outer class, FastDelegateN<>, handles the invoking and creates the +// necessary typedefs. +// This class does everything else. + +namespace detail { + +template < class GenericMemFunc, class StaticFuncPtr, class UnvoidStaticFuncPtr> +class ClosurePtr : public DelegateMemento { +public: + // These functions are for setting the delegate to a member function. + + // Here's the clever bit: we convert an arbitrary member function into a + // standard form. XMemFunc should be a member function of class X, but I can't + // enforce that here. It needs to be enforced by the wrapper class. + template < class X, class XMemFunc > + inline void bindmemfunc(X *pthis, XMemFunc function_to_bind ) { + m_pthis = SimplifyMemFunc< sizeof(function_to_bind) > + ::Convert(pthis, function_to_bind, m_pFunction); +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + m_pStaticFunction = 0; +#endif + } + // For const member functions, we only need a const class pointer. + // Since we know that the member function is const, it's safe to + // remove the const qualifier from the 'this' pointer with a const_cast. + // VC6 has problems if we just overload 'bindmemfunc', so we give it a different name. + template < class X, class XMemFunc> + inline void bindconstmemfunc(const X *pthis, XMemFunc function_to_bind) { + m_pthis= SimplifyMemFunc< sizeof(function_to_bind) > + ::Convert(const_cast(pthis), function_to_bind, m_pFunction); +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + m_pStaticFunction = 0; +#endif + } +#ifdef FASTDELEGATE_GCC_BUG_8271 // At present, GCC doesn't recognize constness of MFPs in templates + template < class X, class XMemFunc> + inline void bindmemfunc(const X *pthis, XMemFunc function_to_bind) { + bindconstmemfunc(pthis, function_to_bind); +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + m_pStaticFunction = 0; +#endif + } +#endif + // These functions are required for invoking the stored function + inline GenericClass *GetClosureThis() const { return m_pthis; } + inline GenericMemFunc GetClosureMemPtr() const { return reinterpret_cast(m_pFunction); } + +// There are a few ways of dealing with static function pointers. +// There's a standard-compliant, but tricky method. +// There's also a straightforward hack, that won't work on DOS compilers using the +// medium memory model. It's so evil that I can't recommend it, but I've +// implemented it anyway because it produces very nice asm code. + +#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + +// ClosurePtr<> - Safe version +// +// This implementation is standard-compliant, but a bit tricky. +// I store the function pointer inside the class, and the delegate then +// points to itself. Whenever the delegate is copied, these self-references +// must be transformed, and this complicates the = and == operators. +public: + // The next two functions are for operator ==, =, and the copy constructor. + // We may need to convert the m_pthis pointers, so that + // they remain as self-references. + template< class DerivedClass > + inline void CopyFrom (DerivedClass *pParent, const DelegateMemento &x) { + SetMementoFrom(x); + if (m_pStaticFunction!=0) { + // transform self references... + m_pthis=reinterpret_cast(pParent); + } + } + // For static functions, the 'static_function_invoker' class in the parent + // will be called. The parent then needs to call GetStaticFunction() to find out + // the actual function to invoke. + template < class DerivedClass, class ParentInvokerSig > + inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, + StaticFuncPtr function_to_bind ) { + if (function_to_bind==0) { // cope with assignment to 0 + m_pFunction=0; + } else { + bindmemfunc(pParent, static_function_invoker); + } + m_pStaticFunction=reinterpret_cast(function_to_bind); + } + inline UnvoidStaticFuncPtr GetStaticFunction() const { + return reinterpret_cast(m_pStaticFunction); + } +#else + +// ClosurePtr<> - Evil version +// +// For compilers where data pointers are at least as big as code pointers, it is +// possible to store the function pointer in the this pointer, using another +// horrible_cast. Invocation isn't any faster, but it saves 4 bytes, and +// speeds up comparison and assignment. If C++ provided direct language support +// for delegates, they would produce asm code that was almost identical to this. +// Note that the Sun C++ and MSVC documentation explicitly state that they +// support static_cast between void * and function pointers. + + template< class DerivedClass > + inline void CopyFrom (DerivedClass *pParent, const DelegateMemento &right) { + SetMementoFrom(right); + } + // For static functions, the 'static_function_invoker' class in the parent + // will be called. The parent then needs to call GetStaticFunction() to find out + // the actual function to invoke. + // ******** EVIL, EVIL CODE! ******* + template < class DerivedClass, class ParentInvokerSig> + inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, + StaticFuncPtr function_to_bind) { + if (function_to_bind==0) { // cope with assignment to 0 + m_pFunction=0; + } else { + // We'll be ignoring the 'this' pointer, but we need to make sure we pass + // a valid value to bindmemfunc(). + bindmemfunc(pParent, static_function_invoker); + } + + // WARNING! Evil hack. We store the function in the 'this' pointer! + // Ensure that there's a compilation failure if function pointers + // and data pointers have different sizes. + // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. + typedef int ERROR_CantUseEvilMethod[sizeof(GenericClass *)==sizeof(function_to_bind) ? 1 : -1]; + m_pthis = horrible_cast(function_to_bind); + // MSVC, SunC++ and DMC accept the following (non-standard) code: +// m_pthis = static_cast(static_cast(function_to_bind)); + // BCC32, Comeau and DMC accept this method. MSVC7.1 needs __int64 instead of long +// m_pthis = reinterpret_cast(reinterpret_cast(function_to_bind)); + } + // ******** EVIL, EVIL CODE! ******* + // This function will be called with an invalid 'this' pointer!! + // We're just returning the 'this' pointer, converted into + // a function pointer! + inline UnvoidStaticFuncPtr GetStaticFunction() const { + // Ensure that there's a compilation failure if function pointers + // and data pointers have different sizes. + // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. + typedef int ERROR_CantUseEvilMethod[sizeof(UnvoidStaticFuncPtr)==sizeof(this) ? 1 : -1]; + return horrible_cast(this); + } +#endif // !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) + + // Does the closure contain this static function? + inline bool IsEqualToStaticFuncPtr(StaticFuncPtr funcptr){ + if (funcptr==0) return empty(); + // For the Evil method, if it doesn't actually contain a static function, this will return an arbitrary + // value that is not equal to any valid function pointer. + else return funcptr==reinterpret_cast(GetStaticFunction()); + } +}; + + +} // namespace detail + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 3: +// +// Wrapper classes to ensure type safety +// +//////////////////////////////////////////////////////////////////////////////// + + +// Once we have the member function conversion templates, it's easy to make the +// wrapper classes. So that they will work with as many compilers as possible, +// the classes are of the form +// FastDelegate3 +// They can cope with any combination of parameters. The max number of parameters +// allowed is 8, but it is trivial to increase this limit. +// Note that we need to treat const member functions seperately. +// All this class does is to enforce type safety, and invoke the delegate with +// the correct list of parameters. + +// Because of the weird rule about the class of derived member function pointers, +// you sometimes need to apply a downcast to the 'this' pointer. +// This is the reason for the use of "implicit_cast(pthis)" in the code below. +// If CDerivedClass is derived from CBaseClass, but doesn't override SimpleVirtualFunction, +// without this trick you'd need to write: +// MyDelegate(static_cast(&d), &CDerivedClass::SimpleVirtualFunction); +// but with the trick you can write +// MyDelegate(&d, &CDerivedClass::SimpleVirtualFunction); + +// RetType is the type the compiler uses in compiling the template. For VC6, +// it cannot be void. DesiredRetType is the real type which is returned from +// all of the functions. It can be void. + +// Implicit conversion to "bool" is achieved using the safe_bool idiom, +// using member data pointers (MDP). This allows "if (dg)..." syntax +// Because some compilers (eg codeplay) don't have a unique value for a zero +// MDP, an extra padding member is added to the SafeBool struct. +// Some compilers (eg VC6) won't implicitly convert from 0 to an MDP, so +// in that case the static function constructor is not made explicit; this +// allows "if (dg==0) ..." to compile. + +//N=0 +template +class FastDelegate0 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(); + typedef RetType (*UnvoidStaticFunctionPtr)(); + typedef RetType (detail::GenericClass::*GenericMemFn)(); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate0 type; + + // Construction and comparison functions + FastDelegate0() { clear(); } + FastDelegate0(const FastDelegate0 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate0 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate0 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate0 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate0 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate0 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate0(Y *pthis, DesiredRetType (X::* function_to_bind)() ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)()) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate0(const Y *pthis, DesiredRetType (X::* function_to_bind)() const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)() const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate0(DesiredRetType (*function_to_bind)() ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)() ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)()) { + m_Closure.bindstaticfunc(this, &FastDelegate0::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() () const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction() const { + return (*(m_Closure.GetStaticFunction()))(); } +}; + +//N=1 +template +class FastDelegate1 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate1 type; + + // Construction and comparison functions + FastDelegate1() { clear(); } + FastDelegate1(const FastDelegate1 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate1 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate1 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate1 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate1 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate1 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate1(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate1(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate1(DesiredRetType (*function_to_bind)(Param1 p1) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1)) { + m_Closure.bindstaticfunc(this, &FastDelegate1::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1) const { + return (*(m_Closure.GetStaticFunction()))(p1); } +}; + +//N=2 +template +class FastDelegate2 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate2 type; + + // Construction and comparison functions + FastDelegate2() { clear(); } + FastDelegate2(const FastDelegate2 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate2 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate2 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate2 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate2 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate2 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate2(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate2(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate2(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2)) { + m_Closure.bindstaticfunc(this, &FastDelegate2::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2); } +}; + +//N=3 +template +class FastDelegate3 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate3 type; + + // Construction and comparison functions + FastDelegate3() { clear(); } + FastDelegate3(const FastDelegate3 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate3 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate3 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate3 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate3 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate3 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate3(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate3(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate3(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3)) { + m_Closure.bindstaticfunc(this, &FastDelegate3::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3); } +}; + +//N=4 +template +class FastDelegate4 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate4 type; + + // Construction and comparison functions + FastDelegate4() { clear(); } + FastDelegate4(const FastDelegate4 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate4 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate4 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate4 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate4 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate4 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate4(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate4(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate4(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { + m_Closure.bindstaticfunc(this, &FastDelegate4::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4); } +}; + +//N=5 +template +class FastDelegate5 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate5 type; + + // Construction and comparison functions + FastDelegate5() { clear(); } + FastDelegate5(const FastDelegate5 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate5 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate5 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate5 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate5 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate5 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate5(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate5(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate5(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { + m_Closure.bindstaticfunc(this, &FastDelegate5::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5); } +}; + +//N=6 +template +class FastDelegate6 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate6 type; + + // Construction and comparison functions + FastDelegate6() { clear(); } + FastDelegate6(const FastDelegate6 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate6 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate6 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate6 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate6 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate6 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate6(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate6(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate6(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { + m_Closure.bindstaticfunc(this, &FastDelegate6::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6); } +}; + +//N=7 +template +class FastDelegate7 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate7 type; + + // Construction and comparison functions + FastDelegate7() { clear(); } + FastDelegate7(const FastDelegate7 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate7 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate7 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate7 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate7 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate7 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate7(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate7(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate7(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { + m_Closure.bindstaticfunc(this, &FastDelegate7::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7); } +}; + +//N=8 +template +class FastDelegate8 { +private: + typedef typename detail::DefaultVoidToVoid::type DesiredRetType; + typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); + typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); + typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); + typedef detail::ClosurePtr ClosureType; + ClosureType m_Closure; +public: + // Typedefs to aid generic programming + typedef FastDelegate8 type; + + // Construction and comparison functions + FastDelegate8() { clear(); } + FastDelegate8(const FastDelegate8 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + void operator = (const FastDelegate8 &x) { + m_Closure.CopyFrom(this, x.m_Closure); } + bool operator ==(const FastDelegate8 &x) const { + return m_Closure.IsEqual(x.m_Closure); } + bool operator !=(const FastDelegate8 &x) const { + return !m_Closure.IsEqual(x.m_Closure); } + bool operator <(const FastDelegate8 &x) const { + return m_Closure.IsLess(x.m_Closure); } + bool operator >(const FastDelegate8 &x) const { + return x.m_Closure.IsLess(m_Closure); } + // Binding to non-const member functions + template < class X, class Y > + FastDelegate8(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { + m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Binding to const member functions. + template < class X, class Y > + FastDelegate8(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + template < class X, class Y > + inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { + m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } + // Static functions. We convert them into a member function call. + // This constructor also provides implicit conversion + FastDelegate8(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { + bind(function_to_bind); } + // for efficiency, prevent creation of a temporary + void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { + bind(function_to_bind); } + inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { + m_Closure.bindstaticfunc(this, &FastDelegate8::InvokeStaticFunction, + function_to_bind); } + // Invoke the delegate + RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const { + return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8); } + // Implicit conversion to "bool" using the safe_bool idiom +private: + typedef struct SafeBoolStruct { + int a_data_pointer_to_this_is_0_on_buggy_compilers; + StaticFunctionPtr m_nonzero; + } UselessTypedef; + typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; +public: + operator unspecified_bool_type() const { + return empty()? 0: &SafeBoolStruct::m_nonzero; + } + // necessary to allow ==0 to work despite the safe_bool idiom + inline bool operator==(StaticFunctionPtr funcptr) { + return m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator!=(StaticFunctionPtr funcptr) { + return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } + inline bool operator ! () const { // Is it bound to anything? + return !m_Closure; } + inline bool empty() const { + return !m_Closure; } + void clear() { m_Closure.clear();} + // Conversion to and from the DelegateMemento storage class + const DelegateMemento & GetMemento() { return m_Closure; } + void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } + +private: // Invoker for static functions + RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const { + return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8); } +}; + + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 4: +// +// FastDelegate<> class (Original author: Jody Hagins) +// Allows boost::function style syntax like: +// FastDelegate< double (int, long) > +// instead of: +// FastDelegate2< int, long, double > +// +//////////////////////////////////////////////////////////////////////////////// + +#ifdef FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX + +// Declare FastDelegate as a class template. It will be specialized +// later for all number of arguments. +template +class FastDelegate; + +//N=0 +// Specialization to allow use of +// FastDelegate< R ( ) > +// instead of +// FastDelegate0 < R > +template +class FastDelegate< R ( ) > + // Inherit from FastDelegate0 so that it can be treated just like a FastDelegate0 + : public FastDelegate0 < R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate0 < R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=1 +// Specialization to allow use of +// FastDelegate< R ( Param1 ) > +// instead of +// FastDelegate1 < Param1, R > +template +class FastDelegate< R ( Param1 ) > + // Inherit from FastDelegate1 so that it can be treated just like a FastDelegate1 + : public FastDelegate1 < Param1, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate1 < Param1, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=2 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2 ) > +// instead of +// FastDelegate2 < Param1, Param2, R > +template +class FastDelegate< R ( Param1, Param2 ) > + // Inherit from FastDelegate2 so that it can be treated just like a FastDelegate2 + : public FastDelegate2 < Param1, Param2, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate2 < Param1, Param2, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=3 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3 ) > +// instead of +// FastDelegate3 < Param1, Param2, Param3, R > +template +class FastDelegate< R ( Param1, Param2, Param3 ) > + // Inherit from FastDelegate3 so that it can be treated just like a FastDelegate3 + : public FastDelegate3 < Param1, Param2, Param3, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate3 < Param1, Param2, Param3, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=4 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4 ) > +// instead of +// FastDelegate4 < Param1, Param2, Param3, Param4, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4 ) > + // Inherit from FastDelegate4 so that it can be treated just like a FastDelegate4 + : public FastDelegate4 < Param1, Param2, Param3, Param4, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate4 < Param1, Param2, Param3, Param4, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=5 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5 ) > +// instead of +// FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5 ) > + // Inherit from FastDelegate5 so that it can be treated just like a FastDelegate5 + : public FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=6 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6 ) > +// instead of +// FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6 ) > + // Inherit from FastDelegate6 so that it can be treated just like a FastDelegate6 + : public FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=7 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7 ) > +// instead of +// FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7 ) > + // Inherit from FastDelegate7 so that it can be treated just like a FastDelegate7 + : public FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + +//N=8 +// Specialization to allow use of +// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8 ) > +// instead of +// FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > +template +class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8 ) > + // Inherit from FastDelegate8 so that it can be treated just like a FastDelegate8 + : public FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > +{ +public: + // Make using the base type a bit easier via typedef. + typedef FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > BaseType; + + // Allow users access to the specific type of this delegate. + typedef FastDelegate SelfType; + + // Mimic the base class constructors. + FastDelegate() : BaseType() { } + + template < class X, class Y > + FastDelegate(Y * pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 )) + : BaseType(pthis, function_to_bind) { } + + template < class X, class Y > + FastDelegate(const Y *pthis, + R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) const) + : BaseType(pthis, function_to_bind) + { } + + FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 )) + : BaseType(function_to_bind) { } + void operator = (const BaseType &x) { + *static_cast(this) = x; } +}; + + +#endif //FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX + +//////////////////////////////////////////////////////////////////////////////// +// Fast Delegates, part 5: +// +// MakeDelegate() helper function +// +// MakeDelegate(&x, &X::func) returns a fastdelegate of the type +// necessary for calling x.func() with the correct number of arguments. +// This makes it possible to eliminate many typedefs from user code. +// +//////////////////////////////////////////////////////////////////////////////// + +// Also declare overloads of a MakeDelegate() global function to +// reduce the need for typedefs. +// We need seperate overloads for const and non-const member functions. +// Also, because of the weird rule about the class of derived member function pointers, +// implicit downcasts may need to be applied later to the 'this' pointer. +// That's why two classes (X and Y) appear in the definitions. Y must be implicitly +// castable to X. + +// Workaround for VC6. VC6 needs void return types converted into DefaultVoid. +// GCC 3.2 and later won't compile this unless it's preceded by 'typename', +// but VC6 doesn't allow 'typename' in this context. +// So, I have to use a macro. + +#ifdef FASTDLGT_VC6 +#define FASTDLGT_RETTYPE detail::VoidToDefaultVoid::type +#else +#define FASTDLGT_RETTYPE RetType +#endif + +//N=0 +template +FastDelegate0 MakeDelegate(Y* x, RetType (X::*func)()) { + return FastDelegate0(x, func); +} + +template +FastDelegate0 MakeDelegate(Y* x, RetType (X::*func)() const) { + return FastDelegate0(x, func); +} + +//N=1 +template +FastDelegate1 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1)) { + return FastDelegate1(x, func); +} + +template +FastDelegate1 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1) const) { + return FastDelegate1(x, func); +} + +//N=2 +template +FastDelegate2 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2)) { + return FastDelegate2(x, func); +} + +template +FastDelegate2 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2) const) { + return FastDelegate2(x, func); +} + +//N=3 +template +FastDelegate3 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3)) { + return FastDelegate3(x, func); +} + +template +FastDelegate3 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3) const) { + return FastDelegate3(x, func); +} + +//N=4 +template +FastDelegate4 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { + return FastDelegate4(x, func); +} + +template +FastDelegate4 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { + return FastDelegate4(x, func); +} + +//N=5 +template +FastDelegate5 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { + return FastDelegate5(x, func); +} + +template +FastDelegate5 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { + return FastDelegate5(x, func); +} + +//N=6 +template +FastDelegate6 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { + return FastDelegate6(x, func); +} + +template +FastDelegate6 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { + return FastDelegate6(x, func); +} + +//N=7 +template +FastDelegate7 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { + return FastDelegate7(x, func); +} + +template +FastDelegate7 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { + return FastDelegate7(x, func); +} + +//N=8 +template +FastDelegate8 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { + return FastDelegate8(x, func); +} + +template +FastDelegate8 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { + return FastDelegate8(x, func); +} + + + // clean up after ourselves... +#undef FASTDLGT_RETTYPE + +} // namespace fastdelegate + + +#endif // FASTDELEGATE_H \ No newline at end of file diff --git a/external/dtEntity/include/dtEntity/FastDelegateBind.h b/external/dtEntity/include/dtEntity/FastDelegateBind.h new file mode 100644 index 000000000..5a1ef4826 --- /dev/null +++ b/external/dtEntity/include/dtEntity/FastDelegateBind.h @@ -0,0 +1,245 @@ +#pragma once + +#ifndef FASTDELEGATEBIND_H +#define FASTDELEGATEBIND_H + +// FastDelegateBind.h +// Helper file for FastDelegates. Provides bind() function, enabling +// FastDelegates to be rapidly compared to programs using boost::function and boost::bind. +// +// Documentation is found at http://www.codeproject.com/cpp/FastDelegate.asp +// +// Original author: Jody Hagins. +// Minor changes by Don Clugston. +// +// Warning: The arguments to 'bind' are ignored! No actual binding is performed. +// The behaviour is equivalent to boost::bind only when the basic placeholder +// arguments _1, _2, _3, etc are used in order. +// +// HISTORY: +// 1.4 Dec 2004. Initial release as part of FastDelegate 1.4. + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +//////////////////////////////////////////////////////////////////////////////// +// FastDelegate bind() +// +// bind() helper function for boost compatibility. +// (Original author: Jody Hagins). +// +// Add another helper, so FastDelegate can be a dropin replacement +// for boost::bind (in a fair number of cases). +// Note the elipses, because boost::bind() takes place holders +// but FastDelegate does not care about them. Getting the place holder +// mechanism to work, and play well with boost is a bit tricky, so +// we do the "easy" thing... +// Assume we have the following code... +// using boost::bind; +// bind(&Foo:func, &foo, _1, _2); +// we should be able to replace the "using" with... +// using fastdelegate::bind; +// and everything should work fine... +//////////////////////////////////////////////////////////////////////////////// + +#ifdef FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX + +namespace fastdelegate { + +//N=0 +template +FastDelegate< RetType ( ) > +bind( + RetType (X::*func)( ), + Y * y, + ...) +{ + return FastDelegate< RetType ( ) >(y, func); +} + +template +FastDelegate< RetType ( ) > +bind( + RetType (X::*func)( ) const, + Y * y, + ...) +{ + return FastDelegate< RetType ( ) >(y, func); +} + +//N=1 +template +FastDelegate< RetType ( Param1 p1 ) > +bind( + RetType (X::*func)( Param1 p1 ), + Y * y, + ...) +{ + return FastDelegate< RetType ( Param1 p1 ) >(y, func); +} + +template +FastDelegate< RetType ( Param1 p1 ) > +bind( + RetType (X::*func)( Param1 p1 ) const, + Y * y, + ...) +{ + return FastDelegate< RetType ( Param1 p1 ) >(y, func); +} + +//N=2 +template +FastDelegate< RetType ( Param1 p1, Param2 p2 ) > +bind( + RetType (X::*func)( Param1 p1, Param2 p2 ), + Y * y, + ...) +{ + return FastDelegate< RetType ( Param1 p1, Param2 p2 ) >(y, func); +} + +template +FastDelegate< RetType ( Param1 p1, Param2 p2 ) > +bind( + RetType (X::*func)( Param1 p1, Param2 p2 ) const, + Y * y, + ...) +{ + return FastDelegate< RetType ( Param1 p1, Param2 p2 ) >(y, func); +} + +//N=3 +template +FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3 ) > +bind( + RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3 ), + Y * y, + ...) +{ + return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3 ) >(y, func); +} + +template +FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3 ) > +bind( + RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3 ) const, + Y * y, + ...) +{ + return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3 ) >(y, func); +} + +//N=4 +template +FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) > +bind( + RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ), + Y * y, + ...) +{ + return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) >(y, func); +} + +template +FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) > +bind( + RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) const, + Y * y, + ...) +{ + return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) >(y, func); +} + +//N=5 +template +FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) > +bind( + RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ), + Y * y, + ...) +{ + return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) >(y, func); +} + +template +FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) > +bind( + RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) const, + Y * y, + ...) +{ + return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) >(y, func); +} + +//N=6 +template +FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) > +bind( + RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ), + Y * y, + ...) +{ + return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) >(y, func); +} + +template +FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) > +bind( + RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) const, + Y * y, + ...) +{ + return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) >(y, func); +} + +//N=7 +template +FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) > +bind( + RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ), + Y * y, + ...) +{ + return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) >(y, func); +} + +template +FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) > +bind( + RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) const, + Y * y, + ...) +{ + return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) >(y, func); +} + +//N=8 +template +FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) > +bind( + RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ), + Y * y, + ...) +{ + return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) >(y, func); +} + +template +FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) > +bind( + RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) const, + Y * y, + ...) +{ + return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) >(y, func); +} + + +#endif //FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX + +} // namespace fastdelegate + +#endif // FASTDELEGATEBIND_H \ No newline at end of file diff --git a/external/dtEntity/include/dtEntity/commandmessages.h b/external/dtEntity/include/dtEntity/commandmessages.h new file mode 100644 index 000000000..6be78fa9a --- /dev/null +++ b/external/dtEntity/include/dtEntity/commandmessages.h @@ -0,0 +1,457 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include + +namespace dtEntity +{ + + /** + * These messages can be sent by user code to trigger a reaction in + * a dtEntity subsystem. + */ + + + //////////////////////////////////////////////////////////////////////////////// + class MessageFactory; + + /** + * Adds all messages to message factory + */ + void DT_ENTITY_EXPORT RegisterCommandMessages(MessageFactory&); + + + //////////////////////////////////////////////////////////////////////////////// + /** + * Send this message to cause the map system to remove an entity from + * scene and delete it + */ + class DT_ENTITY_EXPORT DeleteEntityMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId UniqueIdId; + + DeleteEntityMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + void SetUniqueId(const std::string& v) { mUniqueId.Set(v); } + std::string GetUniqueId() const { return mUniqueId.Get(); } + + private: + + StringProperty mUniqueId; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Systems can react to this message by enabling their debug drawing. + */ + class DT_ENTITY_EXPORT EnableDebugDrawingMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId EnableId; + + EnableDebugDrawingMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + bool GetEnable() const { return mEnable.Get(); } + void SetEnable(bool v){ mEnable.Set(v); } + + private: + + BoolProperty mEnable; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Cause camera to be moved to entity + */ + class DT_ENTITY_EXPORT MoveCameraToEntityMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId AboutEntityId; + static const StringId DistanceId; + static const StringId KeepCameraDirectionId; + static const StringId ContextIdId; + + MoveCameraToEntityMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + EntityId GetAboutEntityId() const { return mAboutEntityId.Get(); } + void SetAboutEntityId(EntityId id) { mAboutEntityId.Set(id); } + + // default is 10 + double GetDistance() const { return mDistance.Get(); } + void SetDistance(double v) { mDistance.Set(v); } + + // if true: current eye direction of camera is preserved. + // if false: rotate camera from current position to target entity, then + // move until distance is reached + // true by default + bool GetKeepCameraDirection() const { return mKeepCameraDirection.Get(); } + void SetKeepCameraDirection(bool v) { mKeepCameraDirection.Set(v); } + + // camera context + int GetContextId() const { return mContextId.Get(); } + void SetContextId(int v) { mContextId.Set(v); } + + private: + + UIntProperty mAboutEntityId; + DoubleProperty mDistance; + BoolProperty mKeepCameraDirection; + IntProperty mContextId; + }; + + /////////////////////////////////////////////////////////////////////////////// + /** + * Cause camera to be moved to a specific position + */ + class DT_ENTITY_EXPORT MoveCameraToPositionMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId PositionId; + static const StringId LookAtId; + static const StringId UpId; + static const StringId ContextIdId; + + MoveCameraToPositionMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + Vec3d GetPosition() const { return mPosition.Get(); } + void SetPosition(const Vec3d& v) { mPosition.Set(v); } + + // if same as position: Look in direction of movement from last position + Vec3d GetLookAt() const { return mLookAt.Get(); } + void SetLookAt(const Vec3d& v) { mLookAt.Set(v); } + + Vec3f GetUp() const { return mUp.Get(); } + void SetUp(const Vec3f& v) { mUp.Set(v); } + + // camera context + int GetContextId() const { return mContextId.Get(); } + void SetContextId(int v) { mContextId.Set(v); } + + private: + + Vec3dProperty mPosition; + Vec3dProperty mLookAt; + Vec3Property mUp; + IntProperty mContextId; + }; + + /////////////////////////////////////////////////////////////////////////////// + /** + * Cause an animation to be played + */ + class DT_ENTITY_EXPORT PlayAnimationMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId AboutEntityId; + static const StringId AnimationNameId; + + PlayAnimationMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + EntityId GetAboutEntityId() const { return mAboutEntityId.Get(); } + void SetAboutEntityId(EntityId id) { mAboutEntityId.Set(id); } + + std::string GetAnimationName() const { return mAnimationName.Get(); } + void SetAnimationName(const std::string& id) { mAnimationName.Set(id); } + + private: + + UIntProperty mAboutEntityId; + StringProperty mAnimationName; + }; + + //////////////////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT RequestEntityDeselectMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId AboutEntityId; + + RequestEntityDeselectMessage(); + + // Create a copy of this message on the heap + virtual Message* Clone() const { return CloneContainer(); } + + void SetAboutEntityId(EntityId id) { mAboutEntity.Set(id); } + EntityId GetAboutEntityId() const { return mAboutEntity.Get(); } + + private: + + UIntProperty mAboutEntity; + }; + + //////////////////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT RequestEntitySelectMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId AboutEntityId; + static const StringId UseMultiSelectId; + + RequestEntitySelectMessage(); + + // Create a copy of this message on the heap + virtual Message* Clone() const { return CloneContainer(); } + + void SetAboutEntityId(EntityId id) { mAboutEntity.Set(id); } + EntityId GetAboutEntityId() const { return mAboutEntity.Get(); } + + void SetUseMultiSelect(bool v) { mUseMultiSelect.Set(v); } + bool GetUseMultiSelect() const { return mUseMultiSelect.Get(); } + + private: + + UIntProperty mAboutEntity; + BoolProperty mUseMultiSelect; + }; + + //////////////////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT RequestToggleEntitySelectionMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId AboutEntityId; + + RequestToggleEntitySelectionMessage(); + + // Create a copy of this message on the heap + virtual Message* Clone() const { return CloneContainer(); } + + void SetAboutEntityId(EntityId id) { mAboutEntity.Set(id); } + EntityId GetAboutEntityId() const { return mAboutEntity.Get(); } + + private: + + UIntProperty mAboutEntity; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Application system reacts to this message by retrieving a component of type t + * from entity identified by id and applying the property values of mProperty + * to the component. + */ + class DT_ENTITY_EXPORT SetComponentPropertiesMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId EntityUniqueIdId; + static const StringId ComponentTypeId; + static const StringId PropertiesId; + + SetComponentPropertiesMessage(); + + /** + * Initialize with single property. Prop is cloned! + */ + SetComponentPropertiesMessage(const std::string& entityUniqueId, + const std::string& componenttype, const std::string& propname, Property& prop); + + virtual Message* Clone() const { return CloneContainer(); } + + std::string GetEntityUniqueId() const { return mEntityUniqueId.Get(); } + void SetEntityUniqueId(const std::string& id) { mEntityUniqueId.Set(id); } + + void SetComponentType(const std::string& t) { mComponentType.Set(t); } + std::string GetComponentType() const { return mComponentType.Get(); } + + /** + * Group of properties that will be applied to entity system + */ + void SetComponentProperties(PropertyGroup& v) { mProperties.Set(v); } + const PropertyGroup& GetComponentProperties() const { return mProperties.Get(); } + + private: + StringProperty mComponentType; + GroupProperty mProperties; + StringProperty mEntityUniqueId; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Application system reacts to this message by retrieving the entity system + * of type t and applying the property values of mProperty to the entity system. + */ + class DT_ENTITY_EXPORT SetSystemPropertiesMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId ComponentTypeId; + static const StringId PropertiesId; + + SetSystemPropertiesMessage(); + + /** + * Initialize with single property. Prop is cloned! + */ + SetSystemPropertiesMessage(const std::string& componenttype, const std::string& propname, Property& prop); + + virtual Message* Clone() const { return CloneContainer(); } + + void SetComponentType(const std::string& t) { mComponentType.Set(t); } + std::string GetComponentType() const { return mComponentType.Get(); } + + /** + * Group of properties that will be applied to entity system + */ + void SetSystemProperties(PropertyGroup& v) { mProperties.Set(v); } + const PropertyGroup& GetSystemProperties() const { return mProperties.Get(); } + + private: + StringProperty mComponentType; + GroupProperty mProperties; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * User can send this message to cause the map system to spawn an entity from the given spawner. + * The contained unique id will be assigned to the spawned entity. + */ + class DT_ENTITY_EXPORT SpawnEntityMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId UniqueIdId; + static const StringId EntityNameId; + static const StringId SpawnerNameId; + static const StringId AddToSceneId; + SpawnEntityMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + void SetUniqueId(const std::string& v) { mUniqueId.Set(v); } + std::string GetUniqueId() const { return mUniqueId.Get(); } + + std::string GetSpawnerName() const { return mSpawnerName.Get(); } + void SetSpawnerName(const std::string& v) { mSpawnerName.Set(v); } + + std::string GetEntityName() const { return mEntityName.Get(); } + void SetEntityName(const std::string& v) { mEntityName.Set(v); } + + bool GetAddToScene() const { return mAddToScene.Get(); } + void SetAddToScene(bool v) { mAddToScene.Set(v); } + + private: + + StringProperty mUniqueId; + StringProperty mEntityName; + StringProperty mSpawnerName; + BoolProperty mAddToScene; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Send this to cause the tool system to switch to using the named tool + */ + class DT_ENTITY_EXPORT ToolActivatedMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId ToolNameId; + + ToolActivatedMessage(); + + // Create a copy of this message on the heap + virtual Message* Clone() const { return CloneContainer(); } + + void SetToolName(const std::string& n) { mToolName.Set(n); } + std::string GetToolName() const { return mToolName.Get(); } + + private: + + StringProperty mToolName; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** send this when you have added or removed a tool from tool manager + * mTools property should have data in this format: + * mtools contains a number of group properties. + * Each group property has entries + * StringProperty "ToolName" - name of tool as registered in tool manager + * StringProperty "IconPath" - path to icon to display for tool + * StringProperty "Shortcut" - keyboard shortcut for tool, example: "Ctrl+t" + */ + class DT_ENTITY_EXPORT ToolsUpdatedMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId ToolsId; + static const StringId ToolNameId; + static const StringId IconPathId; + static const StringId ShortcutId; + + ToolsUpdatedMessage(); + + // Create a copy of this message on the heap + virtual Message* Clone() const { return CloneContainer(); } + + void SetTools(const PropertyArray& n) { mTools.Set(n); } + PropertyArray GetTools() const { return mTools.Get(); } + + private: + + ArrayProperty mTools; + }; +} diff --git a/external/dtEntity/include/dtEntity/component.h b/external/dtEntity/include/dtEntity/component.h new file mode 100644 index 000000000..77963c3e9 --- /dev/null +++ b/external/dtEntity/include/dtEntity/component.h @@ -0,0 +1,60 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include + +namespace dtEntity +{ + class Entity; + + /** + * Components are lightweight property containers. + * Components can be used as per-entity data storage for entity systems. + * It is probably best to keep components as slim as possible and + * keep the logic in the entity systems. + */ + class Component + : public PropertyContainer + { + public: + + Component() {} + virtual ~Component() {} + + /** + * Return a unique identifier for this component + */ + virtual ComponentType GetType() const = 0; + + /** + * Gets called when component is instantiated + */ + virtual void OnAddedToEntity(Entity& entity) {} + + /** + * Gets called right before component is deleted + */ + virtual void OnRemovedFromEntity(Entity& entity) {} + + }; +} + diff --git a/external/dtEntity/include/dtEntity/componentfactories.h b/external/dtEntity/include/dtEntity/componentfactories.h new file mode 100644 index 000000000..5de5a3942 --- /dev/null +++ b/external/dtEntity/include/dtEntity/componentfactories.h @@ -0,0 +1,29 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include + +namespace dtEntity +{ + class ComponentPluginManager; + void DT_ENTITY_EXPORT RegisterStandardFactories(dtEntity::ComponentPluginManager& pluginManager); +} diff --git a/external/dtEntity/include/dtEntity/componentplugin.h b/external/dtEntity/include/dtEntity/componentplugin.h new file mode 100644 index 000000000..16dac0718 --- /dev/null +++ b/external/dtEntity/include/dtEntity/componentplugin.h @@ -0,0 +1,113 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include + +namespace dtEntity +{ + class EntityManager; + class EntitySystem; + + + /** + * PluginFactory is a pure virtual interface for the values + * returned by an entity system plugin entry point. + * The plugin factories are stored in the plugin manager and are used to list available + * entity systems, start and stop them. + */ + class ComponentPluginFactory + { + public: + + virtual ~ComponentPluginFactory() + { + } + + /** get the name of the entity system (the type string) */ + virtual std::string GetName() const = 0; + + /** + * Implementations should construct their entity system now and assign it to es variable + * Return true if success, else false + */ + virtual bool Create(EntityManager* em, EntitySystem*& es) = 0; + + /** delete the entity system */ + virtual void Destroy() {} + + /** + * return a textual description of the entity system functionality + */ + virtual std::string GetDescription() const { return ""; } + + /** + * fill list with types of all entity systems this system depends on. + * WARNING: circular dependencies are not handled and + * will cause a crash! + */ + virtual void GetDependencies(std::list&) {} + + osgDB::DynamicLibrary* GetLibrary() const { return mLibrary.get(); } + void SetLibrary(osgDB::DynamicLibrary* l) { mLibrary = l; } + + protected: + + osg::ref_ptr mLibrary; + }; + + template + class ComponentPluginFactoryImpl : public ComponentPluginFactory + { + public: + + ComponentPluginFactoryImpl(const std::string& name, const std::string& desc = "") + : mName(name) + , mDesc(desc) + { + } + + virtual bool Create(EntityManager* em, EntitySystem*& es) + { + es = new ES(*em); + return true; + } + + /** get the name of the plugin */ + virtual std::string GetName() const + { + return mName; + } + + /** get a description of the plugin */ + virtual std::string GetDescription() const + { + return mDesc; + } + private: + std::string mName; + std::string mDesc; + }; +} diff --git a/external/dtEntity/include/dtEntity/componentpluginmanager.h b/external/dtEntity/include/dtEntity/componentpluginmanager.h new file mode 100644 index 000000000..de1dab02f --- /dev/null +++ b/external/dtEntity/include/dtEntity/componentpluginmanager.h @@ -0,0 +1,169 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace dtEntity +{ + class MessageFactory; + + void DT_ENTITY_EXPORT AddToList(std::list& lst, int count, ...); + + // typedef for function pointer to get message factory from library + typedef void (*RegisterMessagesFn)(MessageFactory&); + + // typedef for function pointer to get entity system factory from library + typedef void (*CreatePluginFactoriesFn)(std::list&); + + /** + * The plugin manager is responsible for loading entity system factories from plugins, + * keep them around until they are needed, and start and stop the entity systems. + */ + class DT_ENTITY_EXPORT ComponentPluginManager + : public Singleton + { + + public: + + ComponentPluginManager(); + ~ComponentPluginManager(); + + typedef std::map PluginFactoryMap; + typedef std::set ActivePlugins; + + /** + * is there a factory for an entity system of this type? + */ + bool FactoryExists(ComponentType ctype); + + /** + * load all libraries in dir and add component factories to registry + */ + void LoadPluginsInDir(const std::string& path); + + /** + * If entity of this type is registered, start it and add it to entity manager. + * @param name Name of plugin to start + * @return true if success + */ + bool StartEntitySystem(EntityManager&, ComponentType ctype); + + /** + * stop all entity systems loaded from plugins and then unref the plugins + */ + void UnloadAllPlugins(EntityManager&); + + /** + * Directly add a factory for starting an entity system (instead of loading + * it from a plugin + */ + bool AddFactory(ComponentPluginFactory* factory); + + /** + * Load a shared library / dll from abs path and register + * the contained entity system factories + * A library can also be stored in the scene file, if desired (this can make it easier + * for applications to know what specific plugins to load). + * @abspath File name with path of plugin to load + * @saveWithScene Flag to tell if library will be saved with the scene (false by default) + * + * @return The list of new component types loaded from the plugin + */ + std::set AddPlugin(const std::string& abspath, bool saveWithScene = false); + + /** + * same as before, but doesn't expect a full path to plugin, instead takes + * a plugin directory and a library name without extension. + */ + std::set AddPlugin(const std::string& path, const std::string& libname, bool saveWithScene = false); + + /// Retrieves the names of the currently loaded plugins (with no path and no extension) + const std::map& GetLoadedPlugins() const { return mLoadedPlugins; } + + PluginFactoryMap& GetFactories() { return mFactories; } + + // get extension appended to lib name to point to shared library name + static std::string GetLibExtension(); + + // get library file name from plugin name, platform dependent + std::string GetSharedLibNameFromPluginName(const std::string& pluginName); + + private: + + /** Get PluginFactory for Plugin with this name. + * @param name The name of the Plugin/PluginFactory to get + */ + ComponentPluginFactory* GetPluginFactory(ComponentType ctype); + + /** load all plugin factories from libraries found in path */ + void LoadPluginFactories(const std::string& pluginname, const std::string& path, std::list& factories); + + /** map from plugin name -> plugin factory */ + PluginFactoryMap mFactories; + + /// List of libraries (plugins) currently loaded + /** + * We assume the library name is the same as the file name, with + * no path nor extension. We therefore just store the library name + * + The map stores each name with a flag that indicates if the library must be saved to + scene. It is up to the code filling this list to decide what libs must go to file. + */ + std::map mLoadedPlugins; + }; + +#if defined(_MSC_VER) || defined(__CYGWIN__) || defined(__MINGW32__) || defined( __BCPLUSPLUS__) || defined( __MWERKS__) + #define DTE_EXPORT_MACRO __declspec(dllexport) +#else + #define DTE_EXPORT_MACRO +#endif + +#define REGISTER_DTENTITYPLUGIN(pluginname, count, ...) \ + extern "C" DTE_EXPORT_MACRO void dtEntity_##pluginname(std::list& list) \ + {dtEntity::AddToList(list, count, __VA_ARGS__);} \ + + struct DT_ENTITY_EXPORT PluginFunctionProxy + { + PluginFunctionProxy(CreatePluginFactoriesFn plgfunction, RegisterMessagesFn msgfunction) ; + }; +} + +#if DTENTITY_LIBRARY_STATIC + + #define USE_DTENTITYPLUGIN(pluginname) \ + extern "C" void dtEntity_##pluginname(std::list&); \ + extern "C" void dtEntityMessages_##pluginname(dtEntity::MessageFactory& mf); \ + static dtEntity::PluginFunctionProxy proxy_##pluginname(dtEntity_##pluginname, dtEntityMessages_##pluginname); + +#else + #define USE_DTENTITYPLUGIN(pluginname) +#endif + + diff --git a/external/dtEntity/include/dtEntity/core.h b/external/dtEntity/include/dtEntity/core.h new file mode 100644 index 000000000..7677b3b23 --- /dev/null +++ b/external/dtEntity/include/dtEntity/core.h @@ -0,0 +1,44 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include + +namespace dtEntity +{ + + class DebugDrawInterface; + DT_ENTITY_EXPORT void SetDebugDrawInterface(DebugDrawInterface*); + DT_ENTITY_EXPORT DebugDrawInterface* GetDebugDrawInterface(); + + class InputInterface; + DT_ENTITY_EXPORT void SetInputInterface(InputInterface*); + DT_ENTITY_EXPORT InputInterface* GetInputInterface(); + + class SystemInterface; + DT_ENTITY_EXPORT void SetSystemInterface(SystemInterface*); + DT_ENTITY_EXPORT SystemInterface* GetSystemInterface(); + + class WindowInterface; + DT_ENTITY_EXPORT void SetWindowInterface(WindowInterface*); + DT_ENTITY_EXPORT WindowInterface* GetWindowInterface(); + +} diff --git a/external/dtEntity/include/dtEntity/debugdrawinterface.h b/external/dtEntity/include/dtEntity/debugdrawinterface.h new file mode 100644 index 000000000..52e516fe1 --- /dev/null +++ b/external/dtEntity/include/dtEntity/debugdrawinterface.h @@ -0,0 +1,211 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include + + +namespace dtEntity +{ + + /** + * Can be used to add simple debug geometry to the scene. Each debug graphics primitive is added + * together with a lifetime / duration. + * If you want to do per-frame drawing, simply set a duration of 0 and + * execute the draw each frame. + * Warning: To use, first do SetEnabled(true), it is off by default! + */ + class DebugDrawInterface + { + public: + + virtual ~DebugDrawInterface() {} + + /** + * Draw a single point + * @param position Draw point here + * @param color Draw with this color + * @param size Size of points in pixels + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + virtual void AddPoint(const Vec3f& position, const Vec4f& color, int size = 1, + float duration = 0, bool depthTestEnabled = true) = 0; + + /** + * Draw multiple points + * @param positions A vector of point positions + * @param color Draw with this color + * @param size Size of points in pixels + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + virtual void AddPoints(const std::vector& positions, const Vec4f& color, + int size = 1, float duration = 0, bool depthTestEnabled = true) = 0; + + /** + * Draw a single line + * @param start Line starts here + * @param end Line ends here + * @param color Draw with this color + * @param linewidth Width of line in pixels + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + virtual void AddLine(const Vec3f& start, const Vec3f& end, const Vec4f& color, + int linewidth = 1, float duration = 0, bool depthTestEnabled = true) = 0; + + /** + * Draw a number of lines + * @param lines A vector containing two entries for each line. So to draw two lines you have to have four entries. + * @param color Draw with this color + * @param linewidth Width of line in pixels + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + virtual void AddLines(const std::vector& lines, const Vec4f& color, + int linewidth = 1, float duration = 0, bool depthTestEnabled = true) = 0; + + /** + * Draw a 3d cross + * @param position Draw point here + * @param color Draw with this color + * @param size length of each arm + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + virtual void AddCross(const Vec3f& position, const Vec4f& color, float size, + float duration = 0, bool depthTestEnabled = true) = 0; + + /** + * Draw a sphere + * @param position Draw sphere here + * @param radius radius of sphere + * @param color Draw with this color + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + virtual void AddSphere(const Vec3f& position, float radius, const Vec4f& color, + float duration = 0, bool depthTestEnabled = true) = 0; + + /** + * Draw a single triangle + * @param vert0 First vertex of triangle + * @param vert1 Second vertex of triangle + * @param vert2 Third vertex of triangle + * @param color Draw with this color + * @param lineWidth with of line to draw in pixels + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + virtual void AddTriangle(const Vec3f& vert0, const Vec3f& vert1, + const Vec3f& vert2, const Vec4f& color, int lineWidth, + float duration = 0, bool depthTestEnabled = true) = 0; + + /** + * Draw multiple triangles + * @param verts A vector containing triangle verts. The vector should contain three entries for each triangle. + * @param color Draw with this color + * @param lineWidth with of line to draw in pixels + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + virtual void AddTriangles(const std::vector& verts, + const Vec4f& color, int lineWidth, float duration = 0, + bool depthTestEnabled = true) = 0; + + /** + * Draw a circle + * @param position Center of circle is here + * @param planeNormal A normal vector pointing away from the face of the disk + * @param radius Radius of disk + * @param color Draw with this color + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + virtual void AddCircle(const Vec3f& position, const Vec3f& planeNormal, + float radius, const Vec4f& color, float duration = 0, + bool depthTestEnabled = true) = 0; + + /** + * Draw a text string + * @param position Draw text here + * @param str The text to draw + * @param color Draw with this color + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + virtual void AddString(const Vec3f& position, const std::string& str, + const Vec4f& color, float duration = 0, bool depthTestEnabled = true) = 0; + + /** + * Draw an axis aligned bounding box + * @param minCoords start box from here + * @param maxCoords end box here + * @param color Draw with this color + * @param lineWidth with of line to draw + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + virtual void AddAABB(const Vec3f& minCoords, const Vec3f& maxCoords, + const Vec4f& color, int lineWidth, float duration = 0, + bool depthTestEnabled = true) = 0; + + /** + * Add an oriented bounding box + * @param matrix transformation matrix to apply to box + * @param minCoords start box from here + * @param maxCoords end box here + * @param color Draw with this color + * @param lineWidth with of line to draw + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + virtual void AddOBB(const Matrix& matrix, const Vec3f& minCoords, + const Vec3f& maxCoords, const Vec4f& color, int lineWidth, + float duration = 0, bool depthTestEnabled = true) = 0; + + /** + * Add a cross showing coordinate orientation + * @param matrix transformation cross by this matrix + * @param color Draw with this color + * @param size length of cross arms + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + virtual void AddAxes(const Matrix& matrix, const Vec4f& color, + float size, float duration = 0, bool depthTestEnabled = true) = 0; + + + /** + * DebugDrawInterface is disabled by default, enable it! + */ + virtual void SetEnabled(bool enabled) = 0; + virtual bool IsEnabled() const = 0; + + /** + * Immediately remove all debug geometry + */ + virtual void Clear() = 0; + + }; +} + diff --git a/external/dtEntity/include/dtEntity/defaultentitysystem.h b/external/dtEntity/include/dtEntity/defaultentitysystem.h new file mode 100644 index 000000000..ea72ee850 --- /dev/null +++ b/external/dtEntity/include/dtEntity/defaultentitysystem.h @@ -0,0 +1,335 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + + +#include +#include +#include + +#include +#include +#include + +#if USE_BOOST_POOL +#include +#include +#endif + +#include + + +namespace dtEntity +{ + + //////////////////////////////////////////////////////////////////////////////// + template + class ComponentStoreMap + : public std::unordered_map + { + public: + typedef typename std::unordered_map::size_type size_type; + + }; + + //////////////////////////////////////////////////////////////////////////////// + template + struct MemAllocPolicyNew + { + static T* Create() + { + return new T; + } + + static void Destroy(T* t) + { + delete t; + } + + static void DestroyAll(ComponentStoreMap& components) + { + for(typename ComponentStoreMap::iterator i = components.begin(); i != components.end(); ++i) + { + delete i->second; + } + } + + protected: + ~MemAllocPolicyNew() {} + }; + + + //////////////////////////////////////////////////////////////////////////////// +#if USE_BOOST_POOL + template + struct MemAllocPolicyBoostPool + { + static T* Create() + { + return mComponentPool->construct(); + } + + static void Destroy(T* t) + { + mComponentPool->destroy(t); + } + + static void DestroyAll(ComponentStoreMap& components) + { + delete mComponentPool; + } + + protected: + ~MemAllocPolicyBoostPool() {} + + private: + boost::object_pool* mComponentPool; + }; +#endif + + //////////////////////////////////////////////////////////////////////////////// + /** + * A simple base for an entity system that handles component allocation + * and deletion. + * Uses an unordered map for component storage + */ + template class MemAllocPolicy = MemAllocPolicyNew> + class DefaultEntitySystem + : public EntitySystem + , public MemAllocPolicy + { + public: + + typedef ComponentStoreMap ComponentStore; + typedef typename ComponentStoreMap::size_type size_type; + + DefaultEntitySystem(EntityManager& em, ComponentType baseType = StringId()) + : EntitySystem(em, baseType) + , mComponentType(T::TYPE) + { + } + + ~DefaultEntitySystem() + { + MemAllocPolicy::DestroyAll(mComponents); + } + + virtual ComponentType GetComponentType() const; + + virtual bool HasComponent(EntityId eid) const; + + T* GetComponent(EntityId eid); + const T* GetComponent(EntityId eid) const; + + virtual bool GetComponent(EntityId eid, Component*& c); + virtual bool GetComponent(EntityId eid, const Component*& c) const; + + virtual bool CreateComponent(EntityId eid, Component*& component); + virtual bool DeleteComponent(EntityId eid); + + virtual void GetEntitiesInSystem(std::list& toFill) const; + + size_type GetNumComponents() const; + + virtual GroupProperty GetComponentProperties() const; + + typename ComponentStore::iterator begin(); + typename ComponentStore::const_iterator begin() const; + + typename ComponentStore::iterator end(); + typename ComponentStore::const_iterator end() const; + + protected: + + ComponentStore mComponents; + ComponentType mComponentType; + }; + + + + //////////////////////////////////////////////////////////////////////////////// + template class MemAllocPolicy> + ComponentType DefaultEntitySystem::GetComponentType() const + { + return mComponentType; + } + + //////////////////////////////////////////////////////////////////////////////// + template class MemAllocPolicy> + bool DefaultEntitySystem::HasComponent(EntityId eid) const + { + typename ComponentStore::const_iterator i = mComponents.find(eid); + return(i != mComponents.end()); + } + + //////////////////////////////////////////////////////////////////////////////// + template class MemAllocPolicy> + T* DefaultEntitySystem::GetComponent(EntityId eid) + { + typename ComponentStore::iterator i = mComponents.find(eid); + if(i != mComponents.end()) + { + return i->second; + } + return NULL; + } + + //////////////////////////////////////////////////////////////////////////////// + template class MemAllocPolicy> + const T* DefaultEntitySystem::GetComponent(EntityId eid) const + { + typename ComponentStore::const_iterator i = mComponents.find(eid); + if(i != mComponents.end()) + { + return i->second; + } + return NULL; + } + + //////////////////////////////////////////////////////////////////////////////// + template class MemAllocPolicy> + bool DefaultEntitySystem::GetComponent(EntityId eid, Component*& c) + { + typename ComponentStore::iterator i = mComponents.find(eid); + if(i != mComponents.end()) + { + c = i->second; + return true; + } + return false; + } + + //////////////////////////////////////////////////////////////////////////////// + template class MemAllocPolicy> + bool DefaultEntitySystem::GetComponent(EntityId eid, const Component*& c) const + { + typename ComponentStore::const_iterator i = mComponents.find(eid); + if(i != mComponents.end()) + { + c = i->second; + return true; + } + return false; + } + + //////////////////////////////////////////////////////////////////////////////// + template class MemAllocPolicy> + bool DefaultEntitySystem::CreateComponent(EntityId eid, Component*& component) + { + if(HasComponent(eid)) + { + LOG_ERROR("Could not create component: already exists!"); + return false; + } + + T* t = MemAllocPolicy::Create(); + + if(t == NULL) + { + LOG_ERROR("Out of memory!"); + return false; + } + component = t; + mComponents[eid] = t; + + Entity* e; + bool found = GetEntityManager().GetEntity(eid, e); + if(!found) + { + LOG_ERROR("Can't add component to entity: entity does not exist!"); + return false; + } + component->OnAddedToEntity(*e); + return true; + } + + //////////////////////////////////////////////////////////////////////////////// + template class MemAllocPolicy> + bool DefaultEntitySystem::DeleteComponent(EntityId eid) + { + typename ComponentStore::iterator i = mComponents.find(eid); + if(i == mComponents.end()) + return false; + T* component = i->second; + Entity* e; + bool found = GetEntityManager().GetEntity(eid, e); + assert(found); + component->OnRemovedFromEntity(*e); + mComponents.erase(i); + MemAllocPolicy::Destroy(component); + return true; + } + + //////////////////////////////////////////////////////////////////////////////// + template class MemAllocPolicy> + void DefaultEntitySystem::GetEntitiesInSystem(std::list& toFill) const + { + typename ComponentStore::const_iterator i = mComponents.begin(); + for(;i != mComponents.end(); ++i) + { + toFill.push_back(i->first); + } + } + + //////////////////////////////////////////////////////////////////////////////// + template class MemAllocPolicy> + typename DefaultEntitySystem::size_type DefaultEntitySystem::GetNumComponents() const + { + return mComponents.size(); + } + + //////////////////////////////////////////////////////////////////////////////// + template class MemAllocPolicy> + GroupProperty DefaultEntitySystem::GetComponentProperties() const + { + T t; + return t; + } + + //////////////////////////////////////////////////////////////////////////////// + template class MemAllocPolicy> + typename ComponentStoreMap::iterator DefaultEntitySystem::begin() + { + return mComponents.begin(); + } + + //////////////////////////////////////////////////////////////////////////////// + template class MemAllocPolicy> + typename ComponentStoreMap::const_iterator DefaultEntitySystem::begin() const + { + return mComponents.begin(); + } + + //////////////////////////////////////////////////////////////////////////////// + template class MemAllocPolicy> + typename ComponentStoreMap::iterator DefaultEntitySystem::end() + { + return mComponents.end(); + } + + //////////////////////////////////////////////////////////////////////////////// + template class MemAllocPolicy> + typename ComponentStoreMap::const_iterator DefaultEntitySystem::end() const + { + return mComponents.end(); + } +} + diff --git a/external/dtEntity/include/dtEntity/dtentity_config.h b/external/dtEntity/include/dtEntity/dtentity_config.h new file mode 100644 index 000000000..92aa5c8af --- /dev/null +++ b/external/dtEntity/include/dtEntity/dtentity_config.h @@ -0,0 +1,32 @@ +#pragma once + +// auto-generated by CMake, do not edit! + +#define DTENTITY_VERSION_MAJOR 0 +#define DTENTITY_VERSION_MINOR 1 +#define DTENTITY_VERSION_PATCH 1 + +// build entity systems for sound support? +#define BUILD_OPENAL 0 + +// should boost::pool be used for memory allocations of components? +#define USE_BOOST_POOL 0 + +// build dtEntity and its libs as static libraries? +#define DTENTITY_LIBRARY_STATIC 0 + +// use strings instead of hash values? +#define DTENTITY_USE_STRINGS_AS_STRINGIDS 0 + +// was google protocol buffers found by cmake? +#define PROTOBUF_FOUND 0 + +// was enet found by cmake? +#define ENET_FOUND 0 + +// should dtEntity call OnPropertyChanged() method when a property of a component +// was changed? For backwards compability only +#define CALL_ONPROPERTYCHANGED_METHOD 1 + +// Should message calls be profiled? +#define DTENTITY_PROFILING_ENABLED 0 diff --git a/external/dtEntity/include/dtEntity/dynamicproperty.h b/external/dtEntity/include/dtEntity/dynamicproperty.h new file mode 100644 index 000000000..16d422343 --- /dev/null +++ b/external/dtEntity/include/dtEntity/dynamicproperty.h @@ -0,0 +1,628 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include + +namespace dtEntity +{ + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT DynamicArrayProperty : public Property + { + public: + typedef fastdelegate::FastDelegate1 SetValueCB; + typedef fastdelegate::FastDelegate0 GetValueCB; + + DynamicArrayProperty() {} + + DynamicArrayProperty(const SetValueCB& s, const GetValueCB& g) + : mSetValueCallback(s) + , mGetValueCallback(g) + { + } + + virtual DataType::e GetDataType() const { return DataType::ARRAY; } + + virtual PropertyArray ArrayValue() const { return mGetValueCallback(); } + virtual void SetArray(const PropertyArray& v) { Set(v); } + + virtual const std::string StringValue() const { ArrayProperty p(Get()); return p.StringValue(); } + virtual void SetString(const std::string& v) { ArrayProperty p; p.SetString(v); Set(p.Get());} + PropertyArray Get() const { return mGetValueCallback(); } + + virtual Property* Clone() const { return new ArrayProperty(Get()); } + virtual bool operator==(const Property& other) const { return other.ArrayValue() == Get(); } + void Set(const PropertyArray& v) { mSetValueCallback(v); } + virtual bool SetFrom(const Property& other) { Set(other.ArrayValue()); return true; } + + private: + + SetValueCB mSetValueCallback; + GetValueCB mGetValueCallback; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT DynamicBoolProperty : public Property + { + public: + typedef fastdelegate::FastDelegate1 SetValueCB; + typedef fastdelegate::FastDelegate0 GetValueCB; + + DynamicBoolProperty() {} + + DynamicBoolProperty(const SetValueCB& s, const GetValueCB& g) + : mSetValueCallback(s) + , mGetValueCallback(g) + { + } + + virtual DataType::e GetDataType() const { return DataType::BOOL; } + + virtual bool BoolValue() const { return mGetValueCallback(); } + virtual void SetBool(bool v) { Set(v); } + + virtual const std::string StringValue() const { BoolProperty p(Get()); return p.StringValue(); } + virtual void SetString(const std::string& v) { BoolProperty p; p.SetString(v); Set(p.Get());} + bool Get() const { return mGetValueCallback(); } + + virtual Property* Clone() const { return new BoolProperty(Get()); } + virtual bool operator==(const Property& other) const { return other.BoolValue() == Get(); } + void Set(bool v) { mSetValueCallback(v); } + virtual bool SetFrom(const Property& other) { Set(other.BoolValue()); return true; } + + private: + + SetValueCB mSetValueCallback; + GetValueCB mGetValueCallback; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT DynamicDoubleProperty : public Property + { + public: + typedef fastdelegate::FastDelegate1 SetValueCB; + typedef fastdelegate::FastDelegate0 GetValueCB; + + DynamicDoubleProperty() {} + + DynamicDoubleProperty(const SetValueCB& s, const GetValueCB& g) + : mSetValueCallback(s) + , mGetValueCallback(g) + { + } + + virtual DataType::e GetDataType() const { return DataType::DOUBLE; } + + virtual double DoubleValue() const { return mGetValueCallback(); } + virtual void SetDouble(double v) { Set(v); } + + virtual const std::string StringValue() const { DoubleProperty p(Get()); return p.StringValue(); } + virtual void SetString(const std::string& v) { DoubleProperty p; p.SetString(v); Set(p.Get());} + double Get() const { return mGetValueCallback(); } + + virtual Property* Clone() const { return new DoubleProperty(Get()); } + virtual bool operator==(const Property& other) const { return other.DoubleValue() == Get(); } + void Set(double v) { mSetValueCallback(v); } + virtual bool SetFrom(const Property& other) { Set(other.DoubleValue()); return true; } + + private: + + SetValueCB mSetValueCallback; + GetValueCB mGetValueCallback; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT DynamicFloatProperty : public Property + { + public: + typedef fastdelegate::FastDelegate1 SetValueCB; + typedef fastdelegate::FastDelegate0 GetValueCB; + + DynamicFloatProperty() {} + + DynamicFloatProperty(const SetValueCB& s, const GetValueCB& g) + : mSetValueCallback(s) + , mGetValueCallback(g) + { + } + + virtual DataType::e GetDataType() const { return DataType::FLOAT; } + + virtual float FloatValue() const { return mGetValueCallback(); } + virtual void SetFloat(float v) { Set(v); } + + virtual const std::string StringValue() const { FloatProperty p(Get()); return p.StringValue(); } + virtual void SetString(const std::string& v) { FloatProperty p; p.SetString(v); Set(p.Get());} + float Get() const { return mGetValueCallback(); } + + virtual Property* Clone() const { return new FloatProperty(Get()); } + virtual bool operator==(const Property& other) const { return other.FloatValue() == Get(); } + void Set(float v) { mSetValueCallback(v); } + virtual bool SetFrom(const Property& other) { Set(other.FloatValue()); return true; } + + private: + + SetValueCB mSetValueCallback; + GetValueCB mGetValueCallback; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT DynamicGroupProperty : public Property + { + public: + typedef fastdelegate::FastDelegate1 SetValueCB; + typedef fastdelegate::FastDelegate0 GetValueCB; + + DynamicGroupProperty() {} + + DynamicGroupProperty(const SetValueCB& s, const GetValueCB& g) + : mSetValueCallback(s) + , mGetValueCallback(g) + { + } + + virtual DataType::e GetDataType() const { return DataType::GROUP; } + + virtual PropertyGroup GroupValue() const { return mGetValueCallback(); } + virtual void SetGroup(const PropertyGroup& v) { Set(v); } + + virtual const std::string StringValue() const { GroupProperty p(Get()); return p.StringValue(); } + virtual void SetString(const std::string& v) { GroupProperty p; p.SetString(v); Set(p.Get());} + PropertyGroup Get() const { return mGetValueCallback(); } + + virtual Property* Clone() const { return new GroupProperty(Get()); } + virtual bool operator==(const Property& other) const { return other.GroupValue() == Get(); } + void Set(const PropertyGroup& v) { mSetValueCallback(v); } + virtual bool SetFrom(const Property& other) { Set(other.GroupValue()); return true; } + + private: + + SetValueCB mSetValueCallback; + GetValueCB mGetValueCallback; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT DynamicIntProperty : public Property + { + public: + typedef fastdelegate::FastDelegate1 SetValueCB; + typedef fastdelegate::FastDelegate0 GetValueCB; + + DynamicIntProperty() {} + + DynamicIntProperty(const SetValueCB& s, const GetValueCB& g) + : mSetValueCallback(s) + , mGetValueCallback(g) + { + } + + virtual DataType::e GetDataType() const { return DataType::INT; } + + virtual int IntValue() const { return mGetValueCallback(); } + virtual void SetInt(int v) { Set(v); } + + virtual const std::string StringValue() const { IntProperty p(Get()); return p.StringValue(); } + virtual void SetString(const std::string& v) { IntProperty p; p.SetString(v); Set(p.Get());} + int Get() const { return mGetValueCallback(); } + + virtual Property* Clone() const { return new IntProperty(Get()); } + virtual bool operator==(const Property& other) const { return other.IntValue() == Get(); } + void Set(int v) { mSetValueCallback(v); } + virtual bool SetFrom(const Property& other) { Set(other.IntValue()); return true; } + + private: + + SetValueCB mSetValueCallback; + GetValueCB mGetValueCallback; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT DynamicStringProperty : public Property + { + public: + typedef fastdelegate::FastDelegate1< const std::string&, void> SetValueCB; + typedef fastdelegate::FastDelegate0 GetValueCB; + + DynamicStringProperty() {} + + DynamicStringProperty(const SetValueCB& s, const GetValueCB& g) + : mSetValueCallback(s) + , mGetValueCallback(g) + { + } + + virtual DataType::e GetDataType() const { return DataType::STRING; } + + virtual const std::string StringValue() const { return mGetValueCallback(); } + virtual StringId StringIdValue() const { return dtEntity::SIDHash(StringValue()); } + //virtual void SetStringId(dtEntity::StringId v) { Set(GetStringFromSID(v)); } + + const std::string Get() const { return mGetValueCallback(); } + + virtual Property* Clone() const { return new StringProperty(Get()); } + virtual bool operator==(const Property& other) const { return other.StringValue() == Get(); } + void Set(const std::string& v) { mSetValueCallback(v); } + virtual void SetString(const std::string& v) { Set(v); } + virtual bool SetFrom(const Property& other) { Set(other.StringValue()); return true; } + + private: + + SetValueCB mSetValueCallback; + GetValueCB mGetValueCallback; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT DynamicStringIdProperty : public Property + { + public: + typedef fastdelegate::FastDelegate1 SetValueCB; + typedef fastdelegate::FastDelegate0 GetValueCB; + + DynamicStringIdProperty() {} + + DynamicStringIdProperty(const SetValueCB& s, const GetValueCB& g) + : mSetValueCallback(s) + , mGetValueCallback(g) + { + } + + virtual DataType::e GetDataType() const { return DataType::STRINGID; } + + virtual StringId StringIdValue() const { return mGetValueCallback(); } + virtual void SetStringId(StringId v) { Set(v); } + + virtual const std::string StringValue() const { StringIdProperty p(Get()); return p.StringValue(); } + virtual void SetString(const std::string& v) { StringIdProperty p; p.SetString(v); Set(p.Get());} + StringId Get() const { return mGetValueCallback(); } + + virtual Property* Clone() const { return new StringIdProperty(Get()); } + virtual bool operator==(const Property& other) const { return other.StringIdValue() == Get(); } + void Set(StringId v) { mSetValueCallback(v); } + virtual bool SetFrom(const Property& other) { Set(other.StringIdValue()); return true; } + + private: + + SetValueCB mSetValueCallback; + GetValueCB mGetValueCallback; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT DynamicUIntProperty : public Property + { + public: + typedef fastdelegate::FastDelegate1 SetValueCB; + typedef fastdelegate::FastDelegate0 GetValueCB; + + DynamicUIntProperty() {} + + DynamicUIntProperty(const SetValueCB& s, const GetValueCB& g) + : mSetValueCallback(s) + , mGetValueCallback(g) + { + } + + virtual DataType::e GetDataType() const { return DataType::UINT; } + + virtual unsigned int UIntValue() const { return mGetValueCallback(); } + virtual void SetUInt(unsigned int v) { Set(v); } + + virtual const std::string StringValue() const { UIntProperty p(Get()); return p.StringValue(); } + virtual void SetString(const std::string& v) { UIntProperty p; p.SetString(v); Set(p.Get());} + unsigned int Get() const { return mGetValueCallback(); } + + virtual Property* Clone() const { return new UIntProperty(Get()); } + virtual bool operator==(const Property& other) const { return other.UIntValue() == Get(); } + void Set(unsigned int v) { mSetValueCallback(v); } + virtual bool SetFrom(const Property& other) { Set(other.UIntValue()); return true; } + + private: + + SetValueCB mSetValueCallback; + GetValueCB mGetValueCallback; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT DynamicVec2dProperty : public Property + { + public: + typedef fastdelegate::FastDelegate1< const Vec2d&, void> SetValueCB; + typedef fastdelegate::FastDelegate0 GetValueCB; + + DynamicVec2dProperty() {} + + DynamicVec2dProperty(const SetValueCB& s, const GetValueCB& g) + : mSetValueCallback(s) + , mGetValueCallback(g) + { + } + + virtual DataType::e GetDataType() const { return DataType::VEC2D; } + + virtual Vec2f Vec2Value() const { return Get(); } + virtual void SetVec2(const Vec2f& v) { Set(v); } + virtual Vec2d Vec2dValue() const { return Get(); } + virtual void SetVec2D(const Vec2d& v) { Set(v); } + virtual const std::string StringValue() const { Vec2dProperty p(Get()); return p.StringValue(); } + Vec2d Get() const { return mGetValueCallback(); } + + virtual Property* Clone() const { return new Vec2dProperty(Get()); } + virtual bool operator==(const Property& other) const { return other.Vec2dValue() == Get(); } + void Set(const Vec2d& v) { mSetValueCallback(v); } + virtual void SetString(const std::string& v) { Vec2dProperty p; p.SetString(v); Set(p.Get());} + virtual bool SetFrom(const Property& other) { Set(other.Vec2dValue()); return true; } + + private: + + SetValueCB mSetValueCallback; + GetValueCB mGetValueCallback; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT DynamicVec3dProperty : public Property + { + public: + typedef fastdelegate::FastDelegate1< const Vec3d&, void> SetValueCB; + typedef fastdelegate::FastDelegate0 GetValueCB; + + DynamicVec3dProperty() {} + + DynamicVec3dProperty(const SetValueCB& s, const GetValueCB& g) + : mSetValueCallback(s) + , mGetValueCallback(g) + { + } + + virtual DataType::e GetDataType() const { return DataType::VEC3D; } + + virtual Vec3f Vec3Value() const { return Get(); } + virtual void SetVec3(const Vec3f& v) { Set(v); } + virtual Vec3d Vec3dValue() const { return Get(); } + virtual void SetVec3D(const Vec3d& v) { Set(v); } + virtual const std::string StringValue() const { Vec3dProperty p(Get()); return p.StringValue(); } + Vec3d Get() const { return mGetValueCallback(); } + + virtual Property* Clone() const { return new Vec3dProperty(Get()); } + virtual bool operator==(const Property& other) const { return other.Vec3dValue() == Get(); } + void Set(const Vec3d& v) { mSetValueCallback(v); } + virtual void SetString(const std::string& v) { Vec3dProperty p; p.SetString(v); Set(p.Get());} + virtual bool SetFrom(const Property& other) { Set(other.Vec3dValue()); return true; } + + private: + + SetValueCB mSetValueCallback; + GetValueCB mGetValueCallback; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT DynamicVec4dProperty : public Property + { + public: + typedef fastdelegate::FastDelegate1< const Vec4d&, void> SetValueCB; + typedef fastdelegate::FastDelegate0 GetValueCB; + + DynamicVec4dProperty() {} + + DynamicVec4dProperty(const SetValueCB& s, const GetValueCB& g) + : mSetValueCallback(s) + , mGetValueCallback(g) + { + } + + virtual DataType::e GetDataType() const { return DataType::VEC4D; } + + virtual Vec4f Vec4Value() const { return Get(); } + virtual void SetVec4(const Vec4f& v) { Set(v); } + virtual Vec4d Vec4dValue() const { return Get(); } + virtual void SetVec4D(const Vec4d& v) { Set(v); } + virtual const std::string StringValue() const { Vec4dProperty p(Get()); return p.StringValue(); } + Vec4d Get() const { return mGetValueCallback(); } + + virtual Property* Clone() const { return new Vec4dProperty(Get()); } + virtual bool operator==(const Property& other) const { return other.Vec4dValue() == Get(); } + void Set(const Vec4d& v) { mSetValueCallback(v); } + virtual void SetString(const std::string& v) { Vec4dProperty p; p.SetString(v); Set(p.Get());} + virtual bool SetFrom(const Property& other) { Set(other.Vec4dValue()); return true; } + + private: + + SetValueCB mSetValueCallback; + GetValueCB mGetValueCallback; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT DynamicVec2Property : public Property + { + public: + typedef fastdelegate::FastDelegate1 SetValueCB; + typedef fastdelegate::FastDelegate0 GetValueCB; + + DynamicVec2Property() {} + + DynamicVec2Property(const SetValueCB& s, const GetValueCB& g) + : mSetValueCallback(s) + , mGetValueCallback(g) + { + } + + virtual DataType::e GetDataType() const { return DataType::VEC2; } + + virtual Vec2f Vec2Value() const { return Get(); } + virtual void SetVec2(const Vec2f& v) { Set(v); } + virtual Vec2d Vec2dValue() const { return Get(); } + virtual void SetVec2D(const Vec2d& v) { Set(v); } + virtual const std::string StringValue() const { Vec2Property p(Get()); return p.StringValue(); } + Vec2f Get() const { return mGetValueCallback(); } + + virtual Property* Clone() const { return new Vec2Property(Get()); } + virtual bool operator==(const Property& other) const { return other.Vec2Value() == Get(); } + void Set(const Vec2f& v) { mSetValueCallback(v); } + virtual void SetString(const std::string& v) { Vec2Property p; p.SetString(v); Set(p.Get());} + virtual bool SetFrom(const Property& other) { Set(other.Vec2Value()); return true; } + + private: + + SetValueCB mSetValueCallback; + GetValueCB mGetValueCallback; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT DynamicVec3Property : public Property + { + public: + typedef fastdelegate::FastDelegate1< const Vec3f&, void> SetValueCB; + typedef fastdelegate::FastDelegate0 GetValueCB; + + DynamicVec3Property() {} + + DynamicVec3Property(const SetValueCB& s, const GetValueCB& g) + : mSetValueCallback(s) + , mGetValueCallback(g) + { + } + + virtual DataType::e GetDataType() const { return DataType::VEC3; } + + virtual Vec3f Vec3Value() const { return Get(); } + virtual void SetVec3(const Vec3f& v) { Set(v); } + virtual Vec3d Vec3dValue() const { return Get(); } + virtual void SetVec3D(const Vec3d& v) { Set(v); } + virtual const std::string StringValue() const { Vec3Property p(Get()); return p.StringValue(); } + Vec3f Get() const { return mGetValueCallback(); } + + virtual Property* Clone() const { return new Vec3Property(Get()); } + virtual bool operator==(const Property& other) const { return other.Vec3Value() == Get(); } + void Set(const Vec3f& v) { mSetValueCallback(v); } + virtual void SetString(const std::string& v) { Vec3Property p; p.SetString(v); Set(p.Get());} + virtual bool SetFrom(const Property& other) { Set(other.Vec3Value()); return true; } + + private: + + SetValueCB mSetValueCallback; + GetValueCB mGetValueCallback; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT DynamicVec4Property : public Property + { + public: + typedef fastdelegate::FastDelegate1< const Vec4f&, void> SetValueCB; + typedef fastdelegate::FastDelegate0 GetValueCB; + + DynamicVec4Property() {} + + DynamicVec4Property(const SetValueCB& s, const GetValueCB& g) + : mSetValueCallback(s) + , mGetValueCallback(g) + { + } + + virtual DataType::e GetDataType() const { return DataType::VEC4; } + + virtual Vec4f Vec4Value() const { return Get(); } + virtual void SetVec4(const Vec4f& v) { Set(v); } + virtual Vec4d Vec4dValue() const { return Get(); } + virtual void SetVec4D(const Vec4d& v) { Set(v); } + virtual const std::string StringValue() const { Vec4Property p(Get()); return p.StringValue(); } + Vec4f Get() const { return mGetValueCallback(); } + + virtual Property* Clone() const { return new Vec4Property(Get()); } + virtual bool operator==(const Property& other) const { return other.Vec4Value() == Get(); } + void Set(const Vec4f& v) { mSetValueCallback(v); } + virtual void SetString(const std::string& v) { Vec4Property p; p.SetString(v); Set(p.Get());} + virtual bool SetFrom(const Property& other) { Set(other.Vec4Value()); return true; } + + private: + + SetValueCB mSetValueCallback; + GetValueCB mGetValueCallback; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT DynamicQuatProperty : public Property + { + public: + typedef fastdelegate::FastDelegate1< const Quat&, void> SetValueCB; + typedef fastdelegate::FastDelegate0 GetValueCB; + + virtual DataType::e GetDataType() const { return DataType::QUAT; } + + DynamicQuatProperty() {} + + DynamicQuatProperty(const SetValueCB& s, const GetValueCB& g) + : mSetValueCallback(s) + , mGetValueCallback(g) + { + } + + virtual Quat QuatValue() const { return Get(); } + virtual void SetQuat(const Quat& v) { Set(v); } + virtual const std::string StringValue() const { QuatProperty p(Get()); return p.StringValue(); } + Quat Get() const { return mGetValueCallback(); } + + virtual Property* Clone() const { return new QuatProperty(Get()); } + virtual bool operator==(const Property& other) const { return other.QuatValue() == Get(); } + void Set(const Quat& v) { mSetValueCallback(v); } + virtual void SetString(const std::string& v) { QuatProperty p; p.SetString(v); Set(p.Get());} + virtual bool SetFrom(const Property& other) { Set(other.QuatValue()); return true; } + + private: + + SetValueCB mSetValueCallback; + GetValueCB mGetValueCallback; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT DynamicMatrixProperty : public Property + { + public: + typedef fastdelegate::FastDelegate1 SetValueCB; + typedef fastdelegate::FastDelegate0 GetValueCB; + + virtual DataType::e GetDataType() const { return DataType::MATRIX; } + + DynamicMatrixProperty() {} + + DynamicMatrixProperty(const SetValueCB& s, const GetValueCB& g) + : mSetValueCallback(s) + , mGetValueCallback(g) + { + } + + virtual Matrix MatrixValue() const { return Get(); } + virtual void SetMatrix(const Matrix& v) { Set(v); } + virtual const std::string StringValue() const { MatrixProperty p(Get()); return p.StringValue(); } + Matrix Get() const { return mGetValueCallback(); } + + virtual Property* Clone() const { return new MatrixProperty(Get()); } + virtual bool operator==(const Property& other) const { return other.MatrixValue() == Get(); } + void Set(const Matrix& v) { mSetValueCallback(v); } + virtual void SetString(const std::string& v) { MatrixProperty p; p.SetString(v); Set(p.Get());} + virtual bool SetFrom(const Property& other) { Set(other.MatrixValue()); return true;} + + private: + + SetValueCB mSetValueCallback; + GetValueCB mGetValueCallback; + }; + +} diff --git a/external/dtEntity/include/dtEntity/dynamicscomponent.h b/external/dtEntity/include/dtEntity/dynamicscomponent.h new file mode 100644 index 000000000..2d978e8dd --- /dev/null +++ b/external/dtEntity/include/dtEntity/dynamicscomponent.h @@ -0,0 +1,88 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include + +namespace dtEntity +{ + + + /////////////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT DynamicsComponent + : public Component + { + public: + + typedef Component BaseClass; + + static const ComponentType TYPE; + static const StringId VelocityId; + static const StringId AngularVelocityId; + static const StringId AccelerationId; + + DynamicsComponent(); + virtual ~DynamicsComponent(); + + virtual ComponentType GetType() const { return TYPE; } + + void OnAddedToEntity(Entity &entity) { mEntity = &entity; } + + Vec3f GetVelocity() const { return mVelocityVal; } + void SetVelocity(const Vec3f& v); + + const Quat& GetAngularVelocity() const { return mAngularVelocity.GetAsQuat(); } + void SetAngularVelocity(const Quat& v) { mAngularVelocity.Set(v); } + + const Vec3f& GetAcceleration() const { return mAcceleration.GetAsVec3(); } + void SetAcceleration(const Vec3f& v) { mAcceleration.Set(v); } + + protected: + Entity* mEntity; + + // path to loaded script file + DynamicVec3Property mVelocity; + Vec3f mVelocityVal; + QuatProperty mAngularVelocity; + Vec3Property mAcceleration; + bool mIsMoving; + + }; + + + /////////////////////////////////////////////////////////////////////////// + // storage only + class DT_ENTITY_EXPORT DynamicsSystem + : public DefaultEntitySystem + { + public: + + static const ComponentType TYPE; + + DynamicsSystem(EntityManager& em); + ~DynamicsSystem(); + + }; +} diff --git a/external/dtEntity/include/dtEntity/entity.h b/external/dtEntity/include/dtEntity/entity.h new file mode 100644 index 000000000..873dbedf0 --- /dev/null +++ b/external/dtEntity/include/dtEntity/entity.h @@ -0,0 +1,129 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include + +namespace dtEntity +{ + + /** + * The entity class is simply a convenience class to bundle + * the entity ID and access to the entity manager. + */ + class DT_ENTITY_EXPORT Entity + { + public: + + /** + * Constructor. + * @param em The entity manager that holds this entity + * @param id The unique ID of this entity + */ + Entity(EntityManager& em, EntityId id); + + /** + * Create a component of given type and assign it to component + * @param t Type of component to construct + * @param component Receives newly constructed component + * @return true if success + */ + bool CreateComponent(ComponentType t, Component*& component); + + // templated version + template + bool CreateComponent(T*& component); + + /** + * Get component from this entity + * @param component receives the component if found + * @param searchDerived Return components of derived typs if found + * @return true if found + */ + template + bool GetComponent(T*& component, bool searchDerived = false) const; + + /** + * Get component from this entity + * @param component receives the component if found + * @param searchDerived Return components of derived typs if found + * @return true if found + */ + bool GetComponent(ComponentType t, Component*& component, bool searchDerived = false) const; + + /** + * Get a list of all component associated with this entity + * @param toFill receives the components + */ + void GetComponents(std::vector& toFill); + void GetComponents(std::vector& toFill) const; + + /** + * @return true if a component of this type is assigned to entity + */ + bool HasComponent(ComponentType t) const; + + /** + * get unique identifier of this entity + */ + EntityId GetId() const; + + /** + * @return the entity manager this entity is assigned to + */ + EntityManager& GetEntityManager() const; + + private: + + // internal ID + EntityId mId; + + // The entity manager that holds this entity + EntityManager* mEntityManager; + }; + + + //////////////////////////////////////////////////////////////////////////////// + + + template + bool Entity::CreateComponent(T*& component) + { + Component* c; + bool success = CreateComponent(T::TYPE, c); + if (success) + component = static_cast(c); + else + component = nullptr; + return success; + } + + template + bool Entity::GetComponent(T*& component, bool derived) const + { + return GetEntityManager().GetComponent(this->GetId(), component, derived); + } +} + diff --git a/external/dtEntity/include/dtEntity/entityid.h b/external/dtEntity/include/dtEntity/entityid.h new file mode 100644 index 000000000..e009c189e --- /dev/null +++ b/external/dtEntity/include/dtEntity/entityid.h @@ -0,0 +1,27 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +namespace dtEntity +{ + // serial ID for entities + typedef unsigned int EntityId; +} diff --git a/external/dtEntity/include/dtEntity/entitymanager.h b/external/dtEntity/include/dtEntity/entitymanager.h new file mode 100644 index 000000000..42a60ee20 --- /dev/null +++ b/external/dtEntity/include/dtEntity/entitymanager.h @@ -0,0 +1,421 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace dtEntity +{ + class Component; + class Entity; + class EntitySystem; + class Message; + + /** + * Entity manager is a container for entity systems. + * Each entity system holds entity components of a specific type. + * The entity manager gives access to the entity systems and can be used to + * create, retrieve and delete components. + * + * Also, Entity manager is a central point to send and register to messages. + * Messages can be sent (emitted) immediately to all registrants, or they can be + * posted to a message queue to be emitted at a later time. + */ + class DT_ENTITY_EXPORT EntityManager + { + + public: + + /** + * Constructor. + * @param startEntitySystems if true, start default entity + * systems like OSG components etc + */ + EntityManager(); + + // Destructor + ~EntityManager(); + + /** + * can be used to clean up wrappers for components or + * execute other actions + */ + class ComponentDeletedCallback + { + public: + virtual void ComponentDeleted(ComponentType t, EntityId id) = 0; + virtual ~ComponentDeletedCallback() {} + }; + + typedef std::vector ComponentDeletedCallbacks; + + + /** + * If user executes CreateComponent and no entity system with given component + * type is registered then all EntitySystemRequestCallbacks are executed + * until one returns true. Callback can be used to add entity systems lazily. + */ + class EntitySystemRequestCallback + { + public: + virtual bool CreateEntitySystem(EntityManager* em, ComponentType t) = 0; + + virtual ~EntitySystemRequestCallback() {} + }; + + typedef std::vector EntitySystemRequestCallbacks; + + /** + * Get entity object for entity ID. + * @param id Unique id of the entity to retrieve + * @param entity Will receive pointer to entity object + * @return true if entity with this id was found + * @threadsafe + */ + bool GetEntity(EntityId id, Entity*& entity); + + /** + * return true if entity with this ID exists + */ + bool EntityExists(EntityId id) const; + + /** + * Fill vector with entity ids of all existing entities + */ + void GetEntityIds(std::vector& toFill); + + /** + * delete entity object and tell all entity systems to delete their + * components for this entity + * @param id id of the entity to delete + * @return true if success + * @threadsafe + */ + bool KillEntity(EntityId id); + + /** + * Create a new entity with a new unique EntityId + * All entities are deleted when entity manager is deleted. + * This method is thread safe so that entities can be created from + * worker threads. Creation and deletion of entities are + * thread-safe, all other entity system/component methods are + * non-tread safe. + * @param entity Receives pointer to newly created entity + * @return true if success + * @threadsafe + */ + bool CreateEntity(Entity*& entity); + + /** + * Loops through all components of origin and creates them on target entity + * @param target ID of an existing entity with no components + * @param origin Clone components of this entity + * @return true if success + */ + bool CloneEntity(EntityId target, EntityId origin); + + /** + * @param id Check if an entity with this id exists + * @return true if such an entity exists + */ + bool HasEntity(EntityId id) const; + + /** + * returns true while at least one entity exists + */ + bool HasEntities() const; + + /** + * DEPRECATED! Use MapSystem::AddToScene + */ + bool AddToScene(EntityId eid); + + /** + * DEPRECATED! Use MapSystem::RemoveFromScene + */ + bool RemoveFromScene(EntityId eid); + + /** + * @param id Check if an entity system of this component type is active + * @return true if such a system exists + */ + bool HasEntitySystem(ComponentType id) const; + + /** + * @param s Add this entity system to the manager + */ + bool AddEntitySystem(EntitySystem& s); + + /** + * @param s Remove this entity system + * @return true if entity system was registered, else false + */ + bool RemoveEntitySystem(EntitySystem& s); + + /** + * Get entity system of given type. + * Returns NULL if not found. + */ + EntitySystem* GetEntitySystem(ComponentType id) const; + + /** + * @param id Get entity system for this component type + * @param es receives entity system if found + * @return true if entity system was found + */ + template + bool GetEntitySystem(ComponentType id, T*& es) const; + + template + bool GetES(T*& es) const; + + /** + * Fill vector with all entity systems registered with + * the entity manager + */ + void GetEntitySystems(std::vector& toFill); + void GetEntitySystems(std::vector& toFill) const; + + /** + * @param eid Get component of this entity + * @param t Get component with this component type + * @param component Receives component if found + * @param searchDerived If true, return component that inherits t if one exists. Inheritance + * is defined by return value of EntitySystem::GetBaseType + * @return true if component was found + */ + bool GetComponent(EntityId eid, ComponentType t, Component*& component, bool searchDerived = false); + + /** + * @param eid Get component of this entity + * @param component Receives component of type T if found + * @param searchDerived If true, return component that inherits t if one exists. Inheritance + * is defined by return value of EntitySystem::GetBaseType + * @return true if success + */ + template + bool GetComponent(EntityId eid, T*& component, bool searchDerived = false); + + /** + * Get all components of given entity + * Warning: slow. Iterates over all entity systems. + * @param eid Get components of this entity + * @param toFill receives components + */ + void GetComponents(EntityId eid, std::vector& toFill); + void GetComponents(EntityId eid, std::vector& toFill) const; + + /** + * @param eid Check if component exists for this entity + * @param t Type of component to check for + * @param searchDerived If true, search for component that inherits t. Inheritance + * is defined by return value of EntitySystem::GetBaseType + * @return true if exists + */ + bool HasComponent(EntityId eid, ComponentType t, bool searchDerived = false) const; + + /** + * Create a component of given type for entity + * @param eid Add component to this entity + * @param id Add component of this type + * @param component Receives newly created component if success + * @return true if success + */ + bool CreateComponent(EntityId eid, ComponentType id, Component*& component); + + /** + * Create a component of given type for entity + * @param eid Add component to this entity + * @param component Receives newly created component of type T if success + * @return true if success + */ + template + bool CreateComponent(EntityId eid, T*& component); + + /** + * Delete component. + */ + bool DeleteComponent(EntityId eid, Component& component); + + /** + * Delete component. + */ + bool DeleteComponent(EntityId eid, ComponentType componentType); + + /** + * @return default message pump for inter-system communication + */ + MessagePump& GetMessagePump() + { + return mMessagePump; + } + + + // See messagepump.h for documentation + inline void RegisterForMessages(MessageType msgtype, const MessageFunctor& ftr, unsigned int options = FilterOptions::DEFAULT, const std::string& funcname = "") + { + mMessagePump.RegisterForMessages(msgtype, ftr, options, funcname); + } + + // See messagepump.h for documentation + inline void RegisterForMessages(MessageType msgtype, const MessageFunctor& ftr, const std::string& funcname) + { + mMessagePump.RegisterForMessages(msgtype, ftr, FilterOptions::DEFAULT, funcname); + } + + // See messagepump.h for documentation + inline bool UnregisterForMessages(MessageType msgtype, const MessageFunctor& ftr) + { + return mMessagePump.UnregisterForMessages(msgtype, ftr); + } + + // See messagepump.h for documentation + inline void EmitMessage(const Message& msg) + { + mMessagePump.EmitMessage(msg); + } + + // See messagepump.h for documentation + inline void EnqueueMessage(const Message& msg, double time = 0) + { + mMessagePump.EnqueueMessage(msg, time); + } + + // See messagepump.h for documentation + void EmitQueuedMessages(double simtime) + { + mMessagePump.EmitQueuedMessages(simtime); + } + + void AddDeletedCallback(ComponentDeletedCallback* cb); + bool RemoveDeletedCallback(ComponentDeletedCallback* cb); + + void AddEntitySystemRequestCallback(EntitySystemRequestCallback* cb); + bool RemoveEntitySystemRequestCallback(EntitySystemRequestCallback* cb); + + + private: + + // Returns next id and increments internal counter + EntityId GetNextAvailableID(); + + unsigned int mNextAvailableId; + + /** + * Look in type hierarchy map if a component derived from type exists + */ + bool GetDerived(EntityId eid, ComponentType ctype, Component*& comp) const; + + // storage for entity objects. + typedef std::map EntityMap; + EntityMap mEntities; + + // controls access to mEntities. + mutable OpenThreads::ReadWriteMutex mEntityMutex; + + // Storage for entity systems + typedef std::map EntitySystemStore; + EntitySystemStore mEntitySystemStore; + + // stores inheritance tree for component types + typedef std::multimap TypeHierarchyMap; + TypeHierarchyMap mTypeHierarchy; + + // for publish-subscribe of messages + MessagePump mMessagePump; + + ComponentDeletedCallbacks mDeletedCallbacks; + + EntitySystemRequestCallbacks mEntitySystemRequestCallbacks; + + }; + + + //////////////////////////////////////////////////////////////////////////////// + template + bool EntityManager::CreateComponent(EntityId eid, T*& component) + { + assert(eid > 0); + Component* c; + if(!this->CreateComponent(eid, T::TYPE, c)) + { + component = NULL; + return false; + } + component = static_cast(c); + return true; + } + + + //////////////////////////////////////////////////////////////////////////////// + template + bool EntityManager::GetComponent(EntityId eid, T*& component, bool searchDerived) + { + Component* c; + if(this->GetComponent(eid, T::TYPE, c, searchDerived)) + { + assert(dynamic_cast(c) != NULL); + component = static_cast(c); + return true; + } + component = NULL; + return false; + + } + + //////////////////////////////////////////////////////////////////////////////// + template + bool EntityManager::GetEntitySystem(ComponentType id, T*& es) const + { + EntitySystem* s = GetEntitySystem(id); + es = NULL; + if(s == NULL) return false; + assert(dynamic_cast(s) != NULL); + es = static_cast(s); + + return true; + } + + //////////////////////////////////////////////////////////////////////////////// + template + bool EntityManager::GetES(T*& es) const + { + ComponentType ctype = T::TYPE; + EntitySystemStore::const_iterator i = mEntitySystemStore.find(ctype); + if(i == mEntitySystemStore.end()) + { + es = NULL; + return false; + } + EntitySystem* s = i->second; + assert(dynamic_cast(s) != NULL); + es = static_cast(s); + return true; + } + +} diff --git a/external/dtEntity/include/dtEntity/entitysystem.h b/external/dtEntity/include/dtEntity/entitysystem.h new file mode 100644 index 000000000..ab9dbcc7d --- /dev/null +++ b/external/dtEntity/include/dtEntity/entitysystem.h @@ -0,0 +1,155 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include + +namespace dtEntity +{ + class Component; + class EntityManager; + + + /** + * Each entity system holds a number of components. + * Entity systems are themselves responsible for allocating and destroying + * their components. + */ + class EntitySystem + : public PropertyContainer + { + public: + + /** + * Constructor. + * @param id The type id of the component + * @param em The entity manager that this system belongs to + * @param baseType If component class is derived from component of another entity system then + * set the parent component type here. EntityManager::GetComponent will return + * components of this entity system when base type is requested. + */ + EntitySystem(EntityManager& em, ComponentType baseType = StringId()) + : mBaseType(baseType) + , mEntityManager(&em) + { + } + + virtual ~EntitySystem() + { + } + + /** + * @return The type id of the component that this system handles + */ + virtual ComponentType GetComponentType() const = 0; + /** + * @return If component class is derived from a base component type, give base + * type here + */ + ComponentType GetBaseType() const + { + return mBaseType; + } + + /** + * @return true if a component for this entity exists in the system + */ + virtual bool HasComponent(EntityId eid) const { return false; } + + /** + * @param eid Get component for the entity with this id + * @param component Receives the component if found + * @return true if found + */ + virtual bool GetComponent(EntityId eid, Component*& component) { return false; } + virtual bool GetComponent(EntityId eid, const Component*& component) { return false; } + + /** + * @param eid Create a component for the entity with this id. + * @param component Receives the component if it was succesfully created + * @return true if success + */ + virtual bool CreateComponent(EntityId eid, Component*& component) { return false; } + + /** + * Delete component. It is best to not call this directly but instead use + * the method EntityManager::DeleteComponent. Calling this method + * directly will not execute the component deletion callbacks, which + * can result in wrappers for that component not being invalidated + * + * @param eid Delete component for entity with this id + * @return true if entity had a component of this type + */ + virtual bool DeleteComponent(EntityId eid) { return false; } + + /** + * Put ids of all entities registered with this system into toFill + */ + virtual void GetEntitiesInSystem(std::list& toFill) const { } + + /** + * Get property names and default property values of component. Used + * for spawner creation + */ + virtual GroupProperty GetComponentProperties() const { return GroupProperty(); } + + /** + * @return entity manager that the entity system was added to + */ + EntityManager& GetEntityManager() const + { + return *mEntityManager; + } + + /** overwrite to react to add to entity manager */ + virtual void OnAddedToEntityManager(dtEntity::EntityManager& em) {} + virtual void OnRemoveFromEntityManager(dtEntity::EntityManager& em) {} + + /** + * Override this if components of this entity system should not + * be stored to map + */ + virtual bool StoreComponentToMap(dtEntity::EntityId) const { return true; } + + /** + * Override to return false if no spawner should be allowed to spawn this component + */ + virtual bool AllowComponentCreationBySpawner() const { return true; } + + /** + * Override this if properties of this entity system should + * be stored to scene file + */ + virtual bool StorePropertiesToScene() const { return false; } + + private: + + // no copy ctor + EntitySystem(EntitySystem&); + + ComponentType mBaseType; + EntityManager* mEntityManager; + }; +} diff --git a/external/dtEntity/include/dtEntity/export.h b/external/dtEntity/include/dtEntity/export.h new file mode 100644 index 000000000..9c209c62c --- /dev/null +++ b/external/dtEntity/include/dtEntity/export.h @@ -0,0 +1,40 @@ +#pragma once + +/* + * dtEntity Game and Simulation Engine + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Martin Scheffler + */ + +#if defined(_MSC_VER) || defined(__CYGWIN__) || defined(__MINGW32__) || defined( __BCPLUSPLUS__) || defined( __MWERKS__) +# ifdef DT_ENTITY_LIBRARY +# define DT_ENTITY_EXPORT __declspec(dllexport) +# else +# define DT_ENTITY_EXPORT __declspec(dllimport) +# endif +#else +# ifdef DT_ENTITY_LIBRARY +# define DT_ENTITY_EXPORT __attribute__ ((visibility("default"))) +# else +# define DT_ENTITY_EXPORT +# endif +#endif + +#ifdef _WIN32 +# pragma warning (disable: 4251) +# pragma warning(disable : 4355) // 'this' used in initializer list +#endif diff --git a/external/dtEntity/include/dtEntity/hash.h b/external/dtEntity/include/dtEntity/hash.h new file mode 100644 index 000000000..c9656f71b --- /dev/null +++ b/external/dtEntity/include/dtEntity/hash.h @@ -0,0 +1,39 @@ +//----------------------------------------------------------------------------- +// MurmurHash3 was written by Austin Appleby, and is placed in the public +// domain. The author hereby disclaims copyright to this source code. + +#ifndef _MURMURHASH3_H_ +#define _MURMURHASH3_H_ + +#include + +//----------------------------------------------------------------------------- +// Platform-specific functions and macros + +// Microsoft Visual Studio + +#if defined(_MSC_VER) +#if _MSC_VER < 1900 +typedef unsigned char uint8_t; +typedef unsigned long uint32_t; +typedef unsigned __int64 uint64_t; +#endif +// Other compilers + +#else // defined(_MSC_VER) + +#include + +#endif // !defined(_MSC_VER) + +//----------------------------------------------------------------------------- + +void MurmurHash3_x86_32 ( const void * key, int len, uint32_t seed, void * out ); + +void MurmurHash3_x86_128 ( const void * key, int len, uint32_t seed, void * out ); + +void MurmurHash3_x64_128 ( const void * key, int len, uint32_t seed, void * out ); + +//----------------------------------------------------------------------------- + +#endif // _MURMURHASH3_H_ diff --git a/external/dtEntity/include/dtEntity/init.h b/external/dtEntity/include/dtEntity/init.h new file mode 100644 index 000000000..11fa0077b --- /dev/null +++ b/external/dtEntity/include/dtEntity/init.h @@ -0,0 +1,53 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include + +namespace dtEntity +{ + class EntityManager; + + class DT_ENTITY_EXPORT ConsoleLogHandler + : public LogListener + { + public: + virtual void LogMessage(dtEntity::LogLevel::e level, const std::string& filename, const std::string& methodname, int linenumber, + const std::string& msg); + }; + + /** + * adds required entity systems to entity manager, including map, camera, layer, layerattachpoint. + * Registers a number of factories for entity systems that should be started lazily. + * Creates application system, passes it the viewer and installs update callback of app system to scene node. + * @param argc number of command line args + * @param standard c command line args + * @param em a valid entity manager + */ + void DT_ENTITY_EXPORT AddDefaultEntitySystemsAndFactories(int argc, char** argv, dtEntity::EntityManager& em); + + /** + * sets osg data paths from command line args or environment variables + */ + bool DT_ENTITY_EXPORT SetupDataPaths(int argc, char** argv, bool checkPaths); +} + diff --git a/external/dtEntity/include/dtEntity/inputinterface.h b/external/dtEntity/include/dtEntity/inputinterface.h new file mode 100644 index 000000000..7c15e695b --- /dev/null +++ b/external/dtEntity/include/dtEntity/inputinterface.h @@ -0,0 +1,175 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include + +namespace dtEntity +{ + + //////////////////////////////////////////////////////////////////////////////// + namespace TouchPhase + { + enum e + { + UNKNOWN, + BEGAN, + MOVED, + STATIONARY, + ENDED + }; + + std::string ToString(e v); + } + + //////////////////////////////////////////////////////////////////////////////// + struct DT_ENTITY_EXPORT TouchPoint + { + unsigned int mId; + float mX; + float mY; + unsigned int mTapCount; + TouchPhase::e mTouchPhase; + }; + + //////////////////////////////////////////////////////////////////////////////// + class InputCallbackInterface + { + public: + virtual ~InputCallbackInterface() {} + + virtual bool KeyUp(const std::string& name, bool handled, unsigned int contextid) { return false; } + virtual bool KeyDown(const std::string& name, bool handled, unsigned int contextid) { return false; } + virtual bool MouseButtonUp(int button, bool handled, unsigned int contextid) { return false; } + virtual bool MouseButtonDown(int button, bool handled, unsigned int contextid) { return false; } + virtual bool MouseWheel(int dir, bool handled, unsigned int contextid) { return false; } + virtual bool MouseMove(float x, float y, bool handled, unsigned int contextid) { return false; } + + virtual void MouseEnterLeave(bool focused, unsigned int contextid) {} + }; + + //////////////////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT InputInterface + { + public: + + static const StringId MouseXId; + static const StringId MouseYId; + static const StringId MouseXRawId; + static const StringId MouseYRawId; + static const StringId MouseDeltaXId; + static const StringId MouseDeltaYId; + static const StringId MouseDeltaXRawId; + static const StringId MouseDeltaYRawId; + + virtual ~InputInterface() {} + + /** + * Stores if current system is multitouch-capable + */ + virtual bool GetMultiTouchEnabled() const = 0; + virtual void SetMultiTouchEnabled(bool v) = 0; + + /** get or set if mouse cursor should be locked in + * center of screen (for FPS style steering) + */ + virtual bool GetLockCursor() const = 0; + virtual void SetLockCursor(bool v) = 0; + + /** + * Multitouch interface: return number of touch points + */ + virtual size_t GetNumTouches() const = 0; + + /** + * Multitouch interface: return touch points + */ + virtual std::vector GetTouches() const = 0; + + /** + * Return true if key is pressed, else false + */ + virtual bool GetKey(const std::string& name, unsigned int contextId = 0) const = 0; + + /** + * Return true if key was released this frame, else false + */ + virtual bool GetKeyUp(const std::string& name, unsigned int contextId = 0) const = 0; + + /** + * Return true if key was pressed down this frame, else false + */ + virtual bool GetKeyDown(const std::string& name, unsigned int contextId = 0) const = 0; + + /** + * Returns true if any keyboard key is currently pressed + */ + virtual bool AnyKeyDown() const = 0; + + /** + * Return string entered this frame + */ + virtual std::string GetInputString() const = 0; + + /** + * Return true if given mouse button is currently pressed. + * 0 for left button, 1 for right, 2 for center + */ + virtual bool GetMouseButton(int button, unsigned int contextId = 0) const = 0; + + /** + * Return true if given mouse button was pressed this frame. + * 0 for left button, 1 for right, 2 for center + */ + virtual bool GetMouseButtonDown(int button, unsigned int contextId = 0) const = 0; + + /** + * Return true if given mouse button was released this frame. + * 0 for left button, 1 for right, 2 for center + */ + virtual bool GetMouseButtonUp(int button, unsigned int contextId = 0) const = 0; + + /** + * Return axis value from -1 to 1 + * @TODO: Axes are currently hard coded + */ + virtual double GetAxis(StringId axisname) const = 0; + + /** + * Return current mouse wheel state. -1 = down, 1 = up, 0 = no motion + */ + virtual int GetMouseWheelState(unsigned int contextId = 0) const = 0; + + virtual void AddInputCallback(InputCallbackInterface*) = 0; + virtual bool RemoveInputCallback(InputCallbackInterface*) = 0; + + /** + * Return a list containing names of all registered keys + */ + virtual void GetKeyNames(std::map&) const = 0; + + }; + +} + diff --git a/external/dtEntity/include/dtEntity/log.h b/external/dtEntity/include/dtEntity/log.h new file mode 100644 index 000000000..37cc2ec88 --- /dev/null +++ b/external/dtEntity/include/dtEntity/log.h @@ -0,0 +1,57 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include + +#define DT_LOG_SOURCE __FILE__, __FUNCTION__, __LINE__ + +#define LOG_DEBUG(msg)\ +{\ + std::ostringstream os; os << msg; \ + dtEntity::LogManager::GetInstance().LogMessage(dtEntity::LogLevel::LVL_DEBUG, __FILE__, __FUNCTION__, __LINE__, os.str());\ +}\ + +#define LOG_INFO(msg)\ +{\ + std::ostringstream os; os << msg; \ + dtEntity::LogManager::GetInstance().LogMessage(dtEntity::LogLevel::LVL_INFO, __FILE__, __FUNCTION__, __LINE__, os.str());\ +}\ + +#define LOG_WARNING(msg)\ +{\ + std::ostringstream os; os << msg; \ + dtEntity::LogManager::GetInstance().LogMessage(dtEntity::LogLevel::LVL_WARNING, __FILE__, __FUNCTION__, __LINE__, os.str());\ +}\ + +#define LOG_ERROR(msg)\ +{\ + std::ostringstream os; os << msg; \ + dtEntity::LogManager::GetInstance().LogMessage(dtEntity::LogLevel::LVL_ERROR, __FILE__, __FUNCTION__, __LINE__, os.str());\ +}\ + +#define LOG_ALWAYS(msg)\ +{\ + std::ostringstream os; os << msg; \ + dtEntity::LogManager::GetInstance().LogMessage(dtEntity::LogLevel::LVL_ALWAYS, __FILE__, __FUNCTION__, __LINE__, os.str());\ +}\ + diff --git a/external/dtEntity/include/dtEntity/logmanager.h b/external/dtEntity/include/dtEntity/logmanager.h new file mode 100644 index 000000000..1ed726729 --- /dev/null +++ b/external/dtEntity/include/dtEntity/logmanager.h @@ -0,0 +1,80 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include +#include + +namespace dtEntity +{ + //////////////////////////////////////////////////////////////////////////////// + namespace LogLevel + { + enum e + { + LVL_ALWAYS, + LVL_ERROR, + LVL_DEBUG, + LVL_WARNING, + LVL_INFO + }; + } + + //////////////////////////////////////////////////////////////////////////////// + class LogListener + : public osg::Referenced + { + public: + virtual void LogMessage(LogLevel::e level, const std::string& filename, const std::string& methodname, int linenumber, + const std::string& msg) = 0; + + protected: + virtual ~LogListener() { } + }; + + //////////////////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT LogManager + : public dtEntity::Singleton + { + public: + + typedef std::vector > Listeners; + + void LogMessage(LogLevel::e level, const std::string& filename, const std::string& methodname, int linenumber, + const std::string& msg) const; + + void AddListener(LogListener* l); + void RemoveListener(LogListener* l); + + Listeners::size_type GetNumListeners() const; + LogListener* GetListener(Listeners::size_type index) const; + + private: + Listeners mListeners; + mutable OpenThreads::Mutex mMutex; + }; + +} diff --git a/external/dtEntity/include/dtEntity/mapcomponent.h b/external/dtEntity/include/dtEntity/mapcomponent.h new file mode 100644 index 000000000..16e9ccc8d --- /dev/null +++ b/external/dtEntity/include/dtEntity/mapcomponent.h @@ -0,0 +1,372 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace dtEntity +{ + struct MapData + { + std::string mMapPath; + std::string mDataPath; + unsigned int mSaveOrder; + + MapData(const std::string& mappath, const std::string& datapath, unsigned int order) + : mMapPath(mappath) + , mDataPath(datapath) + , mSaveOrder(order) + { + } + }; + + //////////////////////////////////////////////////////////////////////////////// + + /** + * The map component holds information about the entity and how to + * serialize it. + */ + class DT_ENTITY_EXPORT MapComponent : public Component + { + + public: + + static const ComponentType TYPE; + static const StringId EntityNameId; + static const StringId SpawnerNameId; + static const StringId MapNameId; + static const StringId UniqueIdId; + static const StringId SaveWithMapId; + static const StringId VisibleInEntityListId; + + MapComponent(); + virtual ~MapComponent(); + + virtual ComponentType GetType() const { return TYPE; } + + virtual void OnAddedToEntity(Entity& entity) { mOwner = &entity; } + + /** + * string identifier of entity. Does not need to be unique. Mainly used + * for debugging purposes + */ + std::string GetEntityName() const; + void SetEntityName(const std::string& v); + + /** + * If entity was created from a spawner then this is set to the spawners name. + * If string is empty then entity was not created by spawner. + */ + std::string GetSpawnerName() const; + void SetSpawnerName(const std::string& v); + + /** + * @return the spawner the entity was created from or NULL + * if entity was not created from spawner + */ + Spawner* GetSpawner() const; + + /** + * name of map that entity was loaded from and that it will be stored to + * if map is saved + */ + std::string GetMapName() const { return mMapName.Get(); } + void SetMapName(const std::string& v) { mMapName.Set(v); } + + /** + * A unique identifier identifying the entity. May be a random string. + */ + std::string GetUniqueId() const { return mUniqueIdStr; } + void SetUniqueId(const std::string& v); + + std::string GetDescription() const { return mDescription; } + void SetDescription(const std::string& v) { mDescription = v; } + + + void SetSaveWithMap(bool v) { mSaveWithMap.Set(v); } + bool GetSaveWithMap() const { return mSaveWithMap.Get(); } + + void SetVisibleInEntityList(bool v) { mVisibleInEntityList.Set(v); } + bool GetVisibleInEntityList() const { return mVisibleInEntityList.Get(); } + + private: + DynamicStringProperty mEntityName; + StringProperty mMapName; + DynamicStringProperty mSpawnerNameProp; + DynamicStringProperty mUniqueId; + Spawner* mSpawner; + std::string mUniqueIdStr; + std::string mDescription; + std::string mEntityNameStr; + BoolProperty mSaveWithMap; + BoolProperty mVisibleInEntityList; + Entity* mOwner; + + }; + + //////////////////////////////////////////////////////////////////////////////// + + class DT_ENTITY_EXPORT MapSystem + : public DefaultEntitySystem + , public EntityManager::EntitySystemRequestCallback + { + public: + + friend class MapComponent; + static const ComponentType TYPE; + typedef DefaultEntitySystem BaseClass; + typedef std::map > SpawnerStorage; + + + MapSystem(EntityManager& em); + ~MapSystem(); + + // overridden to check for uniqueness of unique id + virtual bool CreateComponent(EntityId eid, Component*& component); + virtual bool DeleteComponent(EntityId eid); + + virtual void OnAddedToEntityManager(dtEntity::EntityManager& em); + + + /** + * Get entity id by unique id. Useful for communicating with the outside world + */ + EntityId GetEntityIdByUniqueId(const std::string& name) const; + + /** + * If entity with this name exists, assign its entity object to &entity and return true. + * Else return false. + */ + bool GetEntityByUniqueId(const std::string& name, Entity*& entity) const; + + // reacts to SpawnEntityMessage + void OnSpawnEntity(const Message& msg); + + // reacts to DeleteEntityMessage + void OnDeleteEntity(const Message& msg); + + // reacts to StopSystemMessage by removing map system from entity manager + void OnStopSystem(const Message& msg); + + /** + * Causes a message EntityAddedToSceneMessage to be fired. + * Layer system reacts to this by adding assigned node to + * scene graph + * @param eid Id of entity to add to scene + * @return true if success + */ + bool AddToScene(EntityId eid); + + /** + * Causes a EntityRemovedFromSceneMessage to be fired. + * Layer system removes attached node from scene graph. + * @param eid Id of entity to remove from scene + * @return true if success + */ + bool RemoveFromScene(EntityId eid); + + /** + * Register spawner. EntityManager takes ownership of spawner. + * @threadsafe + */ + void AddSpawner(Spawner& spawner); + + /** + * Remove spawner registered by this name and delete it. + * @return true if spawner was registered under this name + * @threadsafe + */ + bool DeleteSpawner(const std::string& name); + + /** + * if spawner is registered under this name, assign it to + * @param spawner receives spawner + * @return true if success + * @threadsafe + */ + bool GetSpawner(const std::string& name, Spawner*& spawner) const; + + /** + * fill up a map with all spawners indexed by their name + * @threadsafe + */ + void GetAllSpawners(std::map& toFill) const; + + /** + * fill up a list with names of all registered spawners + * @threadsafe + */ + void GetAllSpawnerNames(std::vector& toFill) const; + + /** + * Call spawner to let it set up entity + * @param name Name of spawner + * @param spawned A valid, created entity + * @return true if success + * @threadsafe + */ + bool Spawn(const std::string& name, Entity& spawned) const; + + void GetSpawnerCreatedEntities(const std::string& spawnername, std::vector& ids, bool recursive = true) const; + + /** + * @return true if entity exists and was spawned by spawner or one of its child spawners + */ + bool IsSpawnOf(EntityId, const std::string& spawnername) const; + + /** + * Load scene from map file, start and configure entity systems + * as appropriate, load maps + */ + bool LoadScene(const std::string& path); + + /** + * Unload all maps + */ + bool UnloadScene(); + + + /** + * Save entity system configurations to scene file, + * @param path Save scene file to this path + * @param saveAllMaps if set, save all currently loaded maps to map files + */ + bool SaveScene(const std::string& path, bool saveAllMaps = true); + + /** + * Return true if map is found in file system + */ + bool MapExists(const std::string& path); + + /** + * Load a single map + */ + bool LoadMap(const std::string& path); + + /** + * Unload a single map + */ + bool UnloadMap(const std::string& path); + + /** + *Get an index representing the order in which maps should be loaded / saved + * Maps with lowest values are loaded first + */ + unsigned int GetMapSaveOrder(const std::string& path); + void SetMapSaveOrder(const std::string& path, int); + + /** + * Delete instances that were created from given map + */ + bool DeleteEntitiesByMap(const std::string& mapName); + + /** + * Save a single map + */ + bool SaveMap(const std::string& path); + + /** + * Save a single map as a copy + */ + bool SaveMapAs(const std::string& path, const std::string& copyname); + + /** + * Add an empty, named map to system + */ + bool AddEmptyMap(const std::string& dataPath, const std::string& mapname); + + /** + * Check if a map of that name exists + */ + bool IsMapLoaded(const std::string& mapName) const; + + /** + * Get a list of all maps in system + */ + std::vector GetLoadedMaps() const; + + /** + * Get all entities that are stored to this map + */ + void GetEntitiesInMap(const std::string& mapname, std::vector& toFill) const; + + // implementation of EntityManager::EntitySystemRequestCallback interface + virtual bool CreateEntitySystem(EntityManager* em, ComponentType t); + + void AddMapEncoder(MapEncoder* ec); + + MapEncoder* GetEncoderForMap(const std::string& extension) const; + MapEncoder* GetEncoderForScene(const std::string& extension) const; + + private: + + /** + * called by component. Don't call, please set the property on + * the component instead + * returns true if change succeeded, false if an entity with this id already exists + */ + bool OnEntityChangedUniqueId(EntityId id, const std::string& oldUniqueId, const std::string& newUniqueid); + + + /** + * Handles SetComponentPropertiesMessage + */ + void OnSetComponentProperties(const Message& m); + + /** + * Handles SetSystemPropertiesMessage + */ + void OnSetSystemProperties(const Message& m); + + void EmitSpawnerDeleteMessages(MapSystem::SpawnerStorage& spawners, const std::string& path); + + typedef std::vector LoadedMaps; + LoadedMaps mLoadedMaps; + + // store spawners in a map + SpawnerStorage mSpawners; + + // functors for registering to messages + MessageFunctor mSpawnEntityFunctor; + MessageFunctor mDeleteEntityFunctor; + MessageFunctor mResetSystemFunctor; + MessageFunctor mStopSystemFunctor; + MessageFunctor mSetComponentPropertiesFunctor; + MessageFunctor mSetSystemPropertiesFunctor; + ComponentPluginManager mPluginManager; + + std::map mEntitiesByUniqueId; + + typedef std::vector MapEncoders; + MapEncoders mMapEncoders; + }; +} diff --git a/external/dtEntity/include/dtEntity/mapencoder.h b/external/dtEntity/include/dtEntity/mapencoder.h new file mode 100644 index 000000000..d59691062 --- /dev/null +++ b/external/dtEntity/include/dtEntity/mapencoder.h @@ -0,0 +1,48 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + + +namespace dtEntity +{ + /** + * Pure virtual interface for loading and saving scene data to maps + */ + class MapEncoder + { + + public: + + virtual ~MapEncoder() {} + + virtual bool LoadMapFromFile(const std::string& path) = 0; + + // empty destination means overwrite mapPath + virtual bool SaveMapToFile(const std::string& mapPath, const std::string& destination) = 0; + + virtual bool LoadSceneFromFile(const std::string& path) = 0; + virtual bool SaveSceneToFile(const std::string& path) = 0; + + virtual bool AcceptsMapExtension(const std::string& /*extension*/) const = 0; + virtual bool AcceptsSceneExtension(const std::string& /*extension*/) const = 0; + }; +} + diff --git a/external/dtEntity/include/dtEntity/message.h b/external/dtEntity/include/dtEntity/message.h new file mode 100644 index 000000000..7601bf297 --- /dev/null +++ b/external/dtEntity/include/dtEntity/message.h @@ -0,0 +1,90 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include + +namespace dtEntity +{ + + /** + * Pure virtual Message interface class. Holds a number of properties + */ + class DT_ENTITY_EXPORT Message + : public PropertyContainer + { + + public: + + /** + * Default Constructor. + */ + Message() + : mType(MessageType()) + { + } + + /** + * Constructor. + * @param type The unique class ID of the message class + */ + Message(MessageType type) + : mType(type) + { + assert(mType != dtEntity::StringId() && "No message type set!"); + } + + // DTor + virtual ~Message() + { + } + + /** + * @return class type id of message + */ + MessageType GetType() const { return mType; } + + /** + * Create a copy of the message on the heap. + * Example generic implementation: + * virtual Message* Clone() const { return CloneContainer(); } + */ + virtual Message* Clone() const { + assert(mType != StringId() && "Cannot clone a message without type!"); + return CloneContainer(); + } + + private: + + // no copy CTor + Message(const Message& other); + + MessageType mType; + }; + + // Functors of this type can be registered to receive messages of a specific type. + typedef fastdelegate::FastDelegate1< const Message&, void> MessageFunctor; + +} diff --git a/external/dtEntity/include/dtEntity/messagefactory.h b/external/dtEntity/include/dtEntity/messagefactory.h new file mode 100644 index 000000000..0c5a7b47e --- /dev/null +++ b/external/dtEntity/include/dtEntity/messagefactory.h @@ -0,0 +1,77 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include + +namespace dtEntity +{ + + class DT_ENTITY_EXPORT MessageFactory + : public Singleton + { + public: + + MessageFactory() {} + + /** + * Register a message type with the message factory + * The template parameter holds the message class to instantiate + * Usage example: + * mMessageFactory->RegisterMessageType(TickMessage::TYPE); + * @param mtype MessageType id of message + */ + //////////////////////////////////////////////////////////////////////////////// + template + void RegisterMessageType(MessageType mtype) + { + mMessageFactory.template RegisterType(mtype); + } + + /** + * fill up a vector with the types of all registered messages + */ + void GetRegisteredMessageTypes(std::vector& toFill); + + /** + * Create a message of given type. A message class has to be registered with + * RegisterMessageType before it can be instantiated with CreateMessage. + * Please note that you can simply create messages with 'new', this is + * just a factory for generic script- and tool-side access + * @param msgType type id of message class + * @param msg Receives newly created message. Ownership of the message object + * is transfered to caller - post your message or delete it! + * @return true if success - false if message type is not registered + */ + bool CreateMessage(MessageType msgType, Message*& msg) const; + + // not implemented + MessageFactory(const MessageFactory& other); + + private: + // factory for message objects + ObjectFactory mMessageFactory; + + }; +} diff --git a/external/dtEntity/include/dtEntity/messagepump.h b/external/dtEntity/include/dtEntity/messagepump.h new file mode 100644 index 000000000..d21b7948c --- /dev/null +++ b/external/dtEntity/include/dtEntity/messagepump.h @@ -0,0 +1,194 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include + +namespace dtEntity +{ + + + + //////////////////////////////////////////////////////////////////////////////// + + + namespace FilterOptions + { + /* These bits define the way a functor is registered to a message. + * When multiple functors are registered to a message type then they are called + * in the order of their PRIORITY (highest priority first). + * The UNREGISTERED bit has to be set to false. It is used internally to mark + * deregistered functors for removal. + * + * If SINGLE_SHOT is set then the functor is unregistered after it is called the first time. + * Registrants can register for local messages, network messages, or both. + * Message senders can send a message to local or network or both. + */ + enum e + { + PRIORITY_LOWEST = 0, + PRIORITY_DEFAULT = 1, + PRIORITY_HIGHER = 2, + PRIORITY_HIGHEST = 3, + ORDER_LATE = 0, + ORDER_DEFAULT = 1, + ORDER_EARLY = 2, + ORDER_EARLIEST = 3, + UNREGISTERED = (1<<3), + SINGLE_SHOT = (1<<4), + + DEFAULT = ORDER_DEFAULT + }; + } + + + //////////////////////////////////////////////////////////////////////////////// + + + /* + * Internal data structure for message registration + */ + struct MsgRegistryEntry + { + unsigned int mOptions; + MessageFunctor mFunctor; + StringId mFuncName; + }; + + struct FutureMessageEntry + { + double mTimeToPost; + Message* mMessage; + }; + + + + //////////////////////////////////////////////////////////////////////////////// + // pure virtual interface + class MessageReceiver + { + public: + ~MessageReceiver() {} + virtual void Receive(const dtEntity::Message& msg) = 0; + }; + + //////////////////////////////////////////////////////////////////////////////// + + + class DT_ENTITY_EXPORT MessagePump + : public MessageReceiver + { + public: + + // thread safe message queue. The int stores the sending options. + typedef ThreadSafeQueue MessageQueue; + typedef ThreadSafeQueue FutureMessageQueue; + + /** + * CTor + */ + MessagePump(); + + /** + * DTor + */ + virtual ~MessagePump(); + + /** + * Register a functor to be called when a message of given type is emitted. + * @param msgtype Type of message to register to + * @param ftr This functor is called when a message of msgtype is emitted + * @param options Option bits for registration (see FilterOptions comments) + * @param funcname name for debugging and profiling purposes + * + */ + virtual void RegisterForMessages(MessageType msgtype, const MessageFunctor &ftr, unsigned int options = FilterOptions::DEFAULT, const std::string& funcname = ""); + + /** + * Unregister functor from message + * @param msgtype Type of message to unregister from + * @param ftr Unregister this message + * @return true if success + */ + virtual bool UnregisterForMessages(MessageType msgtype, const MessageFunctor& ftr); + + /** + * returns true if functor is registered to message + */ + virtual bool IsRegistered(MessageType msgtype, const MessageFunctor& ftr); + + /** + * Immediately send a message to all registered functors + * Warning: beware of circular dependencies! + * @param msg The message to send + */ + void EmitMessage(const Message& msg); + + /** + * Enqueue message and emit it on next PreFrame event + * @param when Future simulation time that event should be emitted at + * ( 0 means emit immediately) + */ + void EnqueueMessage(const Message& msg); + void EnqueueMessage(const Message& msg, double when); + + // implement MessageReceiver interface + virtual void Receive(const dtEntity::Message& msg) + { + EnqueueMessage(msg); + } + + /** + * Emit all messages in message queue + */ + void EmitQueuedMessages(double simtime); + + /** + * Discard all queued messages + */ + void ClearQueue(); + + /** + * Unregister all functors + */ + void UnregisterAll(); + + protected: + + // Registry for message functors + typedef std::multimap MessageFunctorRegistry; + MessageFunctorRegistry mMessageFunctors; + + + // stores messages til next tick + MessageQueue mMessageQueue; + + FutureMessageQueue mFutureMessageQueue; + // stores messages until their time to post has come + std::list mFutureMessages; + + }; +} diff --git a/external/dtEntity/include/dtEntity/nodemasks.h b/external/dtEntity/include/dtEntity/nodemasks.h new file mode 100644 index 000000000..8a047e54f --- /dev/null +++ b/external/dtEntity/include/dtEntity/nodemasks.h @@ -0,0 +1,43 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +namespace dtEntity +{ + namespace NodeMasks + { + enum e + { + REFLECTION_SCENE = (1 << 0), // OSGOcean + REFRACTION_SCENE = (1 << 1), // OSGOcean + NORMAL_SCENE = (1 << 2), // OSGOcean + SURFACE_MASK = (1 << 3), // OSGOcean + SILT_MASK = (1 << 4), // OSGOcean + VISIBLE = (1 << 5), + PICKABLE = (1 << 6), + TERRAIN = (1 << 7), + CASTS_SHADOWS = (1 << 8), + RECEIVES_SHADOWS = (1 << 9), + MANIPULATOR = (1 << 10) + }; + } + +} diff --git a/external/dtEntity/include/dtEntity/objectfactory.h b/external/dtEntity/include/dtEntity/objectfactory.h new file mode 100644 index 000000000..2d886780a --- /dev/null +++ b/external/dtEntity/include/dtEntity/objectfactory.h @@ -0,0 +1,147 @@ +#pragma once + +/* + * dtEntity Game and Simulation Engine + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Matthew W. Campbell + */ + +#include +#include + +namespace dtEntity +{ + /** + * Templated function to provide a generic object construction + * utility. + */ + template + BaseType *construct() + { + return new DerivedType(); + } + + /** + * This class is a template object factory. It allows one to + * create any type of object as long as there is a common base + * class. The common base class is defined on a per-factory + * basis using the templated parameter BaseType. + * @note + * The ObjectFactory implementation only supports objects with + * a default constructor. It will not work with objects that + * only have named constructors. + */ + template > + class ObjectFactory + { + public: + + typedef UniqueIdTypeClass UniqueIdType; + typedef BaseTypeClass BaseType; + typedef ltCmpClass ltCmp; + + typedef BaseType *(*createObjectFunc)(); /// Function pointer type for functions creating objects. + typedef std::map ObjectMap; + typedef typename ObjectMap::iterator ObjTypeItor; + typedef typename ObjectMap::const_iterator ObjTypeItorConst; + ObjectFactory() {} // constructor + + + /** + * Registers a new type of object with the factory. + * @return false if the type is a duplicate. + */ + template + bool RegisterType(UniqueIdType id) + { + if (this->objectTypeMap.find(id) != this->objectTypeMap.end()) + { + return false; + } + + this->objectTypeMap[id] = &construct; + return true; + } + + /** + * Removes an existing object type from the factory's known list + * of object types. + */ + void RemoveType(UniqueIdType id) { + this->objectTypeMap.erase(id); + } + + /** + * Checks to see if the factory can create objects of the given type. + * @param id The type of object to check for. + * @return True if the type is supported, false otherwise. + */ + bool IsTypeSupported(UniqueIdType id) const + { + ObjTypeItorConst itor(this->objectTypeMap.find(id)); + if (itor != this->objectTypeMap.end()) + { + return true; + } + else + { + return false; + } + } + + /** + * Gets a list of types that this factory knows how to create. + */ + void GetSupportedTypes(std::vector &types) const + { + types.clear(); + for (ObjTypeItorConst itor=this->objectTypeMap.begin(); + itor != this->objectTypeMap.end(); ++itor) + { + types.push_back(itor->first); + } + } + + /** + * Creates a new object. + * @param id - Type of object to create. + * @return Returns a pointer to the newly created object or NULL if the given id has not been registered. + * @throw Exception is thrown if the factory does not know how to create + * the requested type. + */ + BaseType* CreateObject(const UniqueIdType id) const + { + ObjTypeItorConst itor(this->objectTypeMap.find(id)); + + // We cannot create a new object if we do not know what type it is + // so throw an exception. + if (itor == this->objectTypeMap.end()) + { + return 0; + } + + return (itor->second)(); + } + + const ObjectMap& GetMap() const { return objectTypeMap; } + + private: + ///Maps a unique id to a function pointer that when called creates an + ///object of the appropriate type. + ObjectMap objectTypeMap; + }; +} diff --git a/external/dtEntity/include/dtEntity/profile.h b/external/dtEntity/include/dtEntity/profile.h new file mode 100644 index 000000000..2d6c050a7 --- /dev/null +++ b/external/dtEntity/include/dtEntity/profile.h @@ -0,0 +1,137 @@ +#pragma once + +/*************************************************************************************************** +** +** profile.h +** +** Real-Time Hierarchical Profiling for Game Programming Gems 3 +** +** by Greg Hjelstrom & Byon Garrabrant +** +***************************************************************************************************/ +#include +#include +#include +/* +** A node in the Profile Hierarchy Tree +*/ +class CProfileNode { + +public: + CProfileNode( dtEntity::StringId name, CProfileNode * parent ); + ~CProfileNode( void ); + + CProfileNode * Get_Sub_Node( dtEntity::StringId name ); + + CProfileNode * Get_Parent( void ) { return Parent; } + CProfileNode * Get_Sibling( void ) { return Sibling; } + CProfileNode * Get_Child( void ) { return Child; } + + void Reset( void ); + void Call( void ); + bool Return( void ); + + const dtEntity::StringId Get_Name( void ) { return Name; } + int Get_Total_Calls( void ) { return TotalCalls; } + float Get_Total_Time( void ) { return TotalTime; } + +protected: + + dtEntity::StringId Name; + int TotalCalls; + float TotalTime; + dtEntity::Timer_t StartTime; + int RecursionCounter; + + CProfileNode * Parent; + CProfileNode * Child; + CProfileNode * Sibling; +}; + +/* +** An iterator to navigate through the tree +*/ +class CProfileIterator +{ +public: + // Access all the children of the current parent + void First(void); + void Next(void); + bool Is_Done(void); + bool Is_Root(void) { return (CurrentParent->Get_Parent() == 0); } + + void Enter_Child( int index ); // Make the given child the new parent + void Enter_Largest_Child( void ); // Make the largest child the new parent + void Enter_Parent( void ); // Make the current parent's parent the new parent + + // Access the current child + dtEntity::StringId Get_Current_Name( void ) { return CurrentChild->Get_Name(); } + int Get_Current_Total_Calls( void ) { return CurrentChild->Get_Total_Calls(); } + float Get_Current_Total_Time( void ) { return CurrentChild->Get_Total_Time(); } + + // Access the current parent + const dtEntity::StringId Get_Current_Parent_Name( void ) { return CurrentParent->Get_Name(); } + int Get_Current_Parent_Total_Calls( void ) { return CurrentParent->Get_Total_Calls(); } + float Get_Current_Parent_Total_Time( void ) { return CurrentParent->Get_Total_Time(); } + +protected: + + CProfileNode * CurrentParent; + CProfileNode * CurrentChild; + + CProfileIterator( CProfileNode * start ); + friend class CProfileManager; +}; + + +/* +** The Manager for the Profile system +*/ +class DT_ENTITY_EXPORT CProfileManager { +public: + static void Start_Profile( dtEntity::StringId name ); + static void Stop_Profile( void ); + + static void Reset( void ); + static void Increment_Frame_Counter( void ); + static int Get_Frame_Count_Since_Reset( void ) { return FrameCounter; } + static float Get_Time_Since_Reset( void ); + + static CProfileIterator * Get_Iterator( void ) { return new CProfileIterator( &Root ); } + static void Release_Iterator( CProfileIterator * iterator ) { delete iterator; } + + static void dumpRecursive(CProfileIterator* profileIterator, int spacing); + static void dumpAll(); +private: + static CProfileNode Root; + static CProfileNode* CurrentNode; + static int FrameCounter; + static dtEntity::Timer_t ResetTime; +}; + + +/* +** ProfileSampleClass is a simple way to profile a function's scope +** Use the PROFILE macro at the start of scope to time +*/ +class CProfileSample { +public: + CProfileSample( dtEntity::StringId name ) + { + CProfileManager::Start_Profile( name ); + } + + ~CProfileSample( void ) + { + CProfileManager::Stop_Profile(); + } +}; + +#ifdef _DEBUG +#define PROFILE( name ) CProfileSample __profile( name ) +#else +#define PROFILE( name ) +#endif + + + diff --git a/external/dtEntity/include/dtEntity/property.h b/external/dtEntity/include/dtEntity/property.h new file mode 100644 index 000000000..dfaf83c51 --- /dev/null +++ b/external/dtEntity/include/dtEntity/property.h @@ -0,0 +1,1017 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace dtEntity +{ + + typedef osg::Vec2f Vec2f; + typedef osg::Vec3f Vec3f; + typedef osg::Vec4f Vec4f; + typedef osg::Vec2d Vec2d; + typedef osg::Vec3d Vec3d; + typedef osg::Vec4d Vec4d; + typedef osg::Quat Quat; + typedef osg::Matrix Matrix; + + /** + * dtEntity::Property class is an abstract base class. Each implementation + * is a wrapper for a (more or less) primitive data type like int, string, bool. + * The methods ToString and FromString can be used for serialization and deserialization. + * The property class has a variable mDataType which is used to identify the type + * of the concrete implementation class. + */ + + /** + * The data type IDs identifying the various property types + */ + namespace DataType + { + enum e + { + UNKNOWN_ID = 0, + ARRAY, + BOOL, + DOUBLE, + FLOAT, + GROUP, + INT, + MATRIX, + QUAT, + STRING, + STRINGID, + UINT, + VEC2, + VEC3, + VEC4, + VEC2D, + VEC3D, + VEC4D + }; + + std::string DT_ENTITY_EXPORT ToString(e); + e DT_ENTITY_EXPORT FromString(const std::string&); + } + + // helper function to split string by char + std::vector DT_ENTITY_EXPORT split(const std::string &s, char delim); + + // Fwd declaration + class Property; + + // value type of array property + typedef std::vector PropertyArray; + + // value type of group property + typedef std::map PropertyGroup; + + /** + * Base class for properties. Implementations have to set the mDataType + * variable on construction. + */ + class DT_ENTITY_EXPORT Property + { + public: + + virtual ~Property() {} + + /** + * Get data type of this property + */ + virtual DataType::e GetDataType() const = 0; + + /** + * Create a copy of this property on the heap + */ + virtual Property* Clone() const = 0; + + /** + * Set values of this property from another property. + * Should always work if both properties have the same type, + * Casting between property types should be possible case by case. + * return true if value could be set. + */ + virtual bool SetFrom(const Property& other) = 0; + + /** + * Equality operator has to be provided. Is used to check if + * values were changed from their default at serialization time + */ + virtual bool operator==(const Property& other) const = 0; + + /** + * To and from string have to be supplied for the editor gui and + * possibly for map saving + */ + virtual const std::string StringValue() const = 0; + virtual void SetString(const std::string&) = 0; + + /** + * Get value of property interpreted as various types. + * These default implementations cause an assertion error in debug mode + * and return a null value in release mode. + */ + virtual PropertyArray ArrayValue() const + { + LOG_ERROR("Cannot convert " << DataType::ToString(GetDataType()) << " to an array value!"); + return PropertyArray(); + } + + virtual bool BoolValue() const + { + LOG_ERROR("Cannot convert " << DataType::ToString(GetDataType()) << " to a bool value!"); + return false; + } + + virtual char CharValue() const + { + LOG_ERROR("Cannot convert " << DataType::ToString(GetDataType()) << " to a char value!"); + return 0; + } + + virtual double DoubleValue() const + { + LOG_ERROR("Cannot convert " << DataType::ToString(GetDataType()) << " to a double value!"); + return 0.0; + } + + virtual float FloatValue() const + { + LOG_ERROR("Cannot convert " << DataType::ToString(GetDataType()) << " to a float value!"); + return 0.0f; + } + + virtual PropertyGroup GroupValue() const + { + LOG_ERROR("Cannot convert " << DataType::ToString(GetDataType()) << " to a group value!"); + return PropertyGroup(); + } + + virtual int IntValue() const + { + LOG_ERROR("Cannot convert " << DataType::ToString(GetDataType()) << " to an int value!"); + return 0; + } + + virtual Matrix MatrixValue() const + { + LOG_ERROR("Cannot convert " << DataType::ToString(GetDataType()) << " to a matrix value!"); + return Matrix(); + } + + virtual Quat QuatValue() const + { + LOG_ERROR("Cannot convert " << DataType::ToString(GetDataType()) << " to a quat value!"); + return Quat(); + } + + virtual StringId StringIdValue() const + { + LOG_ERROR("Cannot convert " << DataType::ToString(GetDataType()) << " to a StringId value!"); + return 0; + } + + virtual unsigned int UIntValue() const + { + LOG_ERROR("Cannot convert " << DataType::ToString(GetDataType()) << " to a UInt value!"); + return 0; + } + + virtual Vec2f Vec2Value() const + { + LOG_ERROR("Cannot convert " << DataType::ToString(GetDataType()) << " to a vec2 value!"); + return Vec2f(); + } + + virtual Vec3f Vec3Value() const + { + LOG_ERROR("Cannot convert " << DataType::ToString(GetDataType()) << " to a vec3 value!"); + return Vec3f(); + } + + virtual Vec4f Vec4Value() const + { + LOG_ERROR("Cannot convert " << DataType::ToString(GetDataType()) << " to a vec4 value!"); + return Vec4f(); + } + + virtual Vec2d Vec2dValue() const + { + LOG_ERROR("Cannot convert " << DataType::ToString(GetDataType()) << " to a vec2d value!"); + return Vec2d(); + } + + virtual Vec3d Vec3dValue() const + { + LOG_ERROR("Cannot convert " << DataType::ToString(GetDataType()) << " to a vec3d value!"); + return Vec3d(); + } + + virtual Vec4d Vec4dValue() const + { + LOG_ERROR("Cannot convert " << DataType::ToString(GetDataType()) << " to a vec4d value!"); + return Vec4d(); + } + + + virtual void SetArray(const PropertyArray&) + { + LOG_ERROR("Cannot set " << DataType::ToString(GetDataType()) << " to an array value!"); + } + + virtual void SetBool(bool) + { + LOG_ERROR("Cannot set " << DataType::ToString(GetDataType()) << " to an bool value!"); + } + + virtual void SetChar(char) + { + LOG_ERROR("Cannot set " << DataType::ToString(GetDataType()) << " to a char value!"); + } + + virtual void SetDouble(double) + { + LOG_ERROR("Cannot set " << DataType::ToString(GetDataType()) << " to a double value!"); + } + + virtual void SetFloat(float) + { + LOG_ERROR("Cannot set " << DataType::ToString(GetDataType()) << " to a float value!"); + } + + virtual void SetGroup(const PropertyGroup&) + { + LOG_ERROR("Cannot set " << DataType::ToString(GetDataType()) << " to a group value!"); + } + + virtual void SetInt(int) + { + LOG_ERROR("Cannot set " << DataType::ToString(GetDataType()) << " to an int value!"); + } + + virtual void SetMatrix(const Matrix&) + { + LOG_ERROR("Cannot set " << DataType::ToString(GetDataType()) << " to a matrix value!"); + } + + virtual void SetQuat(const Quat&) + { + LOG_ERROR("Cannot set " << DataType::ToString(GetDataType()) << " to a quat value!"); + } + + virtual void SetStringId(dtEntity::StringId) + { + LOG_ERROR("Cannot set " << DataType::ToString(GetDataType()) << " to a StringId value!"); + } + + virtual void SetUInt(unsigned int) + { + LOG_ERROR("Cannot set " << DataType::ToString(GetDataType()) << " to a uint value!"); + } + + virtual void SetVec2(const Vec2f&) + { + LOG_ERROR("Cannot set " << DataType::ToString(GetDataType()) << " to a vec2 value!"); + } + + virtual void SetVec3(const Vec3f&) + { + LOG_ERROR("Cannot set " << DataType::ToString(GetDataType()) << " to a vec3 value!"); + } + + virtual void SetVec4(const Vec4f&) + { + LOG_ERROR("Cannot set " << DataType::ToString(GetDataType()) << " to a vec4 value!"); + } + + virtual void SetVec2D(const Vec2d&) + { + LOG_ERROR("Cannot set " << DataType::ToString(GetDataType()) << " to a vec2d value!"); + } + + virtual void SetVec3D(const Vec3d&) + { + LOG_ERROR("Cannot set " << DataType::ToString(GetDataType()) << " to a vec3d value!"); + } + + virtual void SetVec4D(const Vec4d&) + { + LOG_ERROR("Cannot set " << DataType::ToString(GetDataType()) << " to a vec4d value!"); + } + + }; + + //////////////////////////////////////////////////////////////////////////////// + + /** + * holds an array of properties as pointers. + * Takes ownership of its properties: all properties are deleted in + * the destructor. + */ + class DT_ENTITY_EXPORT ArrayProperty : public Property + { + public: + ArrayProperty(const PropertyArray& v = PropertyArray()); + ~ArrayProperty(); + + typedef PropertyArray::size_type size_type; + + virtual DataType::e GetDataType() const { return DataType::ARRAY; } + + virtual PropertyArray ArrayValue() const; + virtual void SetArray(const PropertyArray& v) { Set(v); } + virtual const std::string StringValue() const; + virtual Vec2f Vec2Value() const; + virtual Vec3f Vec3Value() const; + virtual Vec4f Vec4Value() const; + virtual Vec2d Vec2dValue() const; + virtual Vec3d Vec3dValue() const; + virtual Vec4d Vec4dValue() const; + virtual Quat QuatValue() const; + virtual Matrix MatrixValue() const; + + const PropertyArray& Get() const { return mValue; } + + virtual Property* Clone() const ; + virtual bool operator==(const Property& other) const; + + void Set(const PropertyArray& v); + + // causes an assertion failure when called + virtual void SetString(const std::string&); + virtual void SetVec2(const Vec2f&); + virtual void SetVec3(const Vec3f&); + virtual void SetVec4(const Vec4f&); + virtual void SetVec2D(const Vec2d&); + virtual void SetVec3D(const Vec3d&); + virtual void SetVec4D(const Vec4d&); + + virtual bool SetFrom(const Property& other); + + /** + * Add to array. Ownership is taken by ArrayProperty - + * property is deleted in destructor + */ + void Add(Property* prop); + + /** + * Insert into array at given index. Ownership is taken by ArrayProperty - + * property is deleted in destructor + */ + void Insert(size_type index, Property* prop); + + /** + * @return property at given index + */ + Property* Get(size_type index); + const Property* Get(size_type index) const; + + /** + * Remove from array and delete prop + * Remove true if prop was found in array + */ + bool Remove(Property* prop); + + /** + * Delete all held properties + */ + void Clear(); + + size_type Size() const + { + return mValue.size(); + } + + private: + + PropertyArray mValue; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT BoolProperty : public Property + { + public: + BoolProperty(bool v = false); + + virtual DataType::e GetDataType() const { return DataType::BOOL; } + + virtual bool BoolValue() const; + virtual void SetBool(bool v) { Set(v); } + + virtual const std::string StringValue() const; + bool Get() const { return mValue; } + + virtual Property* Clone() const; + virtual bool operator==(const Property& other) const; + void Set(bool v) { mValue = v; } + virtual void SetString(const std::string&); + virtual bool SetFrom(const Property& other); + + private: + + bool mValue; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT DoubleProperty : public Property + { + public: + DoubleProperty(double v = 0); + + virtual DataType::e GetDataType() const { return DataType::DOUBLE; } + + virtual double DoubleValue() const; + virtual float FloatValue() const; + virtual unsigned int UIntValue() const; + virtual void SetDouble(double v) { Set(v); } + virtual void SetFloat(float v) { Set(v); } + virtual const std::string StringValue() const; + double Get() const { return mValue; } + virtual Property* Clone() const; + virtual bool operator==(const Property& other) const; + void Set(double v) { mValue = v; } + virtual void SetString(const std::string&); + virtual bool SetFrom(const Property& other); + + private: + double mValue; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT FloatProperty : public Property + { + public: + FloatProperty(float v = 0); + + virtual DataType::e GetDataType() const { return DataType::FLOAT; } + virtual float FloatValue() const; + virtual double DoubleValue() const; + virtual void SetFloat(float v) { Set(v); } + virtual void SetDouble(double v) { Set(static_cast(v)); } + virtual const std::string StringValue() const; + float Get() const { return mValue; } + + virtual Property* Clone() const; + virtual bool operator==(const Property& other) const; + void Set(float v) { mValue = v; } + virtual void SetString(const std::string&); + virtual bool SetFrom(const Property& other); + + private: + float mValue; + }; + + ////////////////////////////////////////////////////////////////// + /** + * Takes ownership of added properties, they are deleted in the + * destructor + */ + class DT_ENTITY_EXPORT GroupProperty : public Property + { + public: + GroupProperty(const PropertyGroup& v = PropertyGroup()); + ~GroupProperty(); + GroupProperty(const GroupProperty&); + + virtual DataType::e GetDataType() const { return DataType::GROUP; } + + void Clear(); + + virtual PropertyGroup GroupValue() const; + virtual void SetGroup(const PropertyGroup& v) { Set(v); } + virtual const std::string StringValue() const; + + const PropertyGroup& Get() const { return mValue; } + + // add prop and take ownership + void Add(StringId name, Property* prop); + virtual Property* Clone() const; + void operator=(const GroupProperty&); + bool operator==(const Property& other) const; + void operator+=(const GroupProperty& other); + void Set(const PropertyGroup& v); + virtual void SetString(const std::string&); + virtual bool SetFrom(const Property& other); + bool Empty() const; + Property* Get(StringId); + const Property* Get(StringId) const; + bool Has(StringId) const; + + protected: + PropertyGroup mValue; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT IntProperty : public Property + { + public: + IntProperty(int v = 0); + + virtual DataType::e GetDataType() const { return DataType::INT; } + + virtual int IntValue() const; + virtual void SetInt(int v) { Set(v); } + virtual unsigned int UIntValue() const; + virtual void SetUInt(unsigned int v) { Set(static_cast(v)); } + + virtual float FloatValue() const; + virtual double DoubleValue() const; + virtual void SetDouble(double); + virtual void SetFloat(float); + virtual const std::string StringValue() const; + int Get() const { return mValue; } + + virtual Property* Clone() const; + virtual bool operator==(const Property& other) const; + void Set(int v) { mValue = v; } + virtual void SetString(const std::string&); + virtual bool SetFrom(const Property& other); + private: + int mValue; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT MatrixProperty : public Property + { + public: + MatrixProperty(const Matrix& v = Matrix()); + + virtual DataType::e GetDataType() const { return DataType::MATRIX; } + + virtual Matrix MatrixValue() const; + virtual void SetMatrix(const Matrix& v) { Set(v); } + virtual const std::string StringValue() const; + const Matrix& Get() const { return mValue; } + + virtual Property* Clone() const; + virtual bool operator==(const Property& other) const; + void Set(const Matrix& v) { mValue = v; } + virtual void SetString(const std::string&); + virtual bool SetFrom(const Property& other); + + private: + + Matrix mValue; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT QuatProperty : public Property + { + public: + QuatProperty(); + QuatProperty(const Quat& v); + QuatProperty(double x, double y, double z, double w); + QuatProperty(const double* v); + + virtual DataType::e GetDataType() const { return DataType::QUAT; } + + virtual Quat QuatValue() const; + virtual const std::string StringValue() const; + virtual void SetQuat(const Quat& v) { Set(v); } + + const Quat Get() const { return Quat(mValues[0], mValues[1], mValues[2], mValues[3]); } + + // warning: not sure if this is safe on all platforms + const Quat& GetAsQuat() const { return reinterpret_cast(mValues); } + + virtual Property* Clone() const; + virtual bool operator==(const Property& other) const; + + void Set(const Quat& v) + { + mValues[0] = v[0]; + mValues[1] = v[1]; + mValues[2] = v[2]; + mValues[3] = v[3]; + } + + void Set(const double* v) + { + mValues[0] = v[0]; + mValues[1] = v[1]; + mValues[2] = v[2]; + mValues[3] = v[3]; + } + + const double* GetValues() const { return mValues; } + + virtual void SetString(const std::string&); + virtual bool SetFrom(const Property& other); + + private: + + double mValues[4]; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT StringProperty : public Property + { + public: + StringProperty(const std::string& v = ""); + + virtual DataType::e GetDataType() const { return DataType::STRING; } + + virtual const std::string StringValue() const; + virtual StringId StringIdValue() const; + //virtual void SetStringId(dtEntity::StringId v) { Set(GetStringFromSID(v)); } + + const std::string Get() const { return mValue; } + + virtual Property* Clone() const; + virtual bool operator==(const Property& other) const; + void Set(const std::string& v) { mValue = v; } + virtual void SetString(const std::string&); + virtual bool SetFrom(const Property& other); + + private: + + std::string mValue; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT StringIdProperty : public Property + { + public: + StringIdProperty(StringId v = StringId()); + + virtual DataType::e GetDataType() const { return DataType::STRINGID; } + + virtual StringId StringIdValue() const; + virtual void SetStringId(dtEntity::StringId v) { Set(v); } + virtual const std::string StringValue() const; + StringId Get() const { return mValue; } + + virtual Property* Clone() const; + virtual bool operator==(const Property& other) const; + void Set(StringId v) { mValue = v; } + virtual void SetString(const std::string&); + virtual bool SetFrom(const Property& other); + + private: + + StringId mValue; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT UIntProperty : public Property + { + public: + UIntProperty(unsigned int v = 0); + + virtual DataType::e GetDataType() const { return DataType::UINT; } + + virtual unsigned int UIntValue() const; + virtual void SetUInt(unsigned int v) { Set(v); } + virtual int IntValue() const; + virtual float FloatValue() const; + virtual double DoubleValue() const; + virtual const std::string StringValue() const; + unsigned int Get() const { return mValue; } + + virtual Property* Clone() const; + virtual bool operator==(const Property& other) const; + void Set(unsigned int v) { mValue = v; } + virtual void SetString(const std::string&); + virtual void SetDouble(double); + virtual void SetFloat(float); + virtual bool SetFrom(const Property& other); + private: + unsigned int mValue; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT Vec2Property : public Property + { + public: + + Vec2Property(); + Vec2Property(const Vec2f& v); + Vec2Property(float x, float y); + Vec2Property(const float* vals); + + virtual DataType::e GetDataType() const { return DataType::VEC2; } + + virtual Vec2f Vec2Value() const; + virtual void SetVec2(const Vec2f& v) { Set(v); } + virtual Vec2d Vec2dValue() const; + virtual void SetVec2D(const Vec2d& v) { Set(v); } + + virtual const std::string StringValue() const; + const Vec2f Get() const { return Vec2f(mValues[0], mValues[1]); } + + // warning: not sure if this is safe on all platforms + const Vec2f& GetAsVec2() const { return reinterpret_cast(mValues); } + + virtual Property* Clone() const; + virtual bool operator==(const Property& other) const; + + void Set(const Vec2f& v) + { + mValues[0] = v[0]; + mValues[1] = v[1]; + } + + void Set(const float* v) + { + mValues[0] = v[0]; + mValues[1] = v[1]; + } + + virtual void SetString(const std::string&); + virtual bool SetFrom(const Property& other); + + const float* GetValues() const { return mValues; } + + private: + + float mValues[2]; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT Vec3Property : public Property + { + public: + Vec3Property(); + Vec3Property(const Vec3f& v); + Vec3Property(float x, float y, float z); + Vec3Property(const float* vals); + + virtual DataType::e GetDataType() const { return DataType::VEC3; } + + virtual Vec3f Vec3Value() const; + virtual void SetVec3(const Vec3f& v) { Set(v); } + virtual Vec3d Vec3dValue() const; + virtual void SetVec3D(const Vec3d& v) { Set(v); } + + virtual Vec2f Vec2Value() const; + virtual Vec2d Vec2dValue() const; + virtual const std::string StringValue() const; + const Vec3f Get() const { return Vec3f(mValues[0], mValues[1], mValues[2]); } + + // warning: not sure if this is safe on all platforms + const Vec3f& GetAsVec3() const { return reinterpret_cast(mValues); } + + virtual Property* Clone() const; + virtual bool operator==(const Property& other) const; + void Set(const Vec3f& v) + { + mValues[0] = v[0]; + mValues[1] = v[1]; + mValues[2] = v[2]; + } + + void Set(const float* v) + { + mValues[0] = v[0]; + mValues[1] = v[1]; + mValues[2] = v[2]; + } + + virtual void SetString(const std::string&); + virtual bool SetFrom(const Property& other); + + const float* GetValues() const { return mValues; } + + + private: + float mValues[3]; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT Vec4Property : public Property + { + public: + Vec4Property(); + Vec4Property(const Vec4f& v); + Vec4Property(float x, float y, float z, float w); + Vec4Property(const float* vals); + + virtual DataType::e GetDataType() const { return DataType::VEC4; } + + virtual Vec4f Vec4Value() const; + virtual void SetVec4(const Vec4f& v) { Set(v); } + virtual Vec4d Vec4dValue() const; + virtual void SetVec4D(const Vec4d& v) { Set(v); } + virtual const std::string StringValue() const; + + const Vec4f Get() const { return Vec4f(mValues[0], mValues[1], mValues[2], mValues[3]); } + + // warning: not sure if this is safe on all platforms + const Vec4f& GetAsVec4() const { return reinterpret_cast(mValues); } + + virtual Vec2f Vec2Value() const; + virtual Vec2d Vec2dValue() const; + virtual Vec3f Vec3Value() const; + virtual Vec3d Vec3dValue() const; + + virtual Property* Clone() const; + virtual bool operator==(const Property& other) const; + void Set(const Vec4f& v) + { + mValues[0] = v[0]; + mValues[1] = v[1]; + mValues[2] = v[2]; + mValues[3] = v[3]; + } + + void Set(const float* v) + { + mValues[0] = v[0]; + mValues[1] = v[1]; + mValues[2] = v[2]; + mValues[3] = v[3]; + } + + virtual void SetString(const std::string&); + virtual bool SetFrom(const Property& other); + + const float* GetValues() const { return mValues; } + + private: + float mValues[4]; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT Vec2dProperty : public Property + { + public: + + Vec2dProperty(); + Vec2dProperty(const Vec2d& v); + Vec2dProperty(double x, double y); + Vec2dProperty(const double* v); + + virtual DataType::e GetDataType() const { return DataType::VEC2D; } + + virtual Vec2f Vec2Value() const; + virtual void SetVec2(const Vec2f& v) { Set(v); } + virtual Vec2d Vec2dValue() const; + virtual void SetVec2D(const Vec2d& v) { Set(v); } + virtual const std::string StringValue() const; + const Vec2d Get() const { return Vec2d(mValues[0], mValues[1]); } + + // warning: not sure if this is safe on all platforms + const Vec2d& GetAsVec2d() const { return reinterpret_cast(mValues); } + + virtual Property* Clone() const; + virtual bool operator==(const Property& other) const; + void Set(const Vec2d& v) + { + mValues[0] = v[0]; + mValues[1] = v[1]; + } + + void Set(const double* v) + { + mValues[0] = v[0]; + mValues[1] = v[1]; + } + + virtual void SetString(const std::string&); + virtual bool SetFrom(const Property& other); + + const double* GetValues() const { return mValues; } + + private: + + double mValues[2]; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT Vec3dProperty : public Property + { + public: + + Vec3dProperty(); + Vec3dProperty(const Vec3d& v); + Vec3dProperty(double x, double y, double z); + Vec3dProperty(const double* v); + + virtual DataType::e GetDataType() const { return DataType::VEC3D; } + + virtual Vec3f Vec3Value() const; + virtual void SetVec3(const Vec3f& v) { Set(v); } + virtual Vec3d Vec3dValue() const; + virtual void SetVec3D(const Vec3d& v) { Set(v); } + virtual const std::string StringValue() const; + const Vec3d Get() const { return Vec3d(mValues[0], mValues[1], mValues[2]); } + + // warning: not sure if this is safe on all platforms + const Vec3d& GetAsVec3d() const { return reinterpret_cast(mValues); } + + virtual Vec2f Vec2Value() const; + virtual Vec2d Vec2dValue() const; + + virtual Property* Clone() const; + virtual bool operator==(const Property& other) const; + void Set(const Vec3d& v) + { + mValues[0] = v[0]; + mValues[1] = v[1]; + mValues[2] = v[2]; + } + + void Set(const double* v) + { + mValues[0] = v[0]; + mValues[1] = v[1]; + mValues[2] = v[2]; + } + + virtual void SetString(const std::string&); + virtual bool SetFrom(const Property& other); + + const double* GetValues() const { return mValues; } + + private: + double mValues[3]; + }; + + ////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT Vec4dProperty : public Property + { + public: + + Vec4dProperty(); + Vec4dProperty(const Vec4d& v); + Vec4dProperty(double x, double y, double z, double w); + Vec4dProperty(const double* v); + + virtual DataType::e GetDataType() const { return DataType::VEC4D; } + + virtual Vec4f Vec4Value() const; + virtual void SetVec4(const Vec4f& v) { Set(v); } + virtual Vec4d Vec4dValue() const; + virtual void SetVec4D(const Vec4d& v) { Set(v); } + virtual const std::string StringValue() const; + const Vec4d Get() const { return Vec4d(mValues[0], mValues[1], mValues[2], mValues[3]); } + + // warning: not sure if this is safe on all platforms + const Vec4d& GetAsVec2d() const { return reinterpret_cast(mValues); } + + virtual Vec2f Vec2Value() const; + virtual Vec2d Vec2dValue() const; + virtual Vec3f Vec3Value() const; + virtual Vec3d Vec3dValue() const; + + virtual Property* Clone() const; + virtual bool operator==(const Property& other) const; + void Set(const Vec4d& v) + { + mValues[0] = v[0]; + mValues[1] = v[1]; + mValues[2] = v[2]; + mValues[3] = v[3]; + } + + void Set(const double* v) + { + mValues[0] = v[0]; + mValues[1] = v[1]; + mValues[2] = v[2]; + mValues[3] = v[3]; + } + + virtual void SetString(const std::string&); + virtual bool SetFrom(const Property& other); + + const double* GetValues() const { return mValues; } + + private: + double mValues[4]; + }; + +} diff --git a/external/dtEntity/include/dtEntity/propertycontainer.h b/external/dtEntity/include/dtEntity/propertycontainer.h new file mode 100644 index 000000000..61c6419ec --- /dev/null +++ b/external/dtEntity/include/dtEntity/propertycontainer.h @@ -0,0 +1,147 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include + +namespace dtEntity +{ + class Property; + + /** + * Holds a number of properties. This container does NOT take ownership + * of properties, they are not deleted in the constructor. + */ + class DT_ENTITY_EXPORT PropertyContainer : public GroupProperty + { + public: + + PropertyContainer() {} + + virtual ~PropertyContainer() + { + // don't delete properties, they are not on heap + mValue.clear(); + } + +#if CALL_ONPROPERTYCHANGED_METHOD == 0 + // hide when compiling with new property system + private: +#endif + /** + * Can be overridden to react to changes of properties. + * Should be called by user when changing a property on the + * PropertyContainer. + */ + virtual void OnPropertyChanged(StringId propname, Property& prop) {} + + public: + + /** + * should be called when a set of interdependent + * properties were changed. + * The component can overwrite this method to react to these + * changes. + */ + virtual void Finished() {} + + /** + * template helper for creating Clone() methods + */ + template + T* CloneContainer() const; + + /** + * Copy property values from other to this + */ + void InitFrom(const PropertyContainer& other); + + /** + * Set value of property registered with given string id. + * In debug mode this throws an assertion when a component + * is set to a wrong type. + */ + void SetArray(StringId name, const std::vector& val); + void SetBool(StringId name, bool val); + void SetDouble(StringId name, double val); + void SetFloat(StringId name, float val); + void SetGroup(StringId name, const std::map& val); + void SetInt(StringId name, int val); + void SetMatrix(StringId name, const Matrix& val); + void SetQuat(StringId name, const Quat& val); + void SetString(StringId name, const std::string& val); + void SetStringId(StringId name, StringId val); + void SetUInt(StringId name, unsigned int val); + void SetVec2(StringId name, const Vec2f& val); + void SetVec3(StringId name, const Vec3f& val); + void SetVec4(StringId name, const Vec4f& val); + void SetVec2d(StringId name, const Vec2d& val); + void SetVec3d(StringId name, const Vec3d& val); + void SetVec4d(StringId name, const Vec4d& val); + + /** + * Return value of property registered with given string id + */ + std::vector GetArray(StringId name) const; + bool GetBool(StringId name) const; + double GetDouble(StringId name) const; + float GetFloat(StringId name) const; + std::map GetGroup(StringId name) const; + int GetInt(StringId name) const; + Matrix GetMatrix(StringId name) const; + Quat GetQuat(StringId name) const; + std::string GetString(StringId name) const; + StringId GetStringId(StringId name) const; + unsigned int GetUInt(StringId name) const; + Vec2f GetVec2(StringId name) const; + Vec3f GetVec3(StringId name) const; + Vec4f GetVec4(StringId name) const; + Vec2d GetVec2d(StringId name) const; + Vec3d GetVec3d(StringId name) const; + Vec4d GetVec4d(StringId name) const; + + protected: + + /** + * Register a property under the given string id + */ + void Register(StringId name, Property* prop); + + private: + + // no copy constructor + PropertyContainer(const PropertyContainer& other); + }; + + template + T* PropertyContainer::CloneContainer() const + { + T* ret = new T(); + ret->InitFrom(*this); + return ret; + } + +} diff --git a/external/dtEntity/include/dtEntity/rapidxmlmapencoder.h b/external/dtEntity/include/dtEntity/rapidxmlmapencoder.h new file mode 100644 index 000000000..a759a6b86 --- /dev/null +++ b/external/dtEntity/include/dtEntity/rapidxmlmapencoder.h @@ -0,0 +1,77 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include + +namespace dtEntity +{ + + class Spawner; + class MapSystem; + class Property; + + class DT_ENTITY_EXPORT RapidXMLMapEncoder + : public MapEncoder + { + + public: + + RapidXMLMapEncoder(EntityManager& em); + virtual ~RapidXMLMapEncoder(); + + virtual bool LoadMapFromFile(const std::string& path); + + // empty destination means overwrite mapPath + virtual bool SaveMapToFile(const std::string& mapPath, const std::string& destination = ""); + + virtual bool LoadSceneFromFile(const std::string& path); + + // empty dest means overwrite original file + virtual bool SaveSceneToFile(const std::string& path); + + virtual bool AcceptsMapExtension(const std::string& extension) const + { + return extension == "dtemap"; + } + + virtual bool AcceptsSceneExtension(const std::string& extension) const + { + return extension == "dtescene"; + } + + static dtEntity::Property* ParseProperty(rapidxml::xml_node<>* element); + + // create XML nodes for properties and add them to parent node + static void SerializeProperties(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* parent, const std::map& props); + + private: + + EntityManager* mEntityManager; + MapSystem* mMapSystem; + + }; +} + diff --git a/external/dtEntity/include/dtEntity/resourcemanager.h b/external/dtEntity/include/dtEntity/resourcemanager.h new file mode 100644 index 000000000..b51b5ad5e --- /dev/null +++ b/external/dtEntity/include/dtEntity/resourcemanager.h @@ -0,0 +1,87 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include + +namespace osg +{ + class Node; +} + +namespace dtEntity +{ + class EntityManager; + + namespace ResourceManagerOptions + { + enum e + { + DeepCopy = 1<<0, // If in cache: Create copy of node and all of its subnodes + ShallowCopy = 1<<1, // If in cache: Create copy of node, share subnodes of cached node + CopyNodes = 1<<2, // If in cache: Create copy of node and subnodes, share vertices, textures etc + CopyHardwareMeshes = 1<<3, // If in cache: Special mode for efficiently sharing osgAnimation objects + DoOptimization = 1<<4, // Run osgUtil::Optimizer on first load + Default = ShallowCopy + }; + } + + /////////////////////////////////////////////////////////////////////////// + class DT_ENTITY_EXPORT ResourceManager + : public dtEntity::Singleton + { + public: + + typedef std::map > NodeStore; + + /** + * Try to read node from data paths. + * @param path Load resource from this path + * @param options Loading options. + * @return node, NULL if not found + */ + osg::ref_ptr GetNode(EntityManager& em, const std::string& path, unsigned int options = ResourceManagerOptions::Default); + + /** + * @return true if this resource resides in the cache + */ + bool IsInNodeCache(const std::string& path); + + /** + * remove from cache + * @return true if this resource was in the cache + */ + bool RemoveFromNodeCache(const std::string& path); + + /** + * Call this method to notify the resource manager that this resource has changed + * and should be reloaded + */ + void TriggerReload(const std::string& path, EntityManager& em); + + private: + NodeStore mNodeStore; + }; +} diff --git a/external/dtEntity/include/dtEntity/scriptaccessor.h b/external/dtEntity/include/dtEntity/scriptaccessor.h new file mode 100644 index 000000000..8e557a93e --- /dev/null +++ b/external/dtEntity/include/dtEntity/scriptaccessor.h @@ -0,0 +1,53 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include + +namespace dtEntity +{ + + + typedef std::vector PropertyArgs; + typedef fastdelegate::FastDelegate1 ScriptMethodFunctor; + + class DT_ENTITY_EXPORT ScriptAccessor + { + public: + + virtual ~ScriptAccessor() { } + + void AddScriptedMethod(const std::string& methodname, const ScriptMethodFunctor& functor); + + // Caller is responsible for deleting the returned property! + Property* CallScriptedMethod(const std::string& methodname, const PropertyArgs& args) const; + + void GetMethodNames(std::vector& names) const; + + private: + std::map mFunctors; + }; +} + diff --git a/external/dtEntity/include/dtEntity/singleton.h b/external/dtEntity/include/dtEntity/singleton.h new file mode 100644 index 000000000..fa43ed06d --- /dev/null +++ b/external/dtEntity/include/dtEntity/singleton.h @@ -0,0 +1,73 @@ +#pragma once + +/* -*-c++-*- + * dtEntity Game and Simulation Engine + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Martin Scheffler + */ + + +namespace dtEntity +{ + /** simple singleton class. Not thread safe! + */ + template + class Singleton + { + public: + + static T& GetInstance() + { + if (mInstance == 0) + { + mInstance = new T; + } + + return *mInstance; + }; + + static void DestroyInstance() + { + if(mInstance != 0) + { + delete mInstance; + mInstance = 0; + } + } + + protected: + + Singleton() + { + }; + + virtual ~Singleton() + { + }; + + private: + + Singleton(const Singleton& source) + { + }; + + static T* mInstance; + }; + + template T* Singleton::mInstance = 0; + +} diff --git a/external/dtEntity/include/dtEntity/spawner.h b/external/dtEntity/include/dtEntity/spawner.h new file mode 100644 index 000000000..bd9330a05 --- /dev/null +++ b/external/dtEntity/include/dtEntity/spawner.h @@ -0,0 +1,176 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include + +namespace dtEntity +{ + class Entity; + + /** + * Spawner: a template for creating entities. + * Each spawner contains a number of components which contain properties. + * When Spawner::Spawn is called, components are created for the passed entity and + * their properties are set to specified values. + * Spawners can form a sort of inheritance tree. When a child spawner is used to + * spawn an entity, all components defined in the spawner and its parent chain are + * created. Children spawners can overwrite the property values of their parents. + */ + class DT_ENTITY_EXPORT Spawner : public osg::Referenced + { + public: + + typedef std::map ComponentProperties; + + /** + * Constructor + */ + Spawner(const std::string& name, const std::string& mapName, Spawner* parent = NULL); + + /** + *return name of spawner + */ + std::string GetName() const { return mName; } + + /** + *return name of map this spawner was loaded from + */ + std::string GetMapName() const { return mMapName; } + void SetMapName(const std::string& v) { mMapName = v; } + + /** + * Should spawner show up in spawner drag & drop GUI? + */ + bool GetAddToSpawnerStore() const { return mAddToSpawnerStore; } + void SetAddToSpawnerStore(bool v) { mAddToSpawnerStore = v; } + + /** + * category for spawner store + */ + std::string GetGUICategory() { return mGUICategory; } + void SetGUICategory(const std::string& v) { mGUICategory = v; } + + /** + * icon for representing spawner in GUI + */ + std::string GetIconPath() { return mIconPath; } + void SetIconPath(const std::string& v) { mIconPath = v; } + + /** + *return name of map this spawner was loaded from + */ + Spawner* GetParent() { return mParent; } + const Spawner* GetParent() const { return mParent; } + + /** + * Collect all components of entity and all properties of these components + * and store them + */ + void InitFromEntity(const Entity& entity); + + /** + * Add components to entity and set their properties. Calls Finished(). + */ + bool Spawn(Entity& entity) const; + + /** + * Copy value from newval to a component property + */ + bool SetValue(ComponentType ctype, StringId propname, const Property& newval); + + /** + * Return true if spawner contains a component of this type + */ + bool HasComponent(ComponentType ctype) const; + + /** + * Return true if spawner or one of its parents contain a component of this type + */ + bool HasComponentRecursive(ComponentType ctype) const; + + /** + * Add a component of type ctype. The props container holds the initial property + * values to assign to the component. + */ + void AddComponent(ComponentType ctype, const GroupProperty& props); + + /** + * Remove component of this type. Return true if component existed + */ + bool RemoveComponent(ComponentType ctype); + + /** + * Get property values to assign to component after spawning it + */ + GroupProperty GetComponentValues(ComponentType ctype) const; + + /** + * Set properties of existing component in spawner.The props container holds the initial property + * values to assign to the component. All previous component values are cleared. + */ + void SetComponentValues(ComponentType ctype, const GroupProperty&); + + /** + * Get a map of components and their properties set for this spawner + */ + void GetAllComponentProperties(ComponentProperties& props) const; + + /** + * Get component properties of spawner hierarchy, children values overwrite + * parent values + */ + void GetAllComponentPropertiesRecursive(ComponentProperties& props) const; + + protected: + + virtual ~Spawner(); + + private: + + // name of spawner + std::string mName; + + // name of map this spawner was loaded from + std::string mMapName; + + // icon for representing spawner in GUI + std::string mIconPath; + + // should spawner show up in spawner drag & drop GUI? + bool mAddToSpawnerStore; + + // category for spawner store + std::string mGUICategory; + + // parent spawner, may be empty + osg::ref_ptr mParent; + + // The components and their properties that should be spawned + ComponentProperties mComponentProperties; + }; + +} diff --git a/external/dtEntity/include/dtEntity/stringid.h b/external/dtEntity/include/dtEntity/stringid.h new file mode 100644 index 000000000..420627113 --- /dev/null +++ b/external/dtEntity/include/dtEntity/stringid.h @@ -0,0 +1,77 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include + +namespace dtEntity +{ + + // serial ID for strings + + #if DTENTITY_USE_STRINGS_AS_STRINGIDS + typedef std::string StringId; + #else + typedef unsigned int StringId; + #endif + + // type id for messages + typedef StringId MessageType; + + // type id for components + typedef StringId ComponentType; + + /** + * Get a unique StringId for given string. + * If DTENTITY_USE_STRINGS_AS_STRINGIDS macri is set to ON + * this returns the string itself. Else a CRC32 hash + * is returned. + * In any case, the crc32 value is added to a reverse lookup table + * so that it can be resolved back to a string. + * This function is thread safe. + * @param str The string to index + */ + StringId DT_ENTITY_EXPORT SID(const std::string& str); + + /** + * Get the string that was used to generate the String id. + * If DTENTITY_USE_STRINGS_AS_STRINGIDS macro is set + * the input string is returned unchanged. Else + * a crc32 value is expected as input. + */ + std::string DT_ENTITY_EXPORT GetStringFromSID(StringId id); + + /** + * get string id crc32 hash of string, don't add to reverse lookup + */ + StringId DT_ENTITY_EXPORT SIDHash(const std::string& str); + + /** + * get string id crc32 hash of string, add to reverse lookup + */ + StringId DT_ENTITY_EXPORT SID(unsigned int hash); + + unsigned int DT_ENTITY_EXPORT SIDToUInt(StringId); + +} diff --git a/external/dtEntity/include/dtEntity/systeminterface.h b/external/dtEntity/include/dtEntity/systeminterface.h new file mode 100644 index 000000000..f132d9979 --- /dev/null +++ b/external/dtEntity/include/dtEntity/systeminterface.h @@ -0,0 +1,116 @@ +#pragma once + +/* -*-c++-*- + * dtEntity Game and Simulation Engine + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Martin Scheffler + */ + +#include + +namespace dtEntity +{ + #if defined(_MSC_VER) + typedef __int64 Timer_t; + #else + typedef unsigned long long Timer_t; + #endif + + class SystemInterface + { + public: + + virtual ~SystemInterface() {} + + /** + * Send tick messages to main message pump, also emit + * all queued messages + */ + virtual void EmitTickMessagesAndQueuedMessages() = 0; + + /** + * Send PostUpdateMessage to main message pump + */ + virtual void EmitPostUpdateMessage() = 0; + + /** + * Get simulation time delta since last tick in seconds + */ + virtual float GetDeltaSimTime() const = 0; + + /** + * Get real time delta since last tick in seconds + */ + virtual float GetDeltaRealTime() const = 0; + + /** + * Get scaling value from real time to simulation time + */ + virtual float GetTimeScale() const = 0; + + /** + * Set scaling value from real time to simulation time. + * A value of 2 means simulation runs twice as fast as real time + * Causes a TimeChangedMessage to be sent + */ + virtual void SetTimeScale(float) = 0; + + /** + * Get number of seconds since start of simulation + */ + virtual double GetSimulationTime() const = 0; + + /** + * Set number of seconds since start of simulation + * Causes a TimeChangedMessage to be sent + */ + virtual void SetSimulationTime(double) = 0; + + + /** + * Number of microseconds since 1.1.1970 + * Causes a TimeChangedMessage to be sent + */ + virtual void SetSimulationClockTime(Timer_t) = 0; + + /** + * Get number of microseconds since 1/1/1970 + */ + virtual Timer_t GetSimulationClockTime() const = 0; + + /** + * Get current system time in number of microseconds since 1/1/1970 + */ + virtual Timer_t GetRealClockTime() = 0; + + /** + * Get absolute path from a relative file path. + * Returns empty string if file is not found + */ + virtual std::string FindDataFile(const std::string& filename) = 0; + + /** + * return true if a file exists + */ + virtual bool FileExists(const std::string& filename) = 0; + + virtual int GetArgC() = 0; + virtual const char** GetArgV() = 0; + + }; + +} diff --git a/external/dtEntity/include/dtEntity/systemmessages.h b/external/dtEntity/include/dtEntity/systemmessages.h new file mode 100644 index 000000000..8765ac26e --- /dev/null +++ b/external/dtEntity/include/dtEntity/systemmessages.h @@ -0,0 +1,994 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include + +namespace dtEntity +{ + + /** + * These messages are sent by dtEntity subsystems like map or application. User code can + * register itself to these messages and react to them. In most cases, user code should not have + * to send + * these messages. + */ + + //////////////////////////////////////////////////////////////////////////////// + class MessageFactory; + + /** + * Adds all messages to message factory + */ + void DT_ENTITY_EXPORT RegisterSystemMessages(MessageFactory&); + + //////////////////////////////////////////////////////////////////////////////// + /** + * Tick message gets sent each frame by the system. + * Register for this message if you want to continually update something. + * Messages in the message queue are posted after the tick message + */ + class DT_ENTITY_EXPORT TickMessage + : public Message + { + public: + + // type identifier of this message class + static const MessageType TYPE; + + // string identifiers for parameter names + static const StringId DeltaSimTimeId; + static const StringId DeltaRealTimeId; + static const StringId SimTimeScaleId; + static const StringId SimulationTimeId; + + // Constructor + TickMessage(); + TickMessage(MessageType t); + + // Create a copy of this message on the heap + virtual Message* Clone() const { return CloneContainer(); } + + // getters (you could do GetFloat(TickMessage::DeltaSimTimeId) instead) + float GetDeltaSimTime() const { return mDeltaSimTime.Get(); } + float GetDeltaRealTime() const { return mDeltaRealTime.Get(); } + float GetSimTimeScale() const { return mSimTimeScale.Get(); } + double GetSimulationTime() const { return mSimulationTime.Get(); } + + void SetDeltaSimTime(float v) { mDeltaSimTime.Set(v); } + void SetDeltaRealTime(float v) { mDeltaRealTime.Set(v); } + void SetSimTimeScale(float v) { mSimTimeScale.Set(v); } + void SetSimulationTime(double v) { mSimulationTime.Set(v); } + + private: + + FloatProperty mDeltaSimTime; + FloatProperty mDeltaRealTime; + FloatProperty mSimTimeScale; + DoubleProperty mSimulationTime; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * This message gets sent when a camera component is created. + */ + class DT_ENTITY_EXPORT CameraAddedMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId AboutEntityId; + static const StringId ContextIdId; + + CameraAddedMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + EntityId GetAboutEntityId() const { return mAboutEntityId.Get(); } + void SetAboutEntityId(EntityId id) { mAboutEntityId.Set(id); } + + void SetContextId(unsigned int v) { mContextId.Set(v); } + unsigned int GetContextId() const { return mContextId.Get(); } + + private: + + UIntProperty mAboutEntityId; + dtEntity::UIntProperty mContextId; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * This message gets sent when a camera component is deleted. + */ + class DT_ENTITY_EXPORT CameraRemovedMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId AboutEntityId; + CameraRemovedMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + EntityId GetAboutEntityId() const { return mAboutEntityId.Get(); } + void SetAboutEntityId(EntityId id) { mAboutEntityId.Set(id); } + + private: + + UIntProperty mAboutEntityId; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Is sent when a window is to be closed, triggered by WindowManager::CloseWindow. + * used internally to asynchronously close window + */ + class DT_ENTITY_EXPORT InternalCloseWindowMessage + : public Message + { + public: + + // type identifier of this message class + static const MessageType TYPE; + static const StringId NameId; + + InternalCloseWindowMessage(); + + // Create a copy of this message on the heap + virtual dtEntity::Message* Clone() const { return CloneContainer(); } + + void SetName(const std::string& v) { mName.Set(v); } + std::string GetName() const { return mName.Get(); } + + private: + dtEntity::StringProperty mName; + + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * EndOfFrameMessage gets sent after TickMessage and after messages in + * the message queue are emitted. + */ + class DT_ENTITY_EXPORT EndOfFrameMessage + : public TickMessage + { + public: + static const MessageType TYPE; + + EndOfFrameMessage(); + virtual Message* Clone() const { return CloneContainer(); } + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * PostUpdateMessage gets sent after scene graph update traversal + */ + class DT_ENTITY_EXPORT PostUpdateMessage + : public TickMessage + { + public: + static const MessageType TYPE; + + PostUpdateMessage(); + virtual Message* Clone() const { return CloneContainer(); } + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * This message gets sent when the method EntityManager::AddToScene method is + * called. The layer system reacts to this message by attaching the entity to the scene + * graph. + */ + class DT_ENTITY_EXPORT EntityAddedToSceneMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId AboutEntityId; + static const StringId EntityNameId; + static const StringId UniqueIdId; + static const StringId MapNameId; + static const StringId VisibleInEntityListId; + + EntityAddedToSceneMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + EntityId GetAboutEntityId() const { return mAboutEntityId.Get(); } + void SetAboutEntityId(EntityId id) { mAboutEntityId.Set(id); } + + std::string GetEntityName() const { return mEntityName.Get(); } + void SetEntityName(const std::string& v) { mEntityName.Set(v); } + + std::string GetUniqueId() const { return mUniqueId.Get(); } + void SetUniqueId(const std::string& v) { mUniqueId.Set(v); } + + std::string GetMapName() const { return mMapName.Get(); } + void SetMapName(const std::string& v) { mMapName.Set(v); } + + bool GetVisibleInEntityList() const { return mVisibleInEntityList.Get(); } + void SetVisibleInEntityList(bool v) { mVisibleInEntityList.Set(v); } + + private: + + UIntProperty mAboutEntityId; + StringProperty mEntityName; + StringProperty mUniqueId; + StringProperty mMapName; + BoolProperty mVisibleInEntityList; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Is sent when an entity was removed from the selection + */ + class DT_ENTITY_EXPORT EntityDeselectedMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId AboutEntityId; + + EntityDeselectedMessage(); + + // Create a copy of this message on the heap + virtual Message* Clone() const { return CloneContainer(); } + + void SetAboutEntityId(EntityId id) { mAboutEntity.Set(id); } + EntityId GetAboutEntityId() const { return mAboutEntity.Get(); } + + private: + + UIntProperty mAboutEntity; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Is sent when name or unique id of entity is changed + */ + class DT_ENTITY_EXPORT EntityNameUpdatedMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId AboutEntityId; + static const StringId EntityNameId; + static const StringId UniqueIdId; + + EntityNameUpdatedMessage(); + + // Create a copy of this message on the heap + virtual Message* Clone() const { return CloneContainer(); } + + void SetAboutEntityId(EntityId id) { mAboutEntity.Set(id); } + EntityId GetAboutEntityId() const { return mAboutEntity.Get(); } + + void SetEntityName(const std::string& v) { mEntityName.Set(v); } + std::string GetEntityName() const { return mEntityName.Get(); } + + void SetUniqueId(const std::string& v) { mUniqueId.Set(v); } + std::string GetUniqueId() const { return mUniqueId.Get(); } + + private: + + UIntProperty mAboutEntity; + StringProperty mEntityName; + StringProperty mUniqueId; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * This message gets sent when the method EntityManager::RemoveFromScene method is + * called. The layer system reacts to this message by removing the entity from the scene + * graph. + */ + class DT_ENTITY_EXPORT EntityRemovedFromSceneMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId AboutEntityId; + static const StringId EntityNameId; + static const StringId UniqueIdId; + static const StringId MapNameId; + static const StringId VisibleInEntityListId; + + EntityRemovedFromSceneMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + EntityId GetAboutEntityId() const { return mAboutEntityId.Get(); } + void SetAboutEntityId(EntityId id) { mAboutEntityId.Set(id); } + + std::string GetEntityName() const { return mEntityName.Get(); } + void SetEntityName(const std::string& v) { mEntityName.Set(v); } + + std::string GetUniqueId() const { return mUniqueId.Get(); } + void SetUniqueId(const std::string& v) { mUniqueId.Set(v); } + + std::string GetMapName() const { return mMapName.Get(); } + void SetMapName(const std::string& v) { mMapName.Set(v); } + + bool GetVisibleInEntityList() const { return mVisibleInEntityList.Get(); } + void SetVisibleInEntityList(bool v) { mVisibleInEntityList.Set(v); } + + private: + + UIntProperty mAboutEntityId; + StringProperty mEntityName; + StringProperty mUniqueId; + StringProperty mMapName; + BoolProperty mVisibleInEntityList; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Is sent when an entity was added to the selection + */ + class DT_ENTITY_EXPORT EntitySelectedMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId AboutEntityId; + + EntitySelectedMessage(); + + // Create a copy of this message on the heap + virtual Message* Clone() const { return CloneContainer(); } + + void SetAboutEntityId(EntityId id) { mAboutEntity.Set(id); } + EntityId GetAboutEntityId() const { return mAboutEntity.Get(); } + + private: + + UIntProperty mAboutEntity; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Is sent when an entity was added to the selection + */ + class DT_ENTITY_EXPORT EntitySpawnedMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId AboutEntityId; + static const StringId SpawnerNameId; + + EntitySpawnedMessage(); + + // Create a copy of this message on the heap + virtual Message* Clone() const { return CloneContainer(); } + + void SetAboutEntityId(EntityId id) { mAboutEntity.Set(id); } + EntityId GetAboutEntityId() const { return mAboutEntity.Get(); } + + void SetSpawnerName(const std::string& name) { mSpawnerName.Set(name); } + std::string GetSpawnerName() const { return mSpawnerName.Get(); } + + private: + + UIntProperty mAboutEntity; + StringProperty mSpawnerName; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Gets sent when an entity system is added to the entity manager. + */ + class DT_ENTITY_EXPORT EntitySystemAddedMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId ComponentTypeId; + static const StringId ComponentTypeStringId; + + EntitySystemAddedMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + StringId GetComponentType() const { return mComponentType.Get(); } + void SetComponentType(StringId v) { mComponentType.Set(v); } + + std::string GetComponentTypeString() const { return mComponentTypeString.Get(); } + void SetComponentTypeString(const std::string& v) { mComponentTypeString.Set(v); } + + private: + + StringIdProperty mComponentType; + StringProperty mComponentTypeString; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Gets sent when an entity system is removed from the entity manager. + */ + class DT_ENTITY_EXPORT EntitySystemRemovedMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId ComponentTypeId; + static const StringId ComponentTypeStringId; + + EntitySystemRemovedMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + StringId GetComponentType() const { return mComponentType.Get(); } + void SetComponentType(StringId v) { mComponentType.Set(v); } + + std::string GetComponentTypeString() const { return mComponentTypeString.Get(); } + void SetComponentTypeString(const std::string& v) { mComponentTypeString.Set(v); } + + private: + + StringIdProperty mComponentType; + StringProperty mComponentTypeString; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Is sent when name or unique id of entity is changed + */ + class DT_ENTITY_EXPORT EntityVelocityNotNullMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId AboutEntityId; + static const StringId IsNullId; + + EntityVelocityNotNullMessage(); + + // Create a copy of this message on the heap + virtual Message* Clone() const { return CloneContainer(); } + + void SetAboutEntityId(EntityId id) { mAboutEntity.Set(id); } + EntityId GetAboutEntityId() const { return mAboutEntity.Get(); } + + void SetIsNull(bool v) { mIsNull.Set(v); } + bool GetIsNull() const { return mIsNull.Get(); } + + private: + + UIntProperty mAboutEntity; + BoolProperty mIsNull; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Gets sent before a map is loaded + */ + class DT_ENTITY_EXPORT MapBeginLoadMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId MapPathId; + static const StringId DataPathId; + static const StringId SaveOrderId; + + MapBeginLoadMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + std::string GetMapPath() const { return mMapPath.Get(); } + void SetMapPath(const std::string& v){ mMapPath.Set(v); } + + std::string GetDataPath() const { return mDataPath.Get(); } + void SetDataPath(const std::string& v){ mDataPath.Set(v); } + + unsigned int GetSaveOrder() const { return mSaveOrder.Get(); } + void SetSaveOrder(unsigned int v){ mSaveOrder.Set(v); } + + private: + + StringProperty mMapPath; + StringProperty mDataPath; + UIntProperty mSaveOrder; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Gets sent when a map is about to be unloaded + */ + class DT_ENTITY_EXPORT MapBeginUnloadMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId MapPathId; + + MapBeginUnloadMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + std::string GetMapPath() const { return mMapPath.Get(); } + void SetMapPath(const std::string& v){ mMapPath.Set(v); } + + private: + + StringProperty mMapPath; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Gets sent when a map was loaded + */ + class DT_ENTITY_EXPORT MapLoadedMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId MapPathId; + static const StringId DataPathId; + static const StringId SaveOrderId; + + MapLoadedMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + std::string GetMapPath() const { return mMapPath.Get(); } + void SetMapPath(const std::string& v){ mMapPath.Set(v); } + + std::string GetDataPath() const { return mDataPath.Get(); } + void SetDataPath(const std::string& v){ mDataPath.Set(v); } + + unsigned int GetSaveOrder() const { return mSaveOrder.Get(); } + void SetSaveOrder(unsigned int v){ mSaveOrder.Set(v); } + + private: + + StringProperty mMapPath; + StringProperty mDataPath; + UIntProperty mSaveOrder; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Gets sent when a map was unloaded + */ + class DT_ENTITY_EXPORT MapUnloadedMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId MapPathId; + + MapUnloadedMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + std::string GetMapPath() const { return mMapPath.Get(); } + void SetMapPath(const std::string& v){ mMapPath.Set(v); } + + private: + + StringProperty mMapPath; + }; + + //////////////////////////////////////////////////////////////////////////////// + + /** + * Emitted when mesh of an entity is changed. + */ + class DT_ENTITY_EXPORT MeshChangedMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId AboutEntityId; + static const StringId FilePathId; + + MeshChangedMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + EntityId GetAboutEntityId() const { return mAboutEntityId.Get(); } + void SetAboutEntityId(EntityId id) { mAboutEntityId.Set(id); } + + std::string GetFilePath() const { return mFilePath.Get(); } + void SetFilePath(const std::string& id) { mFilePath.Set(id); } + + private: + + UIntProperty mAboutEntityId; + StringProperty mFilePath; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Is sent when a watched resource was changed on disk + */ + class DT_ENTITY_EXPORT ResourceChangedMessage + : public Message + { + public: + + // type identifier of this message class + static const MessageType TYPE; + static const StringId PathId; + + ResourceChangedMessage(); + + // Create a copy of this message on the heap + virtual dtEntity::Message* Clone() const { return CloneContainer(); } + + void SetPath(const std::string& v) { mPath.Set(v); } + std::string GetPath() const { return mPath.Get(); } + + private: + dtEntity::StringProperty mPath; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Is sent when a watched resource was changed on disk + */ + class DT_ENTITY_EXPORT ResourceLoadedMessage + : public Message + { + public: + + // type identifier of this message class + static const MessageType TYPE; + static const StringId PathId; + + ResourceLoadedMessage(); + + // Create a copy of this message on the heap + virtual dtEntity::Message* Clone() const { return CloneContainer(); } + + void SetPath(const std::string& v) { mPath.Set(v); } + std::string GetPath() const { return mPath.Get(); } + + private: + dtEntity::StringProperty mPath; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Gets sent when a scene was loaded + */ + class DT_ENTITY_EXPORT SceneLoadedMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId SceneNameId; + + SceneLoadedMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + std::string GetSceneName() const { return mSceneName.Get(); } + void SetSceneName(const std::string& v){ mSceneName.Set(v); } + + private: + + StringProperty mSceneName; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Gets sent when a scene was unloaded + */ + class DT_ENTITY_EXPORT SceneUnloadedMessage + : public Message + { + public: + + static const MessageType TYPE; + SceneUnloadedMessage(); + virtual Message* Clone() const { return CloneContainer(); } + + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Gets sent when a spawner was added to the map system + */ + class DT_ENTITY_EXPORT SpawnerAddedMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId MapNameId; + static const StringId NameId; + static const StringId ParentNameId; + + SpawnerAddedMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + std::string GetMapName() const { return mMapName.Get(); } + void SetMapName(const std::string& v){ mMapName.Set(v); } + + std::string GetName() const { return mName.Get(); } + void SetName(const std::string& v){ mName.Set(v); } + + std::string GetParentName() const { return mParentName.Get(); } + void SetParentName(const std::string& v){ mParentName.Set(v); } + + private: + + StringProperty mName; + StringProperty mParentName; + StringProperty mMapName; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Gets sent when a spawner was modified + */ + class DT_ENTITY_EXPORT SpawnerModifiedMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId OldCategoryId; + static const StringId NewCategoryId; + static const StringId NameId; + static const StringId MapNameId; + + SpawnerModifiedMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + std::string GetName() const { return mName.Get(); } + void SetName(const std::string& v){ mName.Set(v); } + + std::string GetMapName() const { return mMapName.Get(); } + void SetMapName(const std::string& v){ mMapName.Set(v); } + + std::string GetOldCategory() const { return mOldCategory.Get(); } + void SetOldCategory(const std::string& v){ mOldCategory.Set(v); } + + std::string GetNewCategory() const { return mNewCategory.Get(); } + void SetNewCategory(const std::string& v){ mNewCategory.Set(v); } + + private: + + StringProperty mName; + StringProperty mMapName; + StringProperty mOldCategory; + StringProperty mNewCategory; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Gets sent when a spawner was removed from the map system + */ + class DT_ENTITY_EXPORT SpawnerRemovedMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId MapNameId; + static const StringId NameId; + static const StringId CategoryId; + + SpawnerRemovedMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + std::string GetMapName() const { return mMapName.Get(); } + void SetMapName(const std::string& v){ mMapName.Set(v); } + + std::string GetName() const { return mName.Get(); } + void SetName(const std::string& v){ mName.Set(v); } + + std::string GetCategory() const { return mCategory.Get(); } + void SetCategory(const std::string& v){ mCategory.Set(v); } + + private: + + StringProperty mName; + StringProperty mMapName; + StringProperty mCategory; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Is sent when entering simulation loop + */ + class DT_ENTITY_EXPORT StartSystemMessage + : public Message + { + public: + + static const MessageType TYPE; + + StartSystemMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Is sent when entering simulation loop + */ + class DT_ENTITY_EXPORT StopSystemMessage + : public Message + { + public: + + static const MessageType TYPE; + + StopSystemMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Is sent when the EntityManager::ChangeTimeSettings method is called. + */ + class DT_ENTITY_EXPORT TimeChangedMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId SimulationTimeId; + static const StringId SimulationClockTimeId; + static const StringId TimeScaleId; + + TimeChangedMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + float GetTimeScale() const { return mTimeScale.Get(); } + void SetTimeScale(float v) { mTimeScale.Set(v); } + + osg::Timer_t GetSimulationClockTime() const { return mSimulationClockTime; } + void SetSimulationClockTime(osg::Timer_t v) { mSimulationClockTime = v; } + + double GetSimulationTime() const { return mSimulationTime.Get(); } + void SetSimulationTime(double v) { mSimulationTime.Set(v); } + + private: + + DoubleProperty mSimulationTime; + osg::Timer_t mSimulationClockTime; + FloatProperty mTimeScale; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Emitted when entity is shown/hidden + */ + class DT_ENTITY_EXPORT VisibilityChangedMessage + : public Message + { + public: + + static const MessageType TYPE; + static const StringId AboutEntityId; + static const StringId VisibleId; + + VisibilityChangedMessage(); + + virtual Message* Clone() const { return CloneContainer(); } + + EntityId GetAboutEntityId() const { return mAboutEntityId.Get(); } + void SetAboutEntityId(EntityId id) { mAboutEntityId.Set(id); } + + bool GetVisible() const { return mVisible.Get(); } + void SetVisible(bool v) { mVisible.Set(v); } + + private: + + UIntProperty mAboutEntityId; + BoolProperty mVisible; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Is sent when a window was opened with WindowManager::OpenWindow + */ + class DT_ENTITY_EXPORT WindowCreatedMessage + : public Message + { + public: + + // type identifier of this message class + static const MessageType TYPE; + static const StringId NameId; + static const StringId ContextIdId; + static const StringId CameraEntityIdId; + + WindowCreatedMessage(); + + // Create a copy of this message on the heap + virtual dtEntity::Message* Clone() const { return CloneContainer(); } + + void SetName(const std::string& v) { mName.Set(v); } + std::string GetName() const { return mName.Get(); } + + void SetContextId(unsigned int v) { mContextId.Set(v); } + unsigned int GetContextId() const { return mContextId.Get(); } + + void SetCameraEntityId(unsigned int v) { mCameraEntityId.Set(v); } + unsigned int GetCameraEntityId() const { return mCameraEntityId.Get(); } + + private: + dtEntity::StringProperty mName; + dtEntity::UIntProperty mContextId; + dtEntity::UIntProperty mCameraEntityId; + }; + + //////////////////////////////////////////////////////////////////////////////// + /** + * Is sent when a window was closed + */ + class DT_ENTITY_EXPORT WindowClosedMessage + : public Message + { + public: + + // type identifier of this message class + static const MessageType TYPE; + static const StringId NameId; + + WindowClosedMessage(); + + // Create a copy of this message on the heap + virtual dtEntity::Message* Clone() const { return CloneContainer(); } + + void SetName(const std::string& v) { mName.Set(v); } + std::string GetName() const { return mName.Get(); } + + private: + dtEntity::StringProperty mName; + }; + +} diff --git a/external/dtEntity/include/dtEntity/threadsafequeue.h b/external/dtEntity/include/dtEntity/threadsafequeue.h new file mode 100644 index 000000000..97655887b --- /dev/null +++ b/external/dtEntity/include/dtEntity/threadsafequeue.h @@ -0,0 +1,82 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include + +namespace dtEntity +{ + /** + * A queue with thread safe push and pop methods + */ + template + class ThreadSafeQueue + { + public: + + void Push(T t); + bool Empty(); + T Pop(); + unsigned int GetSize(); + + private: + + OpenThreads::Mutex mQueueMutex; + std::queue mQueue; + }; + + + ////////////////////////////////////////// + + + template + void ThreadSafeQueue::Push(T t) + { + OpenThreads::ScopedLock lock(mQueueMutex); + mQueue.push(t); + } + + template + bool ThreadSafeQueue::Empty() + { + OpenThreads::ScopedLock lock(mQueueMutex); + return mQueue.empty(); + } + + template + T ThreadSafeQueue::Pop() + { + OpenThreads::ScopedLock lock(mQueueMutex); + if(mQueue.empty()) return T(); + T t = mQueue.front(); + mQueue.pop(); + return t; + } + + template + unsigned int ThreadSafeQueue::GetSize() + { + OpenThreads::ScopedLock lock(mQueueMutex); + return mQueue.size(); + } +} diff --git a/external/dtEntity/include/dtEntity/uniqueid.h b/external/dtEntity/include/dtEntity/uniqueid.h new file mode 100644 index 000000000..583b3aa2b --- /dev/null +++ b/external/dtEntity/include/dtEntity/uniqueid.h @@ -0,0 +1,30 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include + +#include + +namespace dtEntity +{ + std::string DT_ENTITY_EXPORT CreateUniqueIdString(); +} diff --git a/external/dtEntity/include/dtEntity/windowinterface.h b/external/dtEntity/include/dtEntity/windowinterface.h new file mode 100644 index 000000000..ec0c5b6b0 --- /dev/null +++ b/external/dtEntity/include/dtEntity/windowinterface.h @@ -0,0 +1,124 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include + +namespace dtEntity +{ + //////////////////////////////////////////////////////////////////////////////// + class WindowInterface + { + public: + + virtual ~WindowInterface() {} + + /** + * Opens a new window if used viewer is a composite viewer. + * @param name Name of osg nodes for window, view and camera to set + * @param traits OSG GraphicsWindow traits to use + * @contexId will receive context id of newly created context + * @return true if success + */ + virtual bool OpenWindow(const std::string& name, unsigned int& contextId) = 0; + + virtual void CloseWindow(unsigned int contextid) = 0; + + /** + * Get pick ray at given screen position + * @param usePixels if true, use x-y screen coordinates, if false use values from -1 to 1 + */ + virtual Vec3f GetPickRay(unsigned int contextid, float x, float y, bool usePixels = false) const = 0; + + /** + Get window size and position of window with given context id + */ + virtual bool GetWindowGeometry(unsigned int contextid, int& x, int& y, int& width, int& height) const = 0; + + /** + Set window size and position of window with given context id + */ + virtual bool SetWindowGeometry(unsigned int contextid, int x, int y, int width, int height) = 0; + + /** + Should window be displayed at full screen size? + */ + virtual void SetFullscreen(unsigned int contextid, bool fullscreen) = 0; + virtual bool GetFullscreen(unsigned int contextid) const = 0; + + /** + * Return entity id of first intersected entity. + */ + virtual EntityId PickEntity(double x, double y, unsigned int nodemask, + unsigned int contextid, bool usePixels = true) const = 0; + + /** + * Show or hide cursor when it is above this window? + */ + virtual void SetShowCursor(unsigned int contextid, bool) = 0; + + /** + * project world space point into screen coordinates + */ + virtual Vec3d ConvertWorldToScreenCoords(unsigned int contextid, const Vec3d& coord) = 0; + + /** + * Should the window with given context id be continuously redrawn + * or only by request? Default is on + */ + virtual void SetContinuousRedraw(unsigned int contextid, bool) = 0; + + /** + * If Continuous Redraw is off, request a redraw in next render traversal + */ + virtual void RequestRedraw(unsigned int contextid) = 0; + + /** + * Holds intersection info + */ + struct Intersection + { + Vec3d mPosition; + Vec3f mNormal; + EntityId mEntityId; + }; + + typedef std::vector Intersections; + + /** + * Get intersections between start and end and add them to isects vector + * @param start Start of intersection line + * @param end End of intersection lnie + * @param isects Vector return value for isect results + * @param nodemask Bit mask, used for selecting nodes for intersection + * @param layer Name of layer attach point component from which intersecition test will + * be executed downwards (default: layer "default") + * @return true if an intersection was found + */ + virtual bool GetIntersections(const Vec3d& start, const Vec3d& end, + std::vector& isects, + unsigned int nodemask = NodeMasks::PICKABLE | NodeMasks::TERRAIN, + dtEntity::StringId layer = dtEntity::StringId() + ) const = 0; + + }; + +} diff --git a/external/dtEntity/include/dtEntityOSG/cameracomponent.h b/external/dtEntity/include/dtEntityOSG/cameracomponent.h new file mode 100644 index 000000000..e1e750569 --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/cameracomponent.h @@ -0,0 +1,255 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include + +namespace osg +{ + class Group; + class Camera; +} + +namespace dtEntityOSG +{ + /** + * The camera component holds properties for the osg::Camera object + */ + class DTENTITY_OSG_EXPORT CameraComponent + : public TransformComponent + { + + typedef TransformComponent BaseClass; + + public: + + static const dtEntity::ComponentType TYPE; + static const dtEntity::StringId ContextIdId; + static const dtEntity::StringId LayerAttachPointId; + + static const dtEntity::StringId CullingModeId; + static const dtEntity::StringId CullMaskId; + static const dtEntity::StringId NoAutoNearFarCullingId; + static const dtEntity::StringId BoundingVolumeNearFarCullingId; + static const dtEntity::StringId PrimitiveNearFarCullingId; + static const dtEntity::StringId FieldOfViewId; + static const dtEntity::StringId AspectRatioId; + static const dtEntity::StringId NearClipId; + static const dtEntity::StringId FarClipId; + static const dtEntity::StringId LODScaleId; + static const dtEntity::StringId ClearColorId; + static const dtEntity::StringId PositionId; + static const dtEntity::StringId EyeDirectionId; + static const dtEntity::StringId UpId; + + static const dtEntity::StringId OrthoLeftId; + static const dtEntity::StringId OrthoRightId; + static const dtEntity::StringId OrthoTopId; + static const dtEntity::StringId OrthoBottomId; + static const dtEntity::StringId OrthoZNearId; + static const dtEntity::StringId OrthoZFarId; + + static const dtEntity::StringId ProjectionModeId; + static const dtEntity::StringId ModePerspectiveId; + static const dtEntity::StringId ModeOrthoId; + + CameraComponent(); + + virtual ~CameraComponent(); + + virtual dtEntity::ComponentType GetType() const + { + return TYPE; + } + + virtual void OnAddedToEntity(dtEntity::Entity& entity); + virtual void OnRemovedFromEntity(dtEntity::Entity& entity); + + osg::Camera* GetCamera() const; + + virtual void Finished(); + + void FetchCamera(); + + void SetContextId(int id); + int GetContextId() const { return mContextIdVal; } + + void SetLayerAttachPoint(dtEntity::StringId id); + dtEntity::StringId GetLayerAttachPoint() const; + + void SetProjectionMode(dtEntity::StringId); + dtEntity::StringId GetProjectionMode() const { return mProjectionModeVal; } + + void SetCullingMode(dtEntity::StringId); + dtEntity::StringId GetCullingMode() const { return mCullingModeVal; } + + /** Set up vector of camera. Call UpdateViewMatrix to apply changes. */ + void SetUp(const osg::Vec3d&); + osg::Vec3d GetUp() const; + + /** Set eye position of camera. Call UpdateViewMatrix to apply changes. */ + void SetPosition(const osg::Vec3d&); + osg::Vec3d GetPosition() const; + + /** Set look direction of camera. Should be a normalized vector! + * Call UpdateViewMatrix to apply changes. + */ + void SetEyeDirection(const osg::Vec3d&); + osg::Vec3d GetEyeDirection() const; + + /** + * Re-calculate osg camera view matrix from up, pos and eye dir vectors + */ + void UpdateViewMatrix(); + + /** + * Re-calculate osg camera projection matrix from mode, near, far etc + */ + void UpdateProjectionMatrix(); + + /** + * Set the osg node mask controlling which nodes are + * visible to the camera. Please see dtEntity/nodemasks.h + */ + void SetCullMask(unsigned int mask); + unsigned int GetCullMask() const; + + void SetClearColor(const osg::Vec4&); + osg::Vec4 GetClearColor() const; + + virtual osg::Vec3d GetTranslation() const { return GetPosition(); } + virtual void SetTranslation(const osg::Vec3d& v) { SetPosition(v); } + + virtual osg::Quat GetRotation() const + { + osg::Quat q; + q.makeRotate(osg::Vec3d(0,1,0), mEyeDirection.Get()); + return q; + } + + virtual void SetRotation(const osg::Quat& q) + { + mEyeDirection.Set(q * osg::Vec3d(0, 1, 0)); + } + + void SetFieldOfView(double v); + double GetFieldOfView() const; + + void SetAspectRatio(double v); + double GetAspectRatio() const; + + void SetNearClip(double v); + double GetNearClip() const; + + void SetFarClip(double v); + double GetFarClip() const; + + void SetLODScale(float v); + float GetLODScale() const; + + void SetOrthoLeft(double v); + double GetOrthoLeft() const; + + void SetOrthoRight(double v); + double GetOrthoRight() const; + + void SetOrthoTop(double v); + double GetOrthoTop() const; + + void SetOrthoBottom(double v); + double GetOrthoBottom() const; + + void SetOrthoZNear(double v); + double GetOrthoZNear() const; + + void SetOrthoZFar(double v); + double GetOrthoZFar() const; + + void TryAssignContext(); + + private: + + + + dtEntity::DynamicIntProperty mContextId; + int mContextIdVal; + dtEntity::DynamicStringIdProperty mLayerAttachPoint; + dtEntity::StringId mLayerAttachPointVal; + + dtEntity::DynamicStringIdProperty mCullingMode; + dtEntity::StringId mCullingModeVal; + dtEntity::DynamicDoubleProperty mFieldOfView; + double mFieldOfViewVal; + dtEntity::DynamicDoubleProperty mAspectRatio; + double mAspectRatioVal; + dtEntity::DynamicDoubleProperty mNearClip; + double mNearClipVal; + dtEntity::DynamicDoubleProperty mFarClip; + double mFarClipVal; + dtEntity::DynamicVec4Property mClearColor; + dtEntity::DynamicFloatProperty mLODScale; + dtEntity::Vec3dProperty mPosition; + dtEntity::Vec3dProperty mUp; + dtEntity::Vec3dProperty mEyeDirection; + dtEntity::DynamicUIntProperty mCullMask; + dtEntity::DynamicStringIdProperty mProjectionMode; + dtEntity::StringId mProjectionModeVal; + + dtEntity::DynamicDoubleProperty mOrthoLeft; + dtEntity::DynamicDoubleProperty mOrthoRight; + dtEntity::DynamicDoubleProperty mOrthoBottom; + dtEntity::DynamicDoubleProperty mOrthoTop; + dtEntity::DynamicDoubleProperty mOrthoZNear; + dtEntity::DynamicDoubleProperty mOrthoZFar; + double mOrthoLeftVal; + double mOrthoRightVal; + double mOrthoBottomVal; + double mOrthoTopVal; + double mOrthoZNearVal; + double mOrthoZFarVal; + + }; + + + //////////////////////////////////////////////////////////////////////////////// + + class DTENTITY_OSG_EXPORT CameraSystem + : public dtEntity::DefaultEntitySystem + { + public: + + static const dtEntity::ComponentType TYPE; + + CameraSystem(dtEntity::EntityManager& em); + ~CameraSystem(); + + dtEntity::EntityId GetCameraEntityByContextId(int id); + + void OnWindowCreated(const dtEntity::Message& msg); + + private: + dtEntity::MessageFunctor mWindowCreatedFunctor; + + }; +} diff --git a/external/dtEntity/include/dtEntityOSG/componentfactories.h b/external/dtEntity/include/dtEntityOSG/componentfactories.h new file mode 100644 index 000000000..352552ae0 --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/componentfactories.h @@ -0,0 +1,34 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include + +namespace dtEntity +{ + class ComponentPluginManager; +} + +namespace dtEntityOSG +{ + + void DTENTITY_OSG_EXPORT RegisterStandardFactories(dtEntity::ComponentPluginManager& pluginManager); +} diff --git a/external/dtEntity/include/dtEntityOSG/dtentityosg_config.h b/external/dtEntity/include/dtEntityOSG/dtentityosg_config.h new file mode 100644 index 000000000..ae328742f --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/dtentityosg_config.h @@ -0,0 +1,6 @@ +#pragma once + +// auto-generated by CMake, do not edit! + +// was osgEphemeris found by cmake? +#define OSGEPHEMERIS_FOUND 0 diff --git a/external/dtEntity/include/dtEntityOSG/export.h b/external/dtEntity/include/dtEntityOSG/export.h new file mode 100644 index 000000000..c5107d3b4 --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/export.h @@ -0,0 +1,31 @@ +#pragma once + +/* +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#if defined(_MSC_VER) || defined(__CYGWIN__) || defined(__MINGW32__) || defined( __BCPLUSPLUS__) || defined( __MWERKS__) +# ifdef DTENTITY_OSG_LIBRARY +# define DTENTITY_OSG_EXPORT __declspec(dllexport) +# else +# define DTENTITY_OSG_EXPORT __declspec(dllimport) +# endif +#else +# define DTENTITY_OSG_EXPORT +#endif diff --git a/external/dtEntity/include/dtEntityOSG/groundclampingcomponent.h b/external/dtEntity/include/dtEntityOSG/groundclampingcomponent.h new file mode 100644 index 000000000..6df095300 --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/groundclampingcomponent.h @@ -0,0 +1,186 @@ +#pragma once + +/* +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace dtEntity +{ + class MapSystem; +} + +namespace dtEntityOSG +{ + + class GroundClampingComponent : public dtEntity::Component + { + typedef dtEntity::Component BaseClass; + + public: + + static const dtEntity::ComponentType TYPE; + static const dtEntity::StringId ClampingModeId; + static const dtEntity::StringId ClampingMode_DisabledId; + static const dtEntity::StringId ClampingMode_KeepAboveTerrainId; + static const dtEntity::StringId ClampingMode_SetHeightToTerrainHeightId; + static const dtEntity::StringId ClampingMode_SetHeightAndRotationToTerrainId; + static const dtEntity::StringId MinDistToCameraId; + static const dtEntity::StringId MinMovementDeltaId; + static const dtEntity::StringId VerticalOffsetId; + + GroundClampingComponent(); + virtual ~GroundClampingComponent(); + + virtual dtEntity::ComponentType GetType() const { return TYPE; } + virtual bool IsInstanceOf(dtEntity::ComponentType id) const + { + return (id == TYPE); + } + + virtual void OnAddedToEntity(dtEntity::Entity& e); + virtual void Finished(); + dtEntityOSG::TransformComponent* GetTransformComponent() const { return mTransformComponent; } + + void SetClampingMode(dtEntity::StringId mode) { mClampingMode.Set(mode); } + dtEntity::StringId GetClampingMode() const { return mClampingMode.Get(); } + + float GetVerticalOffset() const { return mVerticalOffset.Get(); } + void SetVerticalOffset(float v) { mVerticalOffset.Set(v); } + + // for keeping track of intersections when using osgSim HeightAboveTerrain + void SetIntersectIndex(unsigned int i) { mIntersectIndex = i; } + unsigned int GetIntersectIndex() const { return mIntersectIndex; } + + osgUtil::LineSegmentIntersector* GetIntersector() const { return mIntersector.get(); } + void SetIntersector(osgUtil::LineSegmentIntersector* isect) { mIntersector = isect; } + + void SetLastClampedPosition(const osg::Vec3d& p) { mLastClampedPosition = p; } + osg::Vec3d GetLastClampedPosition() const { return mLastClampedPosition; } + + void SetLastClampedAttitude(const osg::Quat& p) { mLastClampedAttitude = p; } + osg::Quat GetLastClampedAttitude() const { return mLastClampedAttitude; } + + void SetLastClampedNormal(const osg::Vec3& p) { mLastClampedNormal = p; } + osg::Vec3 GetLastClampedNormal() const { return mLastClampedNormal; } + + void SetMinDistToCamera(float p) { mMinDistToCamera.Set(p); } + float GetMinDistToCamera() const { return mMinDistToCamera.Get(); } + + void SetMinMovementDelta(float p) { mMinMovementDelta.Set(p); } + float GetMinMovementDelta() const { return mMinMovementDelta.Get(); } + + void SetDirty(bool v) { mDirty = v; } + bool GetDirty() const { return mDirty; } + + private: + + dtEntity::StringIdProperty mClampingMode; + dtEntity::FloatProperty mVerticalOffset; + dtEntity::FloatProperty mMinDistToCamera; + dtEntity::FloatProperty mMinMovementDelta; + + dtEntityOSG::TransformComponent* mTransformComponent; + unsigned int mIntersectIndex; + dtEntity::Entity* mEntity; + osg::ref_ptr mIntersector; + osg::Vec3d mLastClampedPosition; + osg::Vec3d mLastClampedNormal; + + bool mDirty; + osg::Quat mLastClampedAttitude; + + }; + + + //////////////////////////////////////////////////////////////////////////////// + + + class GroundClampingSystem + : public dtEntity::DefaultEntitySystem + , public dtEntity::ScriptAccessor + { + typedef dtEntity::DefaultEntitySystem BaseClass; + + public: + + static const dtEntity::ComponentType TYPE; + static const dtEntity::StringId EnabledId; + static const dtEntity::StringId IntersectLayerId; + static const dtEntity::StringId FetchLODsId; + + GroundClampingSystem(dtEntity::EntityManager& em); + ~GroundClampingSystem(); + + void OnRemoveFromEntityManager(dtEntity::EntityManager& em); + + void Tick(const dtEntity::Message& msg); + void CameraAdded(const dtEntity::Message& msg); + void CameraRemoved(const dtEntity::Message& msg); + void MapLoaded(const dtEntity::Message& msg); + + bool ClampToTerrain(osg::Vec3d& position, int voffset = 10000, unsigned int nodemask = dtEntity::NodeMasks::TERRAIN); + + void SetIntersectLayer(dtEntity::StringId); + dtEntity::StringId GetIntersectLayer() const; + + + virtual bool StorePropertiesToScene() const { return true; } + + void SetEnabled(bool v); + bool GetEnabled() const; + private: + + dtEntity::Property* ScriptGetTerrainHeight(const dtEntity::PropertyArgs& args); + + dtEntityOSG::TransformComponent* GetTransformComp(dtEntity::EntityId eid, GroundClampingComponent* component); + void DirtyAll(); + void HandleIntersection(GroundClampingComponent* component, + const osgUtil::LineSegmentIntersector::Intersection& intersection, float dt, double simTime); + + dtEntity::MessageFunctor mTickFunctor; + dtEntity::MessageFunctor mCameraAddedFunctor; + dtEntity::MessageFunctor mCameraRemovedFunctor; + dtEntity::MessageFunctor mMapLoadedFunctor; + osgUtil::IntersectionVisitor mIntersectionVisitor; + osg::observer_ptr mRootNode; + osg::ref_ptr mIntersectorGroup; + + dtEntity::DynamicBoolProperty mEnabled; + bool mEnabledVal; + dtEntity::DynamicStringIdProperty mIntersectLayer; + dtEntity::StringId mIntersectLayerVal; + dtEntity::BoolProperty mFetchLODs; + + osgSim::LineOfSight mLos; + dtEntityOSG::CameraComponent* mCamera; + + }; +} diff --git a/external/dtEntity/include/dtEntityOSG/groupcomponent.h b/external/dtEntity/include/dtEntityOSG/groupcomponent.h new file mode 100644 index 000000000..0c7f253b6 --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/groupcomponent.h @@ -0,0 +1,105 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include + +namespace osg +{ + class Group; +} + +namespace dtEntityOSG +{ + /** + * Holds a single OSG group. + */ + class DTENTITY_OSG_EXPORT GroupComponent : public NodeComponent + { + public: + + typedef NodeComponent BaseClass; + + static const dtEntity::ComponentType TYPE; + static const dtEntity::StringId ChildrenId; + + /** + * CTor, creates a new group component + */ + GroupComponent(); + + /** + * CTor, uses passed group component + */ + GroupComponent(osg::Group* group); + + virtual ~GroupComponent(); + + virtual dtEntity::ComponentType GetType() const + { + return TYPE; + } + + virtual osg::Group* GetGroup() const; + + // return group to attach children to + virtual osg::Group* GetAttachmentGroup() const { return GetGroup(); } + + bool AddChildComponent(dtEntity::ComponentType c); + bool RemoveChildComponent(dtEntity::ComponentType c); + + /** + * Expects an array of stringid properties containing component types + * of children. These will be attached. + */ + void SetChildren(const dtEntity::PropertyArray& arr); + dtEntity::PropertyArray GetChildren() const { return mChildrenVal.Get(); } + + private: + + // to prevent redundant code in constructors + void Init(); + + dtEntity::DynamicArrayProperty mChildren; + dtEntity::ArrayProperty mChildrenVal; + }; + + + /////////////////////////////////////////////////////////////////////////// + // storage only + class DTENTITY_OSG_EXPORT GroupSystem + : public dtEntity::DefaultEntitySystem + { + public: + GroupSystem(dtEntity::EntityManager& em) + : dtEntity::DefaultEntitySystem(em, NodeComponent::TYPE) + { + + } + }; + + +} diff --git a/external/dtEntity/include/dtEntityOSG/initosgviewer.h b/external/dtEntity/include/dtEntityOSG/initosgviewer.h new file mode 100644 index 000000000..9671079ce --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/initosgviewer.h @@ -0,0 +1,78 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include + +namespace osg +{ + class Group; +} + +namespace osgViewer +{ + class ViewerBase; +} + +namespace dtEntity +{ + class EntityManager; +} + +namespace dtEntityOSG +{ + + /** + * Convenience setup function for dtEntity. + * If you want to do fancy stuff in your setup then maybe you should not call this, instead write your own! + * + * Installs a log handler, calls SetupDataPaths(), calls InitDtEntity(), calls SetupViewer(), then calls DoScreenSetup() + * @param argc number of command line args + * @param standard c command line args + * @param viewer An instance of either osgViewer::Viewer or osgViewer::CompositeViewer + * @param em a valid entity manager + * @param addStatsHandler Should osg stats handler be installed (activated with key insert) + * @param checkPaths Should SetupDataPaths complain about missing paths + * @param addConsoleLog Should log messages be output to console + * @param pSceneNode An osg group that is used as scene graph root node. This is added as scene node to the main scene, also + * the main update callback that drives dtEntity is installed to this node. If this is NULL, a new osg::Group is created + */ + bool DTENTITY_OSG_EXPORT InitOSGViewer(int argc, char** argv, + osgViewer::ViewerBase& viewer, dtEntity::EntityManager& em, + bool addStatsHandler = true, bool checkPaths = true, bool addConsoleLog = true, osg::Group* pSceneNode = 0); + + + /** + * Sets scene graph root node and adds callbacks + * @param viewer An instance of either osgViewer::Viewer or osgViewer::CompositeViewer + * @param pSceneNode An osg group that is used as scene graph root node. This is added as scene node to the main scene, also + * the main update callback that drives dtEntity is installed to this node. + */ + void DTENTITY_OSG_EXPORT SetupSceneGraph(osgViewer::ViewerBase& viewer, dtEntity::EntityManager& em, osg::Group* pSceneNode); + + + /** + * analyze command line and open OSG window with correct traits + * @return true if success + */ + bool DTENTITY_OSG_EXPORT DoScreenSetup(int argc, char** argv, osgViewer::ViewerBase& viewer, dtEntity::EntityManager& em); +} diff --git a/external/dtEntity/include/dtEntityOSG/layerattachpointcomponent.h b/external/dtEntity/include/dtEntityOSG/layerattachpointcomponent.h new file mode 100644 index 000000000..c43724e49 --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/layerattachpointcomponent.h @@ -0,0 +1,128 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include +#include + +namespace dtEntityOSG +{ + + class DTENTITY_OSG_EXPORT LayerAttachPointComponent + : public GroupComponent + { + typedef GroupComponent BaseClass; + + public: + + static const dtEntity::ComponentType TYPE; + static const dtEntity::StringId NameId; + + LayerAttachPointComponent(); + virtual ~LayerAttachPointComponent(); + virtual void Finished(); + void OnAddedToEntity(dtEntity::Entity& entity); + void OnRemovedFromEntity(dtEntity::Entity& entity); + + /** + * Set osg group node that will hold layer component nodes + * as children. When this is set, all layer components are + * traversed and their nodes are attached to this group node + * if the layer name fits + */ + virtual void SetNode(osg::Group* node); + + + /** + * Get name SID identifying this layer attach point + */ + dtEntity::StringId GetName() const { return mName.Get(); } + + /** + * Set name SID identifying this layer attach point. + * When the name is changed all layer components are + * traversed and their nodes are attached to this group node + * if the layer name fits + */ + void SetName(dtEntity::StringId name); + + virtual dtEntity::ComponentType GetType() const + { + return TYPE; + } + + private: + dtEntity::EntityManager* mEntityManager; + dtEntity::StringIdProperty mName; + dtEntity::StringId mCurrentName; + }; + + + //////////////////////////////////////////////////////////////////////////////// + + class DTENTITY_OSG_EXPORT LayerAttachPointSystem + : public dtEntity::DefaultEntitySystem + , public dtEntity::ScriptAccessor + { + friend class LayerAttachPointComponent; + + typedef dtEntity::DefaultEntitySystem BaseClass; + + public: + + static const dtEntity::ComponentType TYPE; + static const dtEntity::StringId DefaultLayerId; + static const dtEntity::StringId RootId; + + LayerAttachPointSystem(dtEntity::EntityManager& em); + + virtual bool DeleteComponent(dtEntity::EntityId eid); + + bool GetByName(dtEntity::StringId name, LayerAttachPointComponent*& recipient); + + LayerAttachPointComponent* GetDefaultLayer(); + LayerAttachPointComponent* GetRootLayer(); + + osg::Group* GetSceneGraphRoot() + { + return mSceneGraphRoot.get(); + } + + void CreateSceneGraphRootEntity(osg::Group* root); + + dtEntity::Property* ScriptGetByName(const dtEntity::PropertyArgs& args); + + private: + + void RegisterByName(dtEntity::StringId, LayerAttachPointComponent*); + typedef std::map LayerByNameMap; + LayerByNameMap mLayerByNameMap; + osg::ref_ptr mSceneGraphRoot; + dtEntity::EntityId mBaseEntityId; + }; + + +} diff --git a/external/dtEntity/include/dtEntityOSG/layercomponent.h b/external/dtEntity/include/dtEntityOSG/layercomponent.h new file mode 100644 index 000000000..8a2c6b9ee --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/layercomponent.h @@ -0,0 +1,198 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include + +namespace dtEntityOSG +{ + + class LayerAttachPointComponent; + //////////////////////////////////////////////////////////////////////////////// + + struct EntityData : public osg::Referenced + { + dtEntity::Entity* mEntity; + EntityData(dtEntity::Entity* e) + : mEntity(e) + { + } + }; + + /** + * Each visible entity has to have a layer component. The layer component + * defines which node component of the entity is attached to which layer. + */ + class DTENTITY_OSG_EXPORT LayerComponent + : public dtEntity::Component + { + + friend class LayerSystem; + + public: + + static const dtEntity::ComponentType TYPE; + static const dtEntity::StringId LayerId; + static const dtEntity::StringId AttachedComponentId; + static const dtEntity::StringId VisibleId; + + LayerComponent(); + virtual ~LayerComponent(); + + virtual dtEntity::ComponentType GetType() const + { + return TYPE; + } + + /** + * The attached component is the component that should be attached + * to the layer. A component with this type has to be present on + * the entity and it has to derive from NodeComponent. + */ + void SetAttachedComponent(dtEntity::ComponentType ctype); + dtEntity::ComponentType GetAttachedComponent() const; + + virtual void OnAddedToEntity(dtEntity::Entity &entity); + + void OnAddedToScene(); + void OnRemovedFromScene(); + + /** + * Attach the entity to the layer with this name. Default value is DefaultLayerId + */ + dtEntity::StringId GetLayer() const; + void SetLayer(dtEntity::StringId); + + /** + * Is the AttachedComponent currently attached to the layer node? + */ + bool IsVisible() const; + + /** + * Set to false to detach AttachedComponent from the layer node. + * Re-attach by setting to true. + */ + void SetVisible(bool); + + /** + * Is the entity already added to scene? Can be used to query current initialization status + */ + bool IsAddedToScene() const { return mAddedToScene; } + + /** + * Get OSG node of attached component + */ + osg::Node* GetAttachedComponentNode() const; + + /** + * @return bool if geometry is attached to layer component + */ + bool GetBoundingBox(dtEntity::Vec3d& min, dtEntity::Vec3d& max); + + /** + * Add attached component node to layer as a child in the scene graph hierarchy + */ + bool Attach(LayerAttachPointComponent* current); + + /** + * Add attached component node to layer as a child in the scene graph hierarchy + */ + bool Detach(LayerAttachPointComponent* current); + + private: + + // is there an attach point, a component to attach and added to scene? + bool CanAttach(); + dtEntity::Entity* mEntity; + dtEntity::DynamicBoolProperty mVisible; + bool mVisibleVal; + dtEntity::DynamicStringIdProperty mLayer; + dtEntity::StringId mLayerVal; + dtEntity::DynamicStringIdProperty mAttachedComponent; + dtEntity::StringId mAttachedComponentVal; + bool mAddedToScene; + + }; + + LayerAttachPointComponent* GetAttachPoint(dtEntity::EntityManager& em, dtEntity::StringId name); + + + + //////////////////////////////////////////////////////////////////////////////// + + class DTENTITY_OSG_EXPORT LayerSystem + : public dtEntity::DefaultEntitySystem + , public dtEntity::ScriptAccessor + { + public: + + static const dtEntity::ComponentType TYPE; + + static const dtEntity::StringId VisibilityBitsId; + + LayerSystem(dtEntity::EntityManager& em); + ~LayerSystem(); + + void OnEnterWorld(const dtEntity::Message&); + void OnLeaveWorld(const dtEntity::Message&); + + void AddVisibleBoundingBox(dtEntity::EntityId id); + void RemoveVisibleBoundingBox(dtEntity::EntityId id); + void RemoveAllBoundingBoxes(); + + // set or clear these bits when visibility of component is toggled + void SetVisibilityBits(unsigned int bits) { mVisibilityBits.Set(bits); } + unsigned int GetVisibilityBits() const { return mVisibilityBits.Get(); } + + private: + + dtEntity::Property* ScriptAddVisibleBoundingBox(const dtEntity::PropertyArgs& args) + { + AddVisibleBoundingBox(args[0]->UIntValue()); + return NULL; + } + + dtEntity::Property* ScriptRemoveVisibleBoundingBox(const dtEntity::PropertyArgs& args) + { + RemoveVisibleBoundingBox(args[0]->UIntValue()); + return NULL; + } + + dtEntity::Property* ScriptRemoveAllBoundingBoxes(const dtEntity::PropertyArgs& args) + { + RemoveAllBoundingBoxes(); + return NULL; + } + + dtEntity::Property* ScriptGetBoundingSphere(const dtEntity::PropertyArgs& args); + + dtEntity::MessageFunctor mEnterWorldFunctor; + dtEntity::MessageFunctor mLeaveWorldFunctor; + + dtEntity::UIntProperty mVisibilityBits; + + }; +} diff --git a/external/dtEntity/include/dtEntityOSG/lightcomponent.h b/external/dtEntity/include/dtEntityOSG/lightcomponent.h new file mode 100644 index 000000000..b4b212423 --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/lightcomponent.h @@ -0,0 +1,112 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler + +*/ + +#include +#include +#include +#include +#include +#include + + +namespace osg +{ + class Light; + class LightSource; +} + +namespace dtEntityOSG +{ + + class DTENTITY_OSG_EXPORT LightComponent : public NodeComponent + { + + typedef NodeComponent BaseClass; + + public: + + static const dtEntity::ComponentType TYPE; + + static const dtEntity::StringId LightNumId; + static const dtEntity::StringId PositionId; + static const dtEntity::StringId AmbientId; + static const dtEntity::StringId DiffuseId; + static const dtEntity::StringId SpecularId; + static const dtEntity::StringId SpotCutoffId; + static const dtEntity::StringId SpotExponentId; + static const dtEntity::StringId DirectionId; + static const dtEntity::StringId ConstantAttenuationId; + static const dtEntity::StringId LinearAttenuationId; + static const dtEntity::StringId QuadraticAttenuationId; + + LightComponent(); + virtual ~LightComponent(); + + virtual dtEntity::ComponentType GetType() const { return TYPE; } + + virtual bool IsInstanceOf(dtEntity::ComponentType id) const + { + return (id == TYPE); + } + + osg::Light* GetLight() { return mLight; } + + private: + + osg::Vec4 GetLightPosition() const; + osg::Vec4 GetAmbient() const; + osg::Vec4 GetDiffuse() const; + osg::Vec4 GetSpecular() const; + osg::Vec3 GetDirection() const; + + osg::Light* mLight; + dtEntity::DynamicIntProperty mLightNum; + dtEntity::DynamicVec4Property mAmbient; + dtEntity::DynamicVec4Property mDiffuse; + dtEntity::DynamicVec4Property mSpecular; + dtEntity::DynamicVec4Property mPosition; + dtEntity::DynamicVec3Property mDirection; + dtEntity::DynamicFloatProperty mConstantAttenuation; + dtEntity::DynamicFloatProperty mLinearAttenuation; + dtEntity::DynamicFloatProperty mQuadraticAttenuation; + dtEntity::DynamicFloatProperty mSpotExponent; + dtEntity:: DynamicFloatProperty mSpotCutOff; + }; + + + //////////////////////////////////////////////////////////////////////////// + + class DTENTITY_OSG_EXPORT LightSystem + : public dtEntity::DefaultEntitySystem + { + typedef dtEntity::DefaultEntitySystem BaseClass; + + public: + static const dtEntity::ComponentType TYPE; + + LightSystem(dtEntity::EntityManager& em); + + private: + + }; +} diff --git a/external/dtEntity/include/dtEntityOSG/manipulatorcomponent.h b/external/dtEntity/include/dtEntityOSG/manipulatorcomponent.h new file mode 100644 index 000000000..29ee9b6b8 --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/manipulatorcomponent.h @@ -0,0 +1,153 @@ +#pragma once + +/* +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include + +namespace dtEntityOSG +{ + + class ManipulatorComponent + : public dtEntityOSG::NodeComponent + { + + typedef dtEntityOSG::NodeComponent BaseClass; + + + public: + static const dtEntity::ComponentType TYPE; + static const dtEntity::StringId LayerId; + static const dtEntity::StringId DraggerTypeId; + static const dtEntity::StringId OffsetFromStartId; + static const dtEntity::StringId KeepSizeConstantId; + static const dtEntity::StringId UseLocalCoordsId; + static const dtEntity::StringId PivotAtBottomId; + + static const dtEntity::StringId TabPlaneDraggerId; + static const dtEntity::StringId TabPlaneTrackballDraggerId; + static const dtEntity::StringId TabBoxTrackballDraggerId; + static const dtEntity::StringId TrackballDraggerId; + static const dtEntity::StringId Translate1DDraggerId; + static const dtEntity::StringId Translate2DDraggerId; + static const dtEntity::StringId TranslateAxisDraggerId; + static const dtEntity::StringId TabBoxDraggerId; + static const dtEntity::StringId TerrainTranslateDraggerId; + static const dtEntity::StringId ScaleDraggerId; + + + ManipulatorComponent(); + virtual ~ManipulatorComponent(); + + virtual dtEntity::ComponentType GetType() const { return TYPE; } + virtual bool IsInstanceOf(dtEntity::ComponentType id) const + { + return (id == TYPE); + } + + virtual void OnAddedToEntity(dtEntity::Entity& e); + virtual void OnRemovedFromEntity(dtEntity::Entity& e); + virtual void Finished(); + + osgManipulator::Dragger* GetDragger() const; + + /** + * Attach the dragger to the layer with this name. Default value is DefaultLayerId + */ + dtEntity::StringId GetLayer() const; + void SetLayer(dtEntity::StringId); + + dtEntity::StringId GetDraggerType() const { return mDraggerTypeVal; } + void SetDraggerType(dtEntity::StringId); + + void SetOffsetFromStart(const osg::Vec3d& v); + osg::Vec3d GetOffsetFromStart() const { return mOffsetFromStartVal; } + + void SetUseLocalCoords(bool v); + bool GetUseLocalCoords() const { return mUseLocalCoordsVal; } + + void SetKeepSizeConstant(bool v); + bool GetKeepSizeConstant() const { return mKeepSizeConstantVal; } + + void SetPivotAtBottom(bool v); + bool GetPivotAtBottom() const { return mPivotAtBottomVal; } + + private: + + void RemoveFromParent(); + void AddToLayer(); + + osg::ref_ptr mDraggerCallback; + dtEntity::DynamicStringIdProperty mLayerProperty; + dtEntity::StringId mLayerVal; + dtEntity::StringId mAttachPoint; + dtEntity::DynamicStringIdProperty mDraggerType; + dtEntity::StringId mDraggerTypeVal; + dtEntity::DynamicVec3dProperty mOffsetFromStart; + osg::Vec3 mOffsetFromStartVal; + dtEntity::DynamicBoolProperty mKeepSizeConstant; + bool mKeepSizeConstantVal; + dtEntity::DynamicBoolProperty mUseLocalCoords; + bool mUseLocalCoordsVal; + dtEntity::DynamicBoolProperty mPivotAtBottom; + bool mPivotAtBottomVal; + osg::ref_ptr mDraggerContainer; + + }; + + + //////////////////////////////////////////////////////////////////////////////// + + class ManipulatorSystem + : public dtEntity::DefaultEntitySystem + { + typedef dtEntity::DefaultEntitySystem BaseClass; + + public: + static const dtEntity::ComponentType TYPE; + static const dtEntity::StringId UseLocalCoordsId; + static const dtEntity::StringId UseGroundClampingId; + + ManipulatorSystem(dtEntity::EntityManager& em); + ~ManipulatorSystem(); + + // don't store manipulators to map + virtual bool StoreComponentsToMap() const { return false; } + + // don't copy manipulators with entities, also don't store to spawners + virtual bool AllowComponentCreationBySpawner() const { return false; } + + void SetUseLocalCoords(bool v); + bool GetUseLocalCoords() const { return mUseLocalCoordsVal; } + + void SetUseGroundClamping(bool v) { mUseGroundClamping.Set(v); } + bool GetUseGroundClamping() const { return mUseGroundClamping.Get(); } + + private: + + dtEntity::DynamicBoolProperty mUseLocalCoords; + bool mUseLocalCoordsVal; + dtEntity::BoolProperty mUseGroundClamping; + }; +} diff --git a/external/dtEntity/include/dtEntityOSG/manipulators.h b/external/dtEntity/include/dtEntityOSG/manipulators.h new file mode 100644 index 000000000..77a5bd2d0 --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/manipulators.h @@ -0,0 +1,96 @@ +#pragma once + +/* +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace dtEntityOSG +{ + + class TerrainTranslateDragger : public osgManipulator::CompositeDragger + { + typedef osgManipulator::CompositeDragger BaseClass; + + public: + + TerrainTranslateDragger(); + virtual void setupDefaultGeometry(); + virtual bool handle(const osgManipulator::PointerInfo& pi, const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa); + + private: + osg::ref_ptr _xDragger; + osg::ref_ptr _yDragger; + osg::ref_ptr _zDragger; + osg::ref_ptr _translate2DDragger; + }; + + + //////////////////////////////////////////////////////////////////////////////// + class ScaleAllDragger : public osgManipulator::Dragger + { + public: + virtual bool handle(const osgManipulator::PointerInfo& pi, const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us); + + protected: + osg::Vec2 _startPoint; + osg::Matrix _localToWorld; + osg::Matrix _worldToLocal; + }; + + + //////////////////////////////////////////////////////////////////////////////// + class ScaleDragger : public osgManipulator::CompositeDragger + { + typedef osgManipulator::CompositeDragger BaseClass; + + public: + + ScaleDragger(); + virtual void setupDefaultGeometry(); + virtual bool handle(const osgManipulator::PointerInfo& pi, const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa); + + private: + void setupGeometry(osgManipulator::Scale1DDragger*, const osg::Vec4& color); + osg::ref_ptr _xDragger; + osg::ref_ptr _yDragger; + osg::ref_ptr _zDragger; + osg::ref_ptr _scaleAllDragger; + }; + + //////////////////////////////////////////////////////////////////////////////// + class TrackballDragger : public osgManipulator::TrackballDragger + { + typedef osgManipulator::TrackballDragger BaseClass; + public: + virtual bool handle(const osgManipulator::PointerInfo& pi, const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa); + + }; +} diff --git a/external/dtEntity/include/dtEntityOSG/matrixtransformcomponent.h b/external/dtEntity/include/dtEntityOSG/matrixtransformcomponent.h new file mode 100644 index 000000000..c268e5e6e --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/matrixtransformcomponent.h @@ -0,0 +1,128 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include +#include + +namespace osg +{ + class MatrixTransform; +} + +namespace dtEntityOSG +{ + + + /////////////////////////////////////////////////////////////////////////// + /** + * holds a single matrix transform + */ + class DTENTITY_OSG_EXPORT MatrixTransformComponent + : public TransformComponent + { + typedef TransformComponent BaseClass; + + public: + + static const dtEntity::ComponentType TYPE; + static const dtEntity::StringId MatrixId; + + MatrixTransformComponent(); + MatrixTransformComponent(osg::MatrixTransform* trans); + + virtual ~MatrixTransformComponent(); + + virtual dtEntity::ComponentType GetType() const { + return TYPE; + } + + + const osg::MatrixTransform* GetMatrixTransform() const; + osg::MatrixTransform* GetMatrixTransform(); + + virtual dtEntity::Matrix GetMatrix() const; + virtual void SetMatrix(const dtEntity::Matrix& m); + + virtual dtEntity::Vec3d GetTranslation() const + { + dtEntity::Matrix m = GetMatrix(); + return m.getTrans(); + } + + virtual void SetTranslation(const dtEntity::Vec3d& t) + { + dtEntity::Matrix m = GetMatrix(); + m.setTrans(t); + SetMatrix(m); + } + + virtual dtEntity::Quat GetRotation() const + { + dtEntity::Matrix m = GetMatrix(); + return m.getRotate(); + } + + virtual void SetRotation(const dtEntity::Quat& q) + { + dtEntity::Matrix m = GetMatrix(); + m.setRotate(q); + SetMatrix(m); + } + + virtual dtEntity::Vec3d GetScale() const + { + dtEntity::Matrix m = GetMatrix(); + return m.getScale(); + } + + virtual void SetScale(const dtEntity::Vec3d& v) + { + dtEntity::Matrix m = GetMatrix(); + m = m.scale(v); + SetMatrix(m); + } + + private: + + dtEntity::DynamicMatrixProperty mMatrix; + }; + + + /////////////////////////////////////////////////////////////////////////// + // storage only + class DTENTITY_OSG_EXPORT MatrixTransformSystem + : public dtEntity::DefaultEntitySystem + { + public: + MatrixTransformSystem(dtEntity::EntityManager& em) + : dtEntity::DefaultEntitySystem(em, TransformComponent::TYPE) + { + + } + }; + +} diff --git a/external/dtEntity/include/dtEntityOSG/nodecomponent.h b/external/dtEntity/include/dtEntityOSG/nodecomponent.h new file mode 100644 index 000000000..c7b80d149 --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/nodecomponent.h @@ -0,0 +1,113 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include +#include + +namespace dtEntityOSG +{ + + class DTENTITY_OSG_EXPORT NodeStore + { + public: + + NodeStore(); + NodeStore(osg::Node* node); + virtual ~NodeStore(); + + /** + * returns encapsulated node + */ + virtual osg::Node* GetNode() const; + + /** + * Sets encapsulated node. Also, if the currently held node + * is attached as a child to another component then it is + * removed from that parent and the passed node is added as a child + */ + virtual void SetNode(osg::Node* node); + + /** + * type of compponent that this node component is attached to. + * Is 0 if not attached to a parent + */ + dtEntity::ComponentType GetParentComponent() const { return mParentComponent; } + void SetParentComponent(dtEntity::ComponentType c) { mParentComponent = c; } + + void ClearFromParent(); + + void SetNodeMask(unsigned int nodemask, bool recursive = false); + unsigned int GetNodeMask() const; + + void SetNodeEntity(dtEntity::Entity*); + dtEntity::Entity* GetNodeEntity(); + + private: + osg::ref_ptr mNode; + dtEntity::ComponentType mParentComponent; + }; + /////////////////////////////////////////////////////////////////////////// + /** + * Holds a single OSG node. Subclass this if you want to wrap an object + * derived from osg::Node. NodeComponent instances can be attached to + * the scene by the Layer system. + */ + class DTENTITY_OSG_EXPORT NodeComponent + : public dtEntity::Component + , public NodeStore + { + + public: + + static const dtEntity::ComponentType TYPE; + + NodeComponent(); + NodeComponent(osg::Node* node); + virtual ~NodeComponent(); + + virtual dtEntity::ComponentType GetType() const { return TYPE; } + + virtual void OnAddedToEntity(dtEntity::Entity& entity); + virtual void OnRemovedFromEntity(dtEntity::Entity& entity); + + protected: + + }; + + + /////////////////////////////////////////////////////////////////////////// + // storage only + class DTENTITY_OSG_EXPORT NodeSystem + : public dtEntity::DefaultEntitySystem + { + public: + NodeSystem(dtEntity::EntityManager& em) + : dtEntity::DefaultEntitySystem(em) + { + + } + };} diff --git a/external/dtEntity/include/dtEntityOSG/nodemaskvisitor.h b/external/dtEntity/include/dtEntityOSG/nodemaskvisitor.h new file mode 100644 index 000000000..385b706fc --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/nodemaskvisitor.h @@ -0,0 +1,49 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + + +#include +#include + +namespace dtEntityOSG +{ + class NodeMaskVisitor : public osg::NodeVisitor + { + public: + + NodeMaskVisitor(unsigned int mask) : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) + { + mMask = mask; + } + + virtual void apply(osg::Group& node) + { + node.setNodeMask(mMask); + this->traverse(node); + } + + private: + + unsigned int mMask; + }; +} + diff --git a/external/dtEntity/include/dtEntityOSG/osganimationcomponent.h b/external/dtEntity/include/dtEntityOSG/osganimationcomponent.h new file mode 100644 index 000000000..eac7152ac --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/osganimationcomponent.h @@ -0,0 +1,120 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace dtEntityOSG +{ + + /////////////////////////////////////////////////////////////////////////// + class DTENTITY_OSG_EXPORT OSGAnimationComponent : public dtEntity::Component + { + + public: + + static const dtEntity::ComponentType TYPE; + static const dtEntity::StringId EnabledId; + + OSGAnimationComponent(); + virtual ~OSGAnimationComponent(); + + virtual dtEntity::ComponentType GetType() const { return TYPE; } + virtual void OnAddedToEntity(dtEntity::Entity& entity); + + osgAnimation::BasicAnimationManager* GetAnimationManager() const + { + return mAnimationManager; + } + + void SetupMesh(osg::Node*); + + void SetEnabled(bool); + bool GetEnabled() const; + + bool AddAttachment(const std::string& boneName, osg::Node* node, const osg::Matrix& m); + bool RemoveAtachment(const std::string& boneName, osg::Node* node); + void RemoveAtachments(const std::string& boneName); + + private: + + osg::ref_ptr mAnimationManager; + dtEntity::Entity* mEntity; + dtEntity::DynamicBoolProperty mEnabled; + bool mEnabledVal; + + }; + + + /////////////////////////////////////////////////////////////////////////// + // storage only + class DTENTITY_OSG_EXPORT OSGAnimationSystem + : public dtEntity::DefaultEntitySystem + , public dtEntity::ScriptAccessor + { + public: + + static const dtEntity::ComponentType TYPE; + static const dtEntity::StringId VertexShaderId; + static const dtEntity::StringId FragmentShaderId; + static const dtEntity::StringId EnabledId; + + OSGAnimationSystem(dtEntity::EntityManager& em); + ~OSGAnimationSystem(); + + void OnMeshChanged(const dtEntity::Message&); + + void SetVertexShader(const std::string& v) { mVertexShader.Set(v); } + std::string GetVertexShader() const { return mVertexShader.Get(); } + + void SetFragmentShader(const std::string& v) { mFragmentShader.Set(v); } + std::string GetFragmentShader() const { return mFragmentShader.Get(); } + + void SetEnabled(bool); + bool GetEnabled() const; + + private: + + bool GetAnimationList(dtEntity::EntityId id, const osgAnimation::AnimationList*& list, + osgAnimation::BasicAnimationManager*& manager); + dtEntity::Property* ScriptPlayAnimation(const dtEntity::PropertyArgs& args); + dtEntity::Property* ScriptStopAnimation(const dtEntity::PropertyArgs& args); + dtEntity::Property* ScriptGetAnimations(const dtEntity::PropertyArgs& args); + dtEntity::Property* ScriptGetAnimationLength(const dtEntity::PropertyArgs& args); + dtEntity::Property* ScriptGetAnimationPlayMode(const dtEntity::PropertyArgs& args); + dtEntity::Property* ScriptSetAnimationPlayMode(const dtEntity::PropertyArgs& args); + dtEntity::Property* ScriptAddAttachment(const dtEntity::PropertyArgs& args); + dtEntity::Property* ScriptRemoveAttachments(const dtEntity::PropertyArgs& args); + + dtEntity::MessageFunctor mMeshChangedFunctor; + dtEntity::StringProperty mVertexShader; + dtEntity::StringProperty mFragmentShader; + bool mEnabledVal; + dtEntity::DynamicBoolProperty mEnabled; + }; +} diff --git a/external/dtEntity/include/dtEntityOSG/osgdebugdrawinterface.h b/external/dtEntity/include/dtEntityOSG/osgdebugdrawinterface.h new file mode 100644 index 000000000..457a4449c --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/osgdebugdrawinterface.h @@ -0,0 +1,293 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include +#include + +namespace osg +{ + class Geode; + class Geometry; +} + +namespace dtEntityOSG +{ + + + /** + * Can be used to add simple debug geometry to the scene. Each debug graphics primitive is added + * together with a lifetime / duration. + * If you want to do per-frame drawing, simply set a duration of 0 and + * execute the draw each frame. + * Warning: To use, first do SetEnabled(true), it is off by default! + */ + class DTENTITY_OSG_EXPORT OSGDebugDrawInterface + : public dtEntity::DebugDrawInterface + { + public: + + /** + * Constructor. + * @param layer Add debug draw manager to layer of this name + */ + OSGDebugDrawInterface(dtEntity::EntityManager& em, + dtEntity::StringId layer = dtEntity::StringId()); + ~OSGDebugDrawInterface(); + + /** + * message functors, don't call directly + */ + void Tick(const dtEntity::Message& msg); + void OnEnable(const dtEntity::Message& m); + + /** + * Draw a single point + * @param position Draw point here + * @param color Draw with this color + * @param size Size of points in pixels + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + void AddPoint(const dtEntity::Vec3f& position, const dtEntity::Vec4f& color, + int size = 1, float duration = 0, bool depthTestEnabled = true); + + /** + * Draw multiple points + * @param positions A vector of point positions + * @param color Draw with this color + * @param size Size of points in pixels + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + void AddPoints(const std::vector& positions, const dtEntity::Vec4f& color, + int size = 1, float duration = 0, bool depthTestEnabled = true); + + /** + * Draw a single line + * @param start Line starts here + * @param end Line ends here + * @param color Draw with this color + * @param linewidth Width of line in pixels + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + void AddLine(const dtEntity::Vec3f& start, const dtEntity::Vec3f& end, + const dtEntity::Vec4f& color, int linewidth = 1, float duration = 0, + bool depthTestEnabled = true); + + /** + * Draw a number of lines + * @param lines A vector containing two entries for each line. So to draw two lines you have to have four entries. + * @param color Draw with this color + * @param linewidth Width of line in pixels + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + void AddLines(const std::vector& lines, const dtEntity::Vec4f& color, + int linewidth = 1, float duration = 0, bool depthTestEnabled = true); + + /** + * Draw a 3d cross + * @param position Draw point here + * @param color Draw with this color + * @param size length of each arm + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + void AddCross(const dtEntity::Vec3f& position, const dtEntity::Vec4f& color, float size, + float duration = 0, bool depthTestEnabled = true); + + /** + * Draw a sphere + * @param position Draw sphere here + * @param radius radius of sphere + * @param color Draw with this color + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + void AddSphere(const dtEntity::Vec3f& position, float radius, const dtEntity::Vec4f& color, + float duration = 0, bool depthTestEnabled = true); + + /** + * Draw a single triangle + * @param vert0 First vertex of triangle + * @param vert1 Second vertex of triangle + * @param vert2 Third vertex of triangle + * @param color Draw with this color + * @param lineWidth with of line to draw in pixels + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + void AddTriangle(const dtEntity::Vec3f& vert0, const dtEntity::Vec3f& vert1, + const dtEntity::Vec3f& vert2, const dtEntity::Vec4f& color, + int lineWidth, float duration = 0, bool depthTestEnabled = true); + + /** + * Draw multiple triangles + * @param verts A vector containing triangle verts. The vector should contain three entries for each triangle. + * @param color Draw with this color + * @param lineWidth with of line to draw in pixels + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + void AddTriangles(const std::vector& verts, const dtEntity::Vec4f& color, + int lineWidth, float duration = 0, bool depthTestEnabled = true); + + /** + * Draw a mesh + * @param geometry The OSG geometry that should be drawn + * @param position Draw geometry here + * @param lineColor Draw wireframe with this color. If alpha value is 0 then wireframe will not be drawn + * @param lineWidth Draw wireframe with this line with. If value is 0 then wireframe will not be drawn + * @param faceColor Draw polygons with this color. Blending is enabled, so feel free to set an alpha value. + * Alpha value 0 means no polygons are drawn + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + void AddMesh(osg::Geometry* geometry, const dtEntity::Vec3f& position, + const dtEntity::Vec4f& lineColor, int lineWidth, + const dtEntity::Vec4f& faceColor, float duration = 0, + bool depthTestEnabled = true); + + /** + * Draw a circle + * @param position Center of circle is here + * @param planeNormal A normal vector pointing away from the face of the disk + * @param radius Radius of disk + * @param color Draw with this color + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + void AddCircle(const dtEntity::Vec3f& position, const dtEntity::Vec3f& planeNormal, + float radius, const dtEntity::Vec4f& color, float duration = 0, + bool depthTestEnabled = true); + + /** + * Draw a text string + * @param position Draw text here + * @param str The text to draw + * @param color Draw with this color + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + void AddString(const dtEntity::Vec3f& position, const std::string& str, + const dtEntity::Vec4f& color, float duration = 0, bool depthTestEnabled = true); + + /** + * Draw an axis aligned bounding box + * @param minCoords start box from here + * @param maxCoords end box here + * @param color Draw with this color + * @param lineWidth with of line to draw + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + void AddAABB(const dtEntity::Vec3f& minCoords, const dtEntity::Vec3f& maxCoords, + const dtEntity::Vec4f& color, int lineWidth, float duration = 0, + bool depthTestEnabled = true); + + /** + * Add an oriented bounding box + * @param matrix transformation matrix to apply to box + * @param minCoords start box from here + * @param maxCoords end box here + * @param color Draw with this color + * @param lineWidth with of line to draw + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + void AddOBB(const dtEntity::Matrix& matrix, const dtEntity::Vec3f& minCoords, + const dtEntity::Vec3f& maxCoords, const dtEntity::Vec4f& color, + int lineWidth, float duration = 0, bool depthTestEnabled = true); + + /** + * Add a cross showing coordinate orientation + * @param matrix transformation cross by this matrix + * @param color Draw with this color + * @param size length of cross arms + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + void AddAxes(const dtEntity::Matrix& matrix, const dtEntity::Vec4f& color, + float size, float duration = 0, bool depthTestEnabled = true); + + /** + * Add an OSG drawable + * @param drawable Add this drawable + * @param duration Show for how many seconds. Value 0 means draw once + * @param depthTestEnabled if false, always draw on top + */ + void AddDrawable(osg::Drawable* drawable, float duration = 0, + bool depthTestEnabled = true); + + /** + * DebugDrawInterface is disabled by default, enable it! + */ + void SetEnabled(bool enabled); + bool IsEnabled() const; + + /** + * Immediately remove all debug geometry + */ + void Clear(); + + /** + If context id is set then a redraw of that context is requested from OSG. + Only relevant when render on demand is used. + */ + void SetContextId(unsigned int v) + { + mContextId = v; + mContextIdSet = true; + } + unsigned int GetContextId() const { return mContextId; } + + private: + bool mEnabled; + + // osg group with stateset depth test enabled + osg::ref_ptr mGroupDepthTest; + + // osg group with stateset depth test disabled + osg::ref_ptr mGroupNoDepthTest; + + double mCurrentTime; + dtEntity::EntityManager* mEntityManager; + dtEntity::MessageFunctor mEnableFunctor; + dtEntity::MessageFunctor mTickFunctor; + dtEntity::StringId mLayerName; + int mContextId; + bool mContextIdSet; + void RequestRedraw(); + }; + + inline OSGDebugDrawInterface* GetOSGDebugDrawInterface() + { + return static_cast(dtEntity::GetDebugDrawInterface()); + } +} + diff --git a/external/dtEntity/include/dtEntityOSG/osginputinterface.h b/external/dtEntity/include/dtEntityOSG/osginputinterface.h new file mode 100644 index 000000000..ad4c932ce --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/osginputinterface.h @@ -0,0 +1,237 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include + +namespace dtEntity +{ + class MessagePump; +} + +namespace dtEntityOSG +{ + + //////////////////////////////////////////////////////////////////////////////// + // for use with GuiEventAdapter user event + class MouseEnterLeaveEvent : public osg::Referenced + { + public: + bool mFocused; + }; + + //////////////////////////////////////////////////////////////////////////////// + class DTENTITY_OSG_EXPORT OSGInputInterface + : public dtEntity::InputInterface + { + public: + + + // can't make OSGInputInterface derive from osgGA::GUIEventHandler because + // we don't want to inherit osg::Referenced stuff + class EventHandler : public osgGA::GUIEventHandler + { + OSGInputInterface* mIface; + public: + EventHandler(OSGInputInterface* i) + : mIface(i) + { + } + + virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa, osg::Object* o, osg::NodeVisitor* nv) + { + return mIface->handle(ea, aa, o, nv); + } + + }; + + osgGA::GUIEventHandler* GetEventHandler() { return mEventHandler; } + + typedef std::map KeyNames; + typedef std::map KeyNamesReverse; + + OSGInputInterface(dtEntity::MessagePump&); + virtual ~OSGInputInterface(); + + //virtual void operator()(osg::Node* node, osg::NodeVisitor* nv); + virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa, osg::Object*, osg::NodeVisitor*); + + virtual void AddInputCallback(dtEntity::InputCallbackInterface*); + virtual bool RemoveInputCallback(dtEntity::InputCallbackInterface*); + + /** + * Stores if current system is multitouch-capable + */ + virtual bool GetMultiTouchEnabled() const { return mMultiTouchEnabled; } + virtual void SetMultiTouchEnabled(bool v) { mMultiTouchEnabled = v; } + + virtual bool GetLockCursor() const { return mLockCursor; } + virtual void SetLockCursor(bool v) { mLockCursor = v; } + + /** + * Multitouch interface: return number of touch points + */ + virtual size_t GetNumTouches() const { return mNumTouches; } + + /** + * Multitouch interface: return touch points + */ + virtual std::vector GetTouches() const { return mTouches; } + + /** + * Return true if key is pressed, else false + */ + bool GetKey(const std::string& name, unsigned int contextId = 0) const; + + /** + * Return true if key was released this frame, else false + */ + virtual bool GetKeyUp(const std::string& name, unsigned int contextId = 0) const; + + /** + * Return true if key was pressed down this frame, else false + */ + virtual bool GetKeyDown(const std::string& name, unsigned int contextId = 0) const; + + /** + * Returns true if any keyboard key is currently pressed + */ + virtual bool AnyKeyDown() const; + + /** + * Return string entered this frame + */ + virtual std::string GetInputString() const; + + /** + * Return true if given mouse button is currently pressed. + * 0 for left button, 1 for right, 2 for center + */ + virtual bool GetMouseButton(int button, unsigned int contextId = 0) const; + + /** + * Return true if given mouse button was pressed this frame. + * 0 for left button, 1 for right, 2 for center + */ + virtual bool GetMouseButtonDown(int button, unsigned int contextId = 0) const; + + /** + * Return true if given mouse button was released this frame. + * 0 for left button, 1 for right, 2 for center + */ + virtual bool GetMouseButtonUp(int button, unsigned int contextId = 0) const; + + /** + * Return axis value from -1 to 1 + * @TODO: Axes are currently hard coded + */ + virtual double GetAxis(dtEntity::StringId axisname) const; + + /** + * Return current mouse wheel state. -1 = down, 1 = up, 0 = no motion + */ + virtual int GetMouseWheelState(unsigned int contextId = 0) const; + + /** + * Return a list containing names of all registered keys + */ + void GetKeyNames(std::map&) const; + + /** + * Get OSG key symbol from key name + */ + osgGA::GUIEventAdapter::KeySymbol GetKeySymbol(const std::string& name) const; + + /** + * Clear stuff at end of frame + */ + void Reset(); + + /** + * React to OSG input events + */ + bool handleInternal(const osgGA::GUIEventAdapter& ea); + + + private: + + osg::ref_ptr mEventHandler; + + void HandleMultiTouch(const osgGA::GUIEventAdapter& ea); + void HandleKeyUp(const osgGA::GUIEventAdapter& ea); + void HandleKeyDown(const osgGA::GUIEventAdapter& ea); + void HandleMouseUp(const osgGA::GUIEventAdapter& ea); + void HandleMouseDown(const osgGA::GUIEventAdapter& ea); + void HandleMouseMove(const osgGA::GUIEventAdapter& ea); + void HandleMouseWheel(const osgGA::GUIEventAdapter& ea); + void HandleMouseEnterLeave(const osgGA::GUIEventAdapter& ea); + + dtEntity::MessagePump* mMessagePump; + bool mMultiTouchEnabled; + bool mLockCursor; + size_t mNumTouches; + std::vector mTouches; + + typedef std::vector Callbacks; + Callbacks mCallbacks; + + // pair of context id, key + typedef std::set > ContextKeyMap; + ContextKeyMap mKeyPressedSet; + ContextKeyMap mKeyUpSet; + ContextKeyMap mKeyDownSet; + + KeyNames mKeyNames; + KeyNamesReverse mKeyNamesReverse; + + typedef std::set > ContextButtonMap; + ContextButtonMap mMouseButtonPressed; + ContextButtonMap mMouseButtonUp; + ContextButtonMap mMouseButtonDown; + + float mMouseX; + float mMouseY; + + int mMouseXRaw; + int mMouseYRaw; + int mMouseDeltaXRaw; + int mMouseDeltaYRaw; + float mMouseDeltaX; + float mMouseDeltaY; + + unsigned int mFrameNumber; + int mMouseScroll; + unsigned int mMouseScrollContext; + std::ostringstream mInputString; + + bool mNeedReset; // internal flag to check when to reset + }; + + inline OSGInputInterface* GetOSGInputInterface() + { + return static_cast(dtEntity::GetInputInterface()); + } +} + diff --git a/external/dtEntity/include/dtEntityOSG/osgsysteminterface.h b/external/dtEntity/include/dtEntityOSG/osgsysteminterface.h new file mode 100644 index 000000000..805dcd978 --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/osgsysteminterface.h @@ -0,0 +1,101 @@ +#pragma once + +/* -*-c++-*- + * dtEntity Game and Simulation Engine + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Martin Scheffler + */ + +#include +#include +#include +#include +#include + +namespace dtEntity +{ + class MessagePump; +} + +namespace dtEntityOSG +{ + + class DTENTITY_OSG_EXPORT OSGSystemInterface : public dtEntity::SystemInterface + { + public: + + OSGSystemInterface(dtEntity::MessagePump&, int argc, const char** argv); + ~OSGSystemInterface(); + + void InstallUpdateCallback(osg::Node* node); + + void SetViewer(osgViewer::ViewerBase* v) { mViewer = v; } + osgViewer::ViewerBase* GetViewer() const { return mViewer.get(); } + + osgViewer::View* GetPrimaryView() const; + osgViewer::GraphicsWindow* GetPrimaryWindow() const; + osg::Camera* GetPrimaryCamera() const; + + virtual void EmitTickMessagesAndQueuedMessages(); + + virtual void EmitPostUpdateMessage(); + + virtual float GetDeltaSimTime() const; + virtual float GetDeltaRealTime() const; + virtual dtEntity::Timer_t GetRealClockTime(); + virtual double GetSimulationTime() const; + void SetSimulationTime(double); + + virtual float GetTimeScale() const; + virtual void SetTimeScale(float v); + + virtual dtEntity::Timer_t GetSimulationClockTime() const; + virtual void SetSimulationClockTime(dtEntity::Timer_t t); + + void SetTimeValues(double simulationTime, float deltaSimTime,float deltaTime, dtEntity::Timer_t clockTime); + + /** + * Get absolute path from a relative file path. + * Returns empty string if file is not found + */ + virtual std::string FindDataFile(const std::string& filename); + + /** + * return true if a file exists + */ + virtual bool FileExists(const std::string& filename); + + virtual int GetArgC() { return mArgC; } + virtual const char** GetArgV() { return mArgV; } + + private: + osg::observer_ptr mViewer; + dtEntity::MessagePump* mMessagePump; + class Impl; + Impl* mImpl; + + int mArgC; + const char** mArgV; + + }; + + inline OSGSystemInterface* GetOSGSystemInterface() + { + return static_cast(dtEntity::GetSystemInterface()); + } + +} diff --git a/external/dtEntity/include/dtEntityOSG/osgwindowinterface.h b/external/dtEntity/include/dtEntityOSG/osgwindowinterface.h new file mode 100644 index 000000000..260a72532 --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/osgwindowinterface.h @@ -0,0 +1,144 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include +#include + +namespace dtEntity +{ + class EntityManager; +} + +namespace osgViewer +{ + class GraphicsWindow; + class View; +} + +namespace dtEntityOSG +{ + + class DTENTITY_OSG_EXPORT OSGWindowInterface : public dtEntity::WindowInterface + { + public: + + struct WindowPos + { + int mX; + int mY; + int mW; + int mH; + bool mWindowDeco; + }; + + OSGWindowInterface(dtEntity::EntityManager& em); + ~OSGWindowInterface(); + + osgViewer::GraphicsWindow* GetWindowByContextId(unsigned int contextId) const; + osgViewer::View* GetViewByContextId(unsigned int contextId) const; + + /** + * Opens a new window if used viewer is a composite viewer. + * @param name Name of osg nodes for window, view and camera to set + * @param traits OSG GraphicsWindow traits to use + * @contextId receives context id of newly created context + * @return true if success, else false + */ + virtual bool OpenWindow(const std::string& name, unsigned int& contextId); + + virtual void CloseWindow(unsigned int contextid); + + /** + * Get pick ray at given screen position + */ + dtEntity::Vec3f GetPickRay(unsigned int contextid, float x, float y, bool usePixels = false) const; + + virtual bool GetWindowGeometry(unsigned int contextid, int& x, int& y, int& width, int& height) const; + virtual bool SetWindowGeometry(unsigned int contextid, int x, int y, int width, int height); + + virtual void SetFullscreen(unsigned int contextid, bool fullscreen); + virtual bool GetFullscreen(unsigned int contextid) const; + + virtual dtEntity::EntityId PickEntity(double x, + double y, + unsigned int nodemask, + unsigned int contextid, + bool usePixels = true) const; + + void SetTraits(osg::GraphicsContext::Traits* traits) { mTraits = traits; } + osg::GraphicsContext::Traits* GetTraits() const { return mTraits; } + + virtual void SetShowCursor(unsigned int contextid, bool); + + virtual dtEntity::Vec3d ConvertWorldToScreenCoords(unsigned int contextid, const dtEntity::Vec3d& coord); + + /** + * Should the window with given context id be continuously redrawn + * or only by request? Default is on + */ + virtual void SetContinuousRedraw(unsigned int contextid, bool); + + /** + * If Continuous Redraw is off, request a redraw in next render traversal + */ + virtual void RequestRedraw(unsigned int contextid); + + /** + * Get intersections between start and end and add them to isects vector + * @param start Start of intersection line + * @param end End of intersection lnie + * @param isects Vector return value for isect results + * @param nodemask Bit mask, used for selecting nodes for intersection + * @param layer Name of layer attach point component from which intersecition test will + * be executed downwards (default: layer "default") + * @return true if an intersection was found + */ + virtual bool GetIntersections(const dtEntity::Vec3d& start, const dtEntity::Vec3d& end, + std::vector& isects, + unsigned int nodemask = dtEntity::NodeMasks::PICKABLE | dtEntity::NodeMasks::TERRAIN, + dtEntity::StringId layer = dtEntity::StringId() + ) const; + + + protected: + + bool OpenWindowInternal(const std::string& name, unsigned int& contextId); + + dtEntity::EntityManager* mEntityManager; + + typedef std::map WindowPosMap; + WindowPosMap mWindowPositions; + osg::ref_ptr mTraits; + + }; + + inline OSGWindowInterface* GetOSGWindowInterface() + { + return static_cast(dtEntity::GetWindowInterface()); + } + +} diff --git a/external/dtEntity/include/dtEntityOSG/particlecomponent.h b/external/dtEntity/include/dtEntityOSG/particlecomponent.h new file mode 100644 index 000000000..cd00fb8cb --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/particlecomponent.h @@ -0,0 +1,231 @@ +#pragma once + +/* +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace dtEntityOSG +{ + + class ParticleComponent + : public dtEntityOSG::NodeComponent + { + + public: + typedef dtEntityOSG::NodeComponent BaseClass; + + static const dtEntity::ComponentType TYPE; + + static const dtEntity::StringId AlphaRangeId; + static const dtEntity::StringId ColorRangeMinId; + static const dtEntity::StringId ColorRangeMaxId; + static const dtEntity::StringId CounterId; + static const dtEntity::StringId DebugOnId; + static const dtEntity::StringId EmissiveParticlesId; + static const dtEntity::StringId EnabledId; + static const dtEntity::StringId LifeTimeId; + static const dtEntity::StringId LightingId; + static const dtEntity::StringId MassId; + static const dtEntity::StringId PlacerId; + static const dtEntity::StringId SizeRangeId; + static const dtEntity::StringId TextureFileId; + static const dtEntity::StringId TextureUnitId; + + static const dtEntity::StringId __SELECTED__Id; + static const dtEntity::StringId BoxId; + static const dtEntity::StringId CompositeId; + static const dtEntity::StringId MultiSegmentId; + static const dtEntity::StringId PointId; + static const dtEntity::StringId SectorId; + static const dtEntity::StringId SegmentId; + + static const dtEntity::StringId XRangeId; + static const dtEntity::StringId YRangeId; + static const dtEntity::StringId ZRangeId; + static const dtEntity::StringId CenterId; + + static const dtEntity::StringId RandomRateCounterId; + static const dtEntity::StringId ConstantRateCounterId; + + static const dtEntity::StringId RateRangeId; + static const dtEntity::StringId MinimumNumberOfParticlesToCreateId; + static const dtEntity::StringId NumberOfParticlesPerSecondToCreateId; + + static const dtEntity::StringId ShooterThetaRangeId; + static const dtEntity::StringId ShooterPhiRangeId; + static const dtEntity::StringId ShooterInitialSpeedRangeId; + static const dtEntity::StringId ShooterInitialRotationalSpeedMinId; + static const dtEntity::StringId ShooterInitialRotationalSpeedMaxId; + + static const dtEntity::StringId ShapeId; + static const dtEntity::StringId ShapePointId; + static const dtEntity::StringId ShapeQuadId; + static const dtEntity::StringId ShapeQuadTriangeStripId; + static const dtEntity::StringId ShapeHexagonId; + static const dtEntity::StringId ShapeLineId; + + static const dtEntity::StringId OperatorsId; + + static const dtEntity::StringId BounceOperatorId; + static const dtEntity::StringId ForceOperatorId; + + static const dtEntity::StringId FrictionId; + static const dtEntity::StringId ResilienceId; + static const dtEntity::StringId CutoffId; + static const dtEntity::StringId DomainsId; + static const dtEntity::StringId PlaneDomainId; + static const dtEntity::StringId SphereDomainId; + static const dtEntity::StringId ForceId; + static const dtEntity::StringId NormalId; + static const dtEntity::StringId DistId; + static const dtEntity::StringId RadiusId; + + + + ParticleComponent(); + virtual ~ParticleComponent(); + + virtual dtEntity::ComponentType GetType() const { return TYPE; } + virtual bool IsInstanceOf(dtEntity::ComponentType id) const + { + return (id == TYPE); + } + + virtual void OnAddedToEntity(dtEntity::Entity &entity); + virtual void OnRemovedFromEntity(dtEntity::Entity &entity); + + virtual void Finished(); + + void SetTextureFile(const std::string& v) { mTextureFile.Set(v); } + std::string GetTextureFile() const { return mTextureFile.Get(); } + + void SetEmissiveParticles(bool v) { mEmissiveParticles.Set(v); } + bool GetEmissiveParticles() const { return mEmissiveParticles.Get(); } + + void SetDebugOn(bool v); + bool GetDebugOn() const { return mDebugOnVal; } + + void SetLighting(bool v) { mLighting.Set(v); } + bool GetLighting() const { return mLighting.Get(); } + + void SetTextureUnit(int v) { mTextureUnit.Set(v); } + int GetTextureUnit() const { return mTextureUnit.Get(); } + + void SetLifeTime(double v) { mLifeTime.Set(v); } + double GetLifeTime() const { return mLifeTime.Get(); } + + void SetMass(float v) { mMass.Set(v); } + float GetMass() const { return mMass.Get(); } + + void SetSizeRange(const osg::Vec2& v) { mSizeRange.Set(v); } + osg::Vec2 GetSizeRange() const { return mSizeRange.Get(); } + + + void SetCounter(const dtEntity::PropertyGroup&); + dtEntity::PropertyGroup GetCounter() const; + + void SetPlacer(const dtEntity::PropertyGroup&); + dtEntity::PropertyGroup GetPlacer() const; + + void SetShooterThetaRange(const osg::Vec2& v); + osg::Vec2 GetShooterThetaRange() const; + + void SetShooterPhiRange(const osg::Vec2& v); + osg::Vec2 GetShooterPhiRange() const; + + void SetShooterInitialSpeedRange(const osg::Vec2& v); + osg::Vec2 GetShooterInitialSpeedRange() const; + + void SetShooterInitialRotationalSpeedMin(const osg::Vec3& v); + osg::Vec3 GetShooterInitialRotationalSpeedMin() const; + + void SetShooterInitialRotationalSpeedMax(const osg::Vec3& v); + osg::Vec3 GetShooterInitialRotationalSpeedMax() const; + + void SetOperators(const dtEntity::PropertyArray& v); + dtEntity::PropertyArray GetOperators() const; + + protected: + + osg::ref_ptr mGeode; + osg::ref_ptr mParticleSystem; + osg::ref_ptr mModularEmitter; + osg::ref_ptr mProgram; + + dtEntity::DynamicBoolProperty mDebugOn; + bool mDebugOnVal; + dtEntity::StringProperty mTextureFile; + dtEntity::BoolProperty mEmissiveParticles; + dtEntity::BoolProperty mEnabled; + dtEntity::BoolProperty mLighting; + dtEntity::IntProperty mTextureUnit; + + dtEntity::DoubleProperty mLifeTime; + dtEntity::FloatProperty mMass; + dtEntity::Vec2Property mSizeRange; + dtEntity::Vec2Property mAlphaRange; + dtEntity::Vec4Property mColorRangeMin; + dtEntity::Vec4Property mColorRangeMax; + + dtEntity::DynamicGroupProperty mPlacer; + dtEntity::GroupProperty mPlacerVal; + dtEntity::DynamicGroupProperty mCounter; + dtEntity::GroupProperty mCounterVal; + + dtEntity::DynamicVec2Property mShooterThetaRange; + dtEntity::DynamicVec2Property mShooterPhiRange; + dtEntity::DynamicVec2Property mShooterInitialSpeedRange; + dtEntity::DynamicVec3Property mShooterInitialRotationalSpeedMin; + dtEntity::DynamicVec3Property mShooterInitialRotationalSpeedMax; + + dtEntity::StringIdProperty mShape; + + dtEntity::DynamicArrayProperty mOperators; + dtEntity::ArrayProperty mOperatorsVal; + + }; + + + //////////////////////////////////////////////////////////////////////////////// + + class ParticleSystem + : public dtEntity::DefaultEntitySystem + { + typedef dtEntity::DefaultEntitySystem BaseClass; + + public: + + static const dtEntity::ComponentType TYPE; + + ParticleSystem(dtEntity::EntityManager& em); + ~ParticleSystem(); + + }; +} diff --git a/external/dtEntity/include/dtEntityOSG/pathcomponent.h b/external/dtEntity/include/dtEntityOSG/pathcomponent.h new file mode 100644 index 000000000..253da74e4 --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/pathcomponent.h @@ -0,0 +1,98 @@ +#pragma once + +/* +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include + +namespace dtEntityOSG +{ + + class PathComponent : public dtEntityOSG::NodeComponent + { + typedef dtEntityOSG::NodeComponent BaseClass; + + public: + + static const dtEntity::ComponentType TYPE; + static const dtEntity::StringId VertsId; + static const dtEntity::StringId PathVisibleId; + static const dtEntity::StringId VertsVisibleId; + + typedef dtEntity::PropertyArray::size_type size_type; + + PathComponent(); + virtual ~PathComponent(); + + virtual dtEntity::ComponentType GetType() const { return TYPE; } + virtual bool IsInstanceOf(dtEntity::ComponentType id) const + { + return (id == TYPE); + } + + virtual void Finished(); + + void SetPathsVisible(bool v) { mPathsVisible.Set(v); } + bool GetPathsVisible() const { return mPathsVisible.Get(); } + + void SetVertsVisible(bool v) { mVertsVisible.Set(v); } + bool GetVertsVisible() const { return mVertsVisible.Get(); } + + osg::Vec3 GetVertex(size_type index) const; + void SetVertex(size_type index, const osg::Vec3& v); + size_type GetNumVertices() const; + + private: + + dtEntity::ArrayProperty mVerts; + dtEntity::BoolProperty mPathsVisible; + dtEntity::BoolProperty mVertsVisible; + }; + + + //////////////////////////////////////////////////////////////////////////////// + + class PathSystem + : public dtEntity::DefaultEntitySystem + , public dtEntity::ScriptAccessor + { + typedef dtEntity::DefaultEntitySystem BaseClass; + + public: + + static const dtEntity::ComponentType TYPE; + + PathSystem(dtEntity::EntityManager& em); + ~PathSystem(); + + dtEntity::Property* ScriptPickVertex(const dtEntity::PropertyArgs& args); + dtEntity::Property* ScriptGetVertexWorldPosition(const dtEntity::PropertyArgs& args); + dtEntity::Property* ScriptSetVertexWorldPosition(const dtEntity::PropertyArgs& args); + dtEntity::Property* ScriptDuplicateVertex(const dtEntity::PropertyArgs& args); + + private: + + }; +} diff --git a/external/dtEntity/include/dtEntityOSG/pickshapecomponent.h b/external/dtEntity/include/dtEntityOSG/pickshapecomponent.h new file mode 100644 index 000000000..a727b9775 --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/pickshapecomponent.h @@ -0,0 +1,96 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace dtEntityOSG +{ + + /////////////////////////////////////////////////////////////////////////// + + /** + * Adds a pickable shape to the transform of the entity + */ + class DTENTITY_OSG_EXPORT PickShapeComponent + : public NodeComponent + { + public: + + typedef NodeComponent BaseClass; + + static const dtEntity::ComponentType TYPE; + static const dtEntity::StringId MinBoundsId; + static const dtEntity::StringId MaxBoundsId; + static const dtEntity::StringId VisibleId; + + PickShapeComponent(); + virtual ~PickShapeComponent(); + + virtual dtEntity::ComponentType GetType() const { return TYPE; } + + void SetMinBounds(const osg::Vec3& v); + osg::Vec3 GetMinBounds() const { return mMinBoundsVal; } + + void SetMaxBounds(const osg::Vec3& v); + osg::Vec3 GetMaxBounds() const { return mMaxBoundsVal; } + + void SetVisible(bool v); + bool GetVisible() const; + + private: + + void UpdatePickShape(); + + // path to loaded script file + dtEntity::StringProperty mMeshPathProperty; + dtEntity::DynamicVec3Property mMinBounds; + dtEntity::DynamicVec3Property mMaxBounds; + dtEntity::DynamicBoolProperty mVisible; + osg::ref_ptr mBox; + osg::Vec3 mMinBoundsVal; + osg::Vec3 mMaxBoundsVal; + + }; + + + ////////////////////////////////////////////////////////// + + class DTENTITY_OSG_EXPORT PickShapeSystem + : public dtEntity::DefaultEntitySystem + { + public: + + static const dtEntity::ComponentType TYPE; + + PickShapeSystem(dtEntity::EntityManager& em); + ~PickShapeSystem(); + private: + }; + +} diff --git a/external/dtEntity/include/dtEntityOSG/positionattitudetransformcomponent.h b/external/dtEntity/include/dtEntityOSG/positionattitudetransformcomponent.h new file mode 100644 index 000000000..67b08f3a9 --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/positionattitudetransformcomponent.h @@ -0,0 +1,105 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace osg +{ + class PositionAttitudeTransform; +} + +namespace dtEntityOSG +{ + + /////////////////////////////////////////////////////////////////////////// + /** + * holds a single PositionAttitude transform + */ + class DTENTITY_OSG_EXPORT PositionAttitudeTransformComponent + : public TransformComponent + { + typedef TransformComponent BaseClass; + + public: + + static const dtEntity::ComponentType TYPE; + static const dtEntity::StringId PositionId; + static const dtEntity::StringId AttitudeId; + static const dtEntity::StringId ScaleId; + + PositionAttitudeTransformComponent(); + + virtual ~PositionAttitudeTransformComponent(); + + virtual dtEntity::ComponentType GetType() const { + return TYPE; + } + + const osg::PositionAttitudeTransform* GetPositionAttitudeTransform() const; + osg::PositionAttitudeTransform* GetPositionAttitudeTransform(); + + dtEntity::Vec3d GetPosition() const; + void SetPosition(const dtEntity::Vec3d& p); + + dtEntity::Quat GetAttitude() const; + void SetAttitude(const dtEntity::Quat& r); + + dtEntity::Vec3d GetScale() const; + void SetScale(const dtEntity::Vec3d& q); + + virtual dtEntity::Vec3d GetTranslation() const { return GetPosition(); } + virtual void SetTranslation(const dtEntity::Vec3d& t) { SetPosition(t); } + + virtual dtEntity::Quat GetRotation() const { return GetAttitude(); } + virtual void SetRotation(const dtEntity::Quat& q) { SetAttitude(q); } + + virtual dtEntity::Matrix GetMatrix() const; + virtual void SetMatrix(const dtEntity::Matrix& mat); + + private: + + dtEntity::DynamicVec3dProperty mPosition; + dtEntity::DynamicVec3dProperty mScale; + dtEntity::DynamicQuatProperty mAttitude; + }; + + /////////////////////////////////////////////////////////////////////////// + // storage only + class DTENTITY_OSG_EXPORT PositionAttitudeTransformSystem + : public dtEntity::DefaultEntitySystem + { + public: + PositionAttitudeTransformSystem(dtEntity::EntityManager& em) + : dtEntity::DefaultEntitySystem(em, TransformComponent::TYPE) + { + + } + }; + +} diff --git a/external/dtEntity/include/dtEntityOSG/shadercomponent.h b/external/dtEntity/include/dtEntityOSG/shadercomponent.h new file mode 100644 index 000000000..1495475f4 --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/shadercomponent.h @@ -0,0 +1,101 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include + +namespace osg +{ + class Program; +} + +namespace dtEntityOSG +{ + + class DTENTITY_OSG_EXPORT ShaderComponent : public dtEntity::Component + { + + typedef dtEntity::Component BaseClass; + + public: + + static const dtEntity::ComponentType TYPE; + static const dtEntity::StringId MaterialNamePrefixId; + static const dtEntity::StringId TopLevelMaterialNameId; + + ShaderComponent(); + virtual ~ShaderComponent(); + + void OnAddedToEntity(dtEntity::Entity& entity); + + virtual dtEntity::ComponentType GetType() const { return TYPE; } + + std::string GetMaterialNamePrefix() const { return mMaterialNamePrefix.Get(); } + void SetMaterialNamePrefix(const std::string& s) { mMaterialNamePrefix.Set(s); } + + std::string GetTopLevelMaterialName() const { return mTopLevelMaterialName.Get(); } + void SetTopLevelMaterialName(const std::string& s) { mTopLevelMaterialName.Set(s); } + + private: + dtEntity::StringProperty mMaterialNamePrefix; + dtEntity::StringProperty mTopLevelMaterialName; + + }; + + + ////////////////////////////////////////////////////////// + + // storage only + class DTENTITY_OSG_EXPORT ShaderSystem + : public dtEntity::DefaultEntitySystem + , public dtEntity::ScriptAccessor + { + typedef dtEntity::DefaultEntitySystem BaseClass; + + public: + static const dtEntity::ComponentType TYPE; + + ShaderSystem(dtEntity::EntityManager& em); + ~ShaderSystem(); + + void AddProgram(const std::string& name, osg::Program* prg); + osg::Program* GetProgram(const std::string& name) const; + + virtual bool CreateComponent(dtEntity::EntityId eid, dtEntity::Component*& component); + + private: + + typedef std::map > ProgramMap; + ProgramMap mPrograms; + dtEntity::MessageFunctor mChangedMeshFunctor; + + void OnChangedMesh(const dtEntity::Message& msg); + void ApplyShader(dtEntity::EntityId); + dtEntity::Property* ScriptAddProgram(const dtEntity::PropertyArgs& args); + dtEntity::Property* ScriptAddUniform(const dtEntity::PropertyArgs& args); + dtEntity::Property* ScriptRemoveUniform(const dtEntity::PropertyArgs& args); + + }; + +} diff --git a/external/dtEntity/include/dtEntityOSG/shadowcomponent.h b/external/dtEntity/include/dtEntityOSG/shadowcomponent.h new file mode 100644 index 000000000..d2eaf57d5 --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/shadowcomponent.h @@ -0,0 +1,111 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include + +namespace dtEntityOSG +{ + + /** + * Holds a single OSG node. + */ + class DTENTITY_OSG_EXPORT ShadowComponent : public GroupComponent + { + typedef GroupComponent BaseClass; + + public: + + static const dtEntity::ComponentType TYPE; + + static const dtEntity::StringId EnabledId; + static const dtEntity::StringId ShadowTechniqueId; + static const dtEntity::StringId MinLightMarginId; + static const dtEntity::StringId MaxFarPlaneId; + static const dtEntity::StringId TexSizeId; + static const dtEntity::StringId BaseTexUnitId; + static const dtEntity::StringId ShadowTexUnitId; + static const dtEntity::StringId ShadowTexCoordIndexId; + static const dtEntity::StringId BaseTexCoordIndexId; + static const dtEntity::StringId MapCountId; + static const dtEntity::StringId MapResId; + static const dtEntity::StringId DebugColorOnId; + static const dtEntity::StringId MinNearSplitId; + static const dtEntity::StringId MaxFarDistId; + static const dtEntity::StringId MoveVCamFactorId; + static const dtEntity::StringId PolyOffsetFactorId; + static const dtEntity::StringId PolyOffsetUnitId; + static const dtEntity::StringId LISPId; + static const dtEntity::StringId PSSMId; + static const dtEntity::StringId __SELECTED__Id; + + static const dtEntity::StringId ShadowTypeId; + + ShadowComponent(); + virtual ~ShadowComponent(); + + void OnAddedToEntity(dtEntity::Entity& entity); + + virtual dtEntity::ComponentType GetType() const { return TYPE; } + + virtual void Finished(); + + void SetShadowTechnique(const std::string name); + + void SetEnabled(bool v) { mEnabled.Set(v); } + bool GetEnabled() const { return mEnabled.Get(); } + private: + + dtEntity::Entity* mEntity; + dtEntity::BoolProperty mEnabled; + osg::ref_ptr mTechnique; + + dtEntity::GroupProperty mShadowType; + }; + + + ////////////////////////////////////////////////////////// + + // storage only + class DTENTITY_OSG_EXPORT ShadowSystem + : public dtEntity::DefaultEntitySystem + { + public: + static const dtEntity::ComponentType TYPE; + static const dtEntity::StringId EnabledId; + + ShadowSystem(dtEntity::EntityManager& em); + virtual ~ShadowSystem(); + + void SetEnabled(bool); + bool GetEnabled() const { return mEnabledVal; } + + private: + dtEntity::DynamicBoolProperty mEnabled; + bool mEnabledVal; + }; + +} diff --git a/external/dtEntity/include/dtEntityOSG/skyboxcomponent.h b/external/dtEntity/include/dtEntityOSG/skyboxcomponent.h new file mode 100644 index 000000000..5be38b35a --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/skyboxcomponent.h @@ -0,0 +1,84 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include + +namespace dtEntityOSG +{ + + /** + * Holds a single OSG node. + */ + class DTENTITY_OSG_EXPORT SkyBoxComponent : public GroupComponent + { + + typedef GroupComponent BaseClass; + + public: + + static const dtEntity::ComponentType TYPE; + static const dtEntity::StringId TextureUpId; + static const dtEntity::StringId TextureDownId; + static const dtEntity::StringId TextureNorthId; + static const dtEntity::StringId TextureSouthId; + static const dtEntity::StringId TextureEastId; + static const dtEntity::StringId TextureWestId; + + SkyBoxComponent(); + virtual ~SkyBoxComponent(); + + virtual void Finished(); + + virtual dtEntity::ComponentType GetType() const { return TYPE; } + + virtual osg::Group* GetAttachmentGroup() const { return mDrawables; } + + private: + osg::ref_ptr mSkyboxGeode; + dtEntity::StringProperty mTextureUp; + dtEntity::StringProperty mTextureDown; + dtEntity::StringProperty mTextureNorth; + dtEntity::StringProperty mTextureSouth; + dtEntity::StringProperty mTextureEast; + dtEntity::StringProperty mTextureWest; + osg::ref_ptr mDrawables; + }; + + + ////////////////////////////////////////////////////////// + + // storage only + class DTENTITY_OSG_EXPORT SkyBoxSystem + : public dtEntity::DefaultEntitySystem + { + public: + static const dtEntity::ComponentType TYPE; + SkyBoxSystem(dtEntity::EntityManager& em); + }; + +} + diff --git a/external/dtEntity/include/dtEntityOSG/staticmeshcomponent.h b/external/dtEntity/include/dtEntityOSG/staticmeshcomponent.h new file mode 100644 index 000000000..dfb514745 --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/staticmeshcomponent.h @@ -0,0 +1,115 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include +#include + +namespace dtEntityOSG +{ + + + /////////////////////////////////////////////////////////////////////////// + /** + * Loads a static mesh from a path + */ + class DTENTITY_OSG_EXPORT StaticMeshComponent + : public NodeComponent + { + public: + + typedef NodeComponent BaseClass; + + static const dtEntity::ComponentType TYPE; + static const dtEntity::StringId MeshId; + static const dtEntity::StringId CacheHintId; + static const dtEntity::StringId OptimizeId; + static const dtEntity::StringId IsTerrainId; + + static const dtEntity::StringId CacheNoneId; + static const dtEntity::StringId CacheAllId; + static const dtEntity::StringId CacheNodesId; + static const dtEntity::StringId CacheHardwareMeshesId; + + StaticMeshComponent(); + virtual ~StaticMeshComponent(); + + virtual dtEntity::ComponentType GetType() const { return TYPE; } + + virtual void Finished(); + + // set existing geometry as static mesh + void SetStaticMesh(osg::Node* node); + + /** + * return path of currently loaded mesh + */ + std::string GetMesh() const; + + /** + * Load mesh from path + */ + virtual void SetMesh(const std::string& path, dtEntity::StringId cacheHint = CacheAllId); + + void SetCacheHint(dtEntity::StringId v) { mCacheHint.Set(v); } + dtEntity::StringId GetCacheHint() const { return mCacheHint.Get(); } + + bool GetOptimize() const { return mOptimize.Get(); } + void SetOptimize(bool v) { mOptimize.Set(v); } + + bool GetIsTerrain() const { return mIsTerrainVal; } + void SetIsTerrain(bool v); + + protected: + + // path to loaded script file + dtEntity::StringProperty mMeshPathProperty; + dtEntity::StringIdProperty mCacheHint; + dtEntity::BoolProperty mOptimize; + dtEntity::DynamicBoolProperty mIsTerrain; + bool mIsTerrainVal; + std::string mLoadedMesh; + }; + + + /////////////////////////////////////////////////////////////////////////// + // storage only + class DTENTITY_OSG_EXPORT StaticMeshSystem + : public dtEntity::DefaultEntitySystem + { + public: + + static const dtEntity::ComponentType TYPE; + + StaticMeshSystem(dtEntity::EntityManager& em); + ~StaticMeshSystem(); + + void OnResourceChanged(const dtEntity::Message& msg); + + private: + dtEntity::MessageFunctor mResourceChangedFunctor; + }; +} diff --git a/external/dtEntity/include/dtEntityOSG/textlabelcomponent.h b/external/dtEntity/include/dtEntityOSG/textlabelcomponent.h new file mode 100644 index 000000000..9a8336727 --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/textlabelcomponent.h @@ -0,0 +1,157 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include +#include + +namespace dtEntityOSG +{ + class Entity; + class TextLabelSystem; + + class DTENTITY_OSG_EXPORT TextLabelComponent : public NodeComponent + { + + typedef NodeComponent BaseClass; + + public: + + typedef std::vector >::size_type size_type; + + static const dtEntity::ComponentType TYPE; + static const dtEntity::StringId TextsId; + static const dtEntity::StringId AlwaysOnTopId; + static const dtEntity::StringId TextId; + static const dtEntity::StringId ColorId; + static const dtEntity::StringId BackdropColorId; + static const dtEntity::StringId VisibleId; + static const dtEntity::StringId HighlightedId; + static const dtEntity::StringId OffsetId; + static const dtEntity::StringId CharacterHeightId; + static const dtEntity::StringId FontId; + static const dtEntity::StringId AlignmentId; + + TextLabelComponent(); + virtual ~TextLabelComponent(); + + virtual dtEntity::ComponentType GetType() const { return TYPE; } + + virtual bool IsInstanceOf(dtEntity::ComponentType id) const + { + return (id == TYPE); + } + + virtual void Finished(); + + void OnAddedToEntity(dtEntity::Entity& entity); + + size_type GetNumTexts() const { return mTextEntries.size(); } + void Create(size_type textid); + void Destroy(size_type textid); + + void ClearAll(); + + void SetText(size_type textid, const std::string&); + std::string GetText(size_type textid) const; + + void SetHighlighted(size_type textid, bool); + bool GetHighlighted(size_type textid) const; + + void SetFlashing(size_type textid, bool); + bool GetFlashing(size_type textid) const; + + void SetColor(size_type textid, const osg::Vec4&); + osg::Vec4 GetColor(size_type textid) const; + + void SetBackdropColor(size_type textid, const osg::Vec4&); + osg::Vec4 GetBackdropColor(size_type textid) const; + + void SetVisible(size_type textid, bool); + bool GetVisible(size_type textid) const; + + void SetFont(size_type textid, const std::string&); + std::string GetFont(size_type textid) const; + + void SetOffset(size_type textid, const osg::Vec3&); + osg::Vec3 GetOffset(size_type textid) const; + + void SetCharacterHeight(size_type textid, float); + float GetCharacterHeight(size_type textid) const; + + void SetAlignment(size_type textid, const std::string& str); + std::string GetAlignment(size_type textid) const; + + bool GetAlwaysOnTop() const { return mAlwaysOnTopVal; } + void SetAlwaysOnTop(bool v); + + private: + + void SetTexts(const dtEntity::PropertyArray& texts); + dtEntity::PropertyArray GetTexts() const; + dtEntity::DynamicArrayProperty mTexts; + dtEntity::ArrayProperty mTextsVal; + dtEntity::DynamicBoolProperty mAlwaysOnTop; + bool mAlwaysOnTopVal; + typedef std::vector > TextEntries; + TextEntries mTextEntries; + TextLabelSystem* mTextLabelSystem; + }; + + + //////////////////////////////////////////////////////////////////////////// + + class DTENTITY_OSG_EXPORT TextLabelSystem + : public dtEntity::DefaultEntitySystem + , public dtEntity::ScriptAccessor + { + static const dtEntity::StringId EnabledId; + typedef dtEntity::DefaultEntitySystem BaseClass; + + public: + + static const dtEntity::ComponentType TYPE; + + TextLabelSystem(dtEntity::EntityManager& em); + + void SetEnabled(bool v); + bool GetEnabled() const; + + private: + + dtEntity::DynamicBoolProperty mEnabled; + bool mEnabledVal; + dtEntity::Property* ScriptCreate(const dtEntity::PropertyArgs& args); + dtEntity::Property* ScriptDestroy(const dtEntity::PropertyArgs& args); + dtEntity::Property* ScriptSetText(const dtEntity::PropertyArgs& args); + dtEntity::Property* ScriptSetOffset(const dtEntity::PropertyArgs& args); + dtEntity::Property* ScriptSetAlignment(const dtEntity::PropertyArgs& args); + dtEntity::Property* ScriptSetColor(const dtEntity::PropertyArgs& args); + dtEntity::Property* ScriptSetBackdropColor(const dtEntity::PropertyArgs& args); + dtEntity::Property* ScriptSetHighlighted(const dtEntity::PropertyArgs& args); + + }; +} diff --git a/external/dtEntity/include/dtEntityOSG/texturelabelcomponent.h b/external/dtEntity/include/dtEntityOSG/texturelabelcomponent.h new file mode 100644 index 000000000..bfa505b47 --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/texturelabelcomponent.h @@ -0,0 +1,145 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler + +*/ + +#include +#include +#include +#include +#include +#include +#include + +namespace dtEntityOSG +{ + + class TextureLabelSystem; + + class DTENTITY_OSG_EXPORT TextureLabelComponent : public NodeComponent + { + + friend class TextureLabelSystem; + typedef NodeComponent BaseClass; + + public: + + static const dtEntity::ComponentType TYPE; + static const dtEntity::StringId OffsetId; + static const dtEntity::StringId PathId; + static const dtEntity::StringId ColorId; + static const dtEntity::StringId MaxSizeId; + static const dtEntity::StringId MinSizeId; + static const dtEntity::StringId DistanceAttenuationId; + static const dtEntity::StringId VisibleId; + static const dtEntity::StringId AlwaysOnTopId; + static const dtEntity::StringId AddConnectingLineId; + + TextureLabelComponent(); + virtual ~TextureLabelComponent(); + + virtual dtEntity::ComponentType GetType() const { return TYPE; } + + virtual bool IsInstanceOf(dtEntity::ComponentType id) const + { + return (id == TYPE); + } + + virtual void Finished(); + + virtual void OnAddedToEntity(dtEntity::Entity& entity); + std::string GetPath() const { return mPath.Get(); } + + // call OnFinished...() to apply + void SetPath(const std::string& path) { mPath.Set(path); } + + osg::Geode* GetGeode() const; + + osg::Vec3 GetOffset() const { return mOffsetVal; } + void SetOffset(const osg::Vec3& o); + + void SetMaxSize(unsigned int v) { mMaxSize.Set(v); } + unsigned int GetMaxSize() const { return mMaxSize.Get(); } + + void SetMinSize(unsigned int v) { mMinSize.Set(v); } + unsigned int GetMinSize() const { return mMinSize.Get(); } + + void SetDistanceAttenuation(const osg::Vec3& v) { mDistanceAttenuation.Set(v); } + osg::Vec3 GetDistanceAttenuation() const { return mDistanceAttenuation.Get(); } + + osg::Vec4 GetColor() const { return mColorVal; } + void SetColor(const osg::Vec4& v); + + void SetVisible(bool v); + bool GetVisible() const; + + bool GetAlwaysOnTop() const { return mAlwaysOnTop.Get(); } + void SetAlwaysOnTop(bool v) { mAlwaysOnTop.Set(v); } + + osg::Uniform* GetColorUniform() const { return mColorUniform; } + private: + + osg::ref_ptr mColorArray; + osg::ref_ptr mDotGeometry; + dtEntity::DynamicVec3Property mOffset; + osg::Vec3 mOffsetVal; + dtEntity::DynamicVec4Property mColor; + osg::Vec4 mColorVal; + dtEntity::StringProperty mPath; + dtEntity::UIntProperty mMinSize; + dtEntity::UIntProperty mMaxSize; + dtEntity::Vec3Property mDistanceAttenuation; + dtEntity::DynamicBoolProperty mVisible; + dtEntity::BoolProperty mAlwaysOnTop; + TextureLabelSystem* mLabelSystem; + osg::ref_ptr mColorUniform; + }; + + + //////////////////////////////////////////////////////////////////////////// + + class DTENTITY_OSG_EXPORT TextureLabelSystem + : public dtEntity::DefaultEntitySystem + { + static const dtEntity::StringId EnabledId; + typedef dtEntity::DefaultEntitySystem BaseClass; + + public: + + static const dtEntity::ComponentType TYPE; + + TextureLabelSystem(dtEntity::EntityManager& em); + ~TextureLabelSystem(); + + osg::StateSet* GetSymbolStateset(const std::string& symbolpath, TextureLabelComponent& component); + + void SetupLabel(TextureLabelComponent& component); + + void SetEnabled(bool v); + bool GetEnabled() const; + + private: + + dtEntity::DynamicBoolProperty mEnabled; + bool mEnabledVal; + osg::ref_ptr mProgram; + }; +} diff --git a/external/dtEntity/include/dtEntityOSG/transformcomponent.h b/external/dtEntity/include/dtEntityOSG/transformcomponent.h new file mode 100644 index 000000000..a898d0d68 --- /dev/null +++ b/external/dtEntity/include/dtEntityOSG/transformcomponent.h @@ -0,0 +1,97 @@ +#pragma once + +/* -*-c++-*- +* dtEntity Game and Simulation Engine +* +* This library is free software; you can redistribute it and/or modify it under +* the terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; either version 2.1 of the License, or (at your option) +* any later version. +* +* This library is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +* details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this library; if not, write to the Free Software Foundation, Inc., +* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* Martin Scheffler +*/ + +#include +#include +#include +#include +#include +#include +#include + +namespace dtEntityOSG +{ + + /////////////////////////////////////////////////////////////////////////// + /** + * abstract base class for transform components + */ + class DTENTITY_OSG_EXPORT TransformComponent + : public GroupComponent + { + typedef GroupComponent BaseClass; + + public: + + static const dtEntity::ComponentType TYPE; + + TransformComponent(osg::Transform* trans); + + virtual ~TransformComponent(); + + virtual dtEntity::ComponentType GetType() const { + return TYPE; + } + + + virtual dtEntity::Vec3d GetTranslation() const = 0; + virtual void SetTranslation(const dtEntity::Vec3d&) = 0; + + virtual dtEntity::Vec3d GetScale() const { return dtEntity::Vec3d(1,1,1); } + virtual void SetScale(const dtEntity::Vec3d&) {} + + virtual dtEntity::Quat GetRotation() const = 0; + virtual void SetRotation(const dtEntity::Quat&) = 0; + + virtual dtEntity::Matrix GetMatrix() const + { + dtEntity::Matrix matrix; + matrix.setTrans(GetTranslation()); + matrix.setRotate(GetRotation()); + return matrix; + } + + virtual void SetMatrix(const dtEntity::Matrix& mat) + { + SetTranslation(mat.getTrans()); + SetRotation(mat.getRotate()); + } + + + private: + + }; + + /////////////////////////////////////////////////////////////////////////// + class DTENTITY_OSG_EXPORT TransformSystem + : public dtEntity::EntitySystem + { + public: + TransformSystem(dtEntity::EntityManager& em) + : dtEntity::EntitySystem(em) + { + } + + dtEntity::ComponentType GetComponentType() const { return TransformComponent::TYPE; } + }; + +} diff --git a/external/dtEntity/lib64/libdtEntity.so b/external/dtEntity/lib64/libdtEntity.so new file mode 120000 index 000000000..0183d9681 --- /dev/null +++ b/external/dtEntity/lib64/libdtEntity.so @@ -0,0 +1 @@ +libdtEntity.so.2 \ No newline at end of file diff --git a/external/dtEntity/lib64/libdtEntity.so.0.1.1 b/external/dtEntity/lib64/libdtEntity.so.0.1.1 new file mode 100755 index 0000000000000000000000000000000000000000..c691fd25239a84846caf0531e11702b4223a95fd GIT binary patch literal 829752 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 RMPbQ0+{(U5m z;AyCkJMh#4@>p--j}uQ5IS|Z@MfZ5%Y16wgJWT=ncs#v@5`w4B@p#G*)9Ap{#y%9@ z(Yi||Db}<;Yp$gDM#63@%WC2grBqr#_({}c)Q{#0=io??)BqqnxQ$kiAJT18nb(;RZ18jI2Aj8%JPot=r z15a&P)bzhk^4i)yogFmu=w$BCy)xKuVXI>Y?L?9%~dp9NwVXqkEHm{qjgDapRPm%CJ~-aQ5+Vm6xi7Cv{Ct) z-zmeD*gmcJz=fym%OSWop6&@C3wT;6F*Y}zCS4z=@dzZv;b{O8ljEtAkd+5dcU_A* zO@I2WHayjXAqf~Bcsie&Iq>uwMH1hE}>YQd4?#8X2_vg4_ir1-Y3PKu{eL{t;u z=@YsohVPc;Zah7t{7^#~uEcm6wAh8GFhS#ur&Bv23wXL!Vs>sk<%lSb5!4h(ad@hS z#N>F|3zX>j?%H-ef}tbY%?$k|z7(7&i+vDrqE74%u}uGiw*VDsf{Ja{N*QM!p!$~T zIY9L^i<P2J!Cc!s1@QT>~&Q@7~q&VPBM`Ci|jSw;zvdI3?cICm}6#C_+|L=Y_{I!>n z?Sa4RIffkgtH+|I{~?k`@K;sH9r*j<8sP6D20lp^ zzl%^p@K+L#zZnv#b{Mrjkipf`mr0Txf2}3OcMMHZV*E9sBc1?%d%Lk3-^3*XGutFN zSEdTzLS^j|;bK~wx5z{dmFG5lr?#@DDa@_fZ z47e-HzdyIDU}fTsHmGfu(dq%U5{?=N)aJ4%+&Pj*p!STAJD_$y0Bvo+pD5I1z4#_a zznO9TO&(C&^Lh+w@7~}AwGAjCPz$@Ew$Jk0$F(wbe_Tc39gVw9lI&1hCn>(?KTHa> zrF8!jK+RAbGT(PY?NYd-z~JS|1}27Div=#Iy-Lie`SaGal4ZT{=cC9;FM8eh)x{_R zSe+_9pBq;D*~d=Je?n3mtkxqjIjr6gGQcYO{&-pV`jjrb=|8`Z4PQfKJbU14A~kj3 zs|$5Pa>3 z$Jdvfq|v0dc*Ntf_;uiGlqA{lb+@GWE~X($Y|3t=&z=BZ=O_-V-gV>aN9FnzD;t*> zUmM?Y;VXCvbV-h{`!7Nf;Oj%ZbQiUwafzp|P>lh*8abqBERy2zH4ur(@pXlem4UC_ z+Ep9KfYn`e=}rIV*W2(_kJG2a|L>~eUFTC%;HxL&U0q538%L|@zk}ove0?J$csL3~ z*OLo@VyiZVL+}hyt7ydQHx6nugYb4CtgF@h6@{>7DDc;H@d#^XrJ;l%Y)d@C2J5I> zvslEdnJkAXShSrR=%n;W^v7q_kR;!C^q2s#Wn^s&d2Q#t;XA|?0w6Xp63`kF3wf>0 zWi$Euz2k(~5Ni|{TZV7EvTY8C;YNkLaN)c6%^1X3pY=2GGiDWgE|Cd4;a?~Mi1pH| zdC@xxF~5l9Q2lfy3B-nHMzvpP)kJFXn~Z&}hi&AyR5ejB68riEh~Zk`5!ugPmi?+3 zgjlBk-kvsmEs`PVVZT17nhyJAvM7!iCV2#3LxtR7zj{C>>n;3o+OLUNaRNNcfle2? za;!}+DRebLfhpI*aKvD zP+bSevRD*{Zj(F$vO3x@xsWmnGFfjn;VRqAI2RC&1KB+<#6Z@fyBElE zQ9?kr+6}T&YaXXx=OlTzES4RU6=kY%=}F1`kgC@k`DYesBN|AJmZm=Nx)X zXVq4=IkX*;;&6B_5|iVwhL8b=%D$Cny?GWEGXT&d-E8>VB;(Wrf4^`%Iq)}|MNNMz zl1GAQPYAig$lV8&Tc6^O6MwI9+?yHC170!w{iWg^yQatR_x9CZ`1=$k1b<88@z+cT z@@!7pZyhPT1ApI2k{y3*CB^s5+ez{FKGz5d@b|Fd(C`g6{@TJv1&lf=>z5dRO=r9C z_Y%;<2Vv)OB20p^Pg@`#D66B_`%aYYVn;jG{|-rUC|iTXm^q zV^Gu2Ckvj7L9KIFFR1lH34z*sZm8|ER&%Cyn!1N%vFw1_y^>^yS|3UAokv5J*wkG~ zpFRQ9PEi~dyzYkDMwtP8-zgiI7-}nKxuBNa61u4QRJ}ncXNm^YL1%Y0LniRGKriy0 z_R1m%o_|wQ2fns&;F|to zl1JhhAIV^L;Ok|e*s25(o%q_u(QRhD4fw?Hr9)?DOpW1dXBRJgRYD2D*W7q~_2(q* z#MkMvSa#qmO_J>RI-El~-)Hoh6633cYlQ^(TC6x+^Qs$PgShfCe8ZHDON_6ZUUcE> z8$u|tzgFWsWCLMW>t((ZVdsiC4y{i@QXImnA~89_egsnFnSj$@E5m*rqKj|(Z_Ksf zYqktQ5Bs&0nmX_`f<G|40O>vkb`;Hwj4vu5It6JMjS0tLRB1D!E^>3GJP5a2U7xj$(|IwH;?VUn5|g8= zP{=B7zoyZnunYkFRzpA^4gakFQyrd7bv_CRr>yM)H-CWXD%qN%0*= z>ysE?=hK}}fUkpXShMemmjp((rNG-VEBF>G!j}Nc zcjD_F5yqi&FC@j`s}mBF<116hJn&T>f4>zMGp7I9&Nh(kka6e%vcEZE93Wf7qWGQ% z$s_*$OG552Vq*Yh>wEl(f=t$%?{i$68C`&(7|8S_d1P`7WGgy(f$V#f5Rg6T23e_< zV;|GXh#k(R@Qw!mMUw0w+bk)*S80M0gY0822NHnnDaGOZ7u+E00v{CU>+y{ALLm;8&Kv z|0!K~(?75SuoBsiI79}u2h=8V@Hn8>g+;Nn>}a!R*+TAsT3w1`G(HPG*ae>y>oRt4 zTH$3_h->8Wv3h$fivhbc0(RKxy+7j~i^1-4NE&b3`lE!vE)!f`v9ymkD?4r5!?H$p zz;3W4*rfj+kGQ;;C0kJt! zwz$3{?)^Ti&xNQDarlf({+3vMqG1DsxT7K4RwzYR?aKf{y6dBD9gPm3NG?uXR}~V+ z#>gpF3BXu9iNRsDF_Q7QGW@-oTq0oqV>=su7s+V%!0+cAeGdGZEQyCO1aXuY zzi*&Ih2IXC)ys$9Z<~1F_b*vI?6aODJb>Tsr|}o(f78lDkQl}911OaYzt@sWgi7tu z?I0vB{GN}*3gS1HOAyol<|P1NWGmBt87?09O=Igh@VkyhP5+rWAkUB)x5#=gI@+TC zTEB2)^$ zg+k)O@4ZN@Abuxc_5c8zU1YPrt;KA3;P*6u)1cFZkX0 zTw?rIp-D0`UdKR+;aA(=&Y>87kA(aq7M73{n_ctFek?E!;iV}dzd&%Y=6&#$O^x!o-Qwb zuW#&u-+U}97!Geh4S?S-PvLKg)c}4)wBe%o-3JgQ!|&GwnG?UOgv5p4H<4ID{C4;P)$;qI}!PI@!B9YaT@b`?9NTeF&ZyzxSX*h2N@Al^4Iyp6-F)ci>19 zzkMVe1^@RX)Jy+Y93Q=Kh~l>uN+rYZiLyl3RLcHV6%rSIO8~|S;AqRsdkc ze^?}D!vnvca}+x8YqF^6Pit+nzY?Dla768I4+uv87e*lwehb8t&X@&w#_+3SQ$+vHh(!!G+%u#8G1Z;SE%%{ol#u#qYNbJ@ES%1SEc+BRuH;*5xn!-{{)h zzJ7ZErIO+IT5@rkiw;8K!teP=tRQ}KF?#@jyIb1q?|vCB9{5dT>pAedjz#f#b3e!< zp|1C$qb-Wxr?70M|NCTO{H_#FIwKzgDGtBY$Hega2_%iTzdw!E_&qk>{su2rt!Kk; zH7?_w4Z26xrgr@PASu4LfrKRZ-9#TY0e+_|4y`A;@!LbDDBq3BFek=ur;rQ39}q{0 z?e8vBsQuqb<;CyG4LtDc=Yj?J-9mWK|2=`f@PBD#A`KU{zwe?{GW<>ie}%+_ z-+Pf*LHtg@>;V8aYi`4DYcU%h_`Q;?=fH0*7B&5+v;cX;e>e~wZBhJwg@qsRyYunH z_^l$IbjGR+?D*Bs&O48c;rCcb8js(`C?WPYJs!UygtFOsHvD#yg{Z^+wv;40eovDW z-yc9i68xS3pFR!ki~0SY+$-`db6F@Ensh1&l$%8TD;PxQd=J8-1M|80c&fZvSc_zVA6 z93MA+TcK1k{GLcIPW)CC5*L0;0LBX9w=3q%-PZB*fvjXh;md1|*Hg?<|xM{2ub~f9aVx?e7{{ zh&u2)Uy|(johd24K|n$h{7$A1n*hHzDh~T;MIHF9s~qEo$}lIkztzUL@H>JyN{rt( zP@(pJ$Cnqs-`4TK?_Us5{9nR@{_nB;h5sv#j~l-apj0yaUP~@c{B{r$7kP= zi`fGJeDiDoFtUEzFT=$HziDhe2Y%PFDE!|hHvGO99c@wj`xKVV^nV|*;rD7-O55|d zl{86a#yG$;hF`tSv-yf{Aoc#Y%Rj(}J{hil4(3;f_O2@~MhOyzHh^(C!MqyeLT@S7-=49646B|@eA z;Ne2z!trfLwBtCo1FOvQNQPrJ0U#TlX|u;!Vn#ghdG&$ecJ{ zAS5mvPe-C1$K`mQyacle0ND2o8-53f8S%jHD7Kyhzin9*`=2vy_&r<5sbdts)hMme z_(VV5`y28Y5M(r54UHqA%Q(kQygZ~sygtyMy4#^=VYDCA6_^F1?>KC(`sn%#Q41d z6)ODxIjX$)eWa!berLh4CVsnQpg!Q&SB1YNRu^%E-1t2UrIO*dI=MLU`zLVc+UGOH z+J?jm;`b022&R8VBO88ai`nqN?^2FJ2YyGesOfKfx(&a#3%LWoohYr*_*xi+MED&n zo^{5Z7zr`_YWw@{-5}RzjSYjO@%VibB?Q0c#pCw?AK5tV??PFaI`I3VB-!!%n56h_ z8Vw93#%}?A+64H$QgN_oMIHF9rX1xoWtbD&-@W-R{N7C*CC2abs8Heef)VA#@5je@ z;P)p8Nc@^`GKk-fDf}(5%;;L(9uK|^rIO*dGr2hNdx4O+>~BLPRuI1zVfFw3w>Pli z*OKAlf#1@~l*4{L-Ulpd`s+3Xd1ODttI^RGwZ9KzlmNd|U=$MJcfNSm8PiX*<5&B` z`|gP0cQGW5$M2UYA^1Hz9>3Z2Oq}@LD+^Nxes@Tc9lskS#rFb`kOaRg>C+~_??lBR zYp5H)on(sgU8xLnV*Fk>*oEJ@#8G1WZbgL(zj+Uq7r!;Cd*HV*7cju@I>H0^9eenQ z;CG!kKDyzee()JZ6Q>Jqv(6^>vA+dE#rfO0Ne>(Ja#AASB_!2h9Jbjy5ZY1HAyc0~iK7;=Zh}$4 zcgaFq1IWmddmJiMk5hgl>lPWPd3d=UHN1-{3dd4{hs9$l@v=OUS2O21=3rdEgMeG~ z{pqFS!3^h7219>!3x>Wx?aizX6jDyayoojm$3%v9fkC`T5m`DIcu&3~#EXhlNzf#9 zmspvs*la%}7^R1< z$pd+7u)q*rg$hRFFQ}@}T+5VS1u8d-eoali^rTcTLC;$+$P#~>^%}Z@UGg@j>{};+ z!%U2F`F4@Nw=jx5^&MRfe!tS}k>AaV zUj(l>JJYwD^PX{IPw9@a-{D(NdChPHZ8{Hptrjq<^MiNBDL8;NKO8Vd^ki~6PKdSY z5gRPOEq^!O^XiJs0MB5p!*`NXte{x&5dpw!NT8@=Unb&L;Uv2VM~Qwd>qOsXv3&XH z#1Xm^JEmB#W4aRuqo||q#E!ZXO9G*e=){g$Ji)bBpKxucHp#BfA|n4N^a)U$#QF@a zglwpoSfA=jpHwe>zT=vL6IGe|v_nwRp-<{PN2kva;v%s=uhPaR)u$C17{1oSS--1) zjxD!7_rXVT=o5J0==7OQNF>(hn^MdjN%gsn46x1?yu0*igXyV!{WBABi%C4lZfO9B z?he!Ym$JUF+do+=SqBWT*i>)R8#T4j3BfX@rM1nS$Hfoq(Y;L&$g7`8lUvljwG5xA z!E9|an30)6%;jJbW5yVU{-L=nzzoavG3Dia;g_%$I{G0RZqIdWB8#5Q2WUN_@{#f5KkrfBVtuPZm-Ax$sHu zFC0T>v%>lt^fIFGPo_U5p#Fe_=#N;}tq%M1GzQku%nw-vSz`Nh-NCZ#&rWuY;j`{% z{Vw~nn6qWM=7-aukVBvS_Z^)+JtVw1Y<6JD|FIqbp zF_2^bOW-$N2X4{lJ9htZ$el;mU#ZFU%idR3e-(*G=36Uxap7<3k+SuZ_+wPRq2T7J zU&_Fv(=UtSCGNlL_LimJPVvxume?zoev7&CFQfm?Vh}&7-!tImso&uLB0ra@1 zegS%#N3lMgO$a5{@0&l$((g7h!1_nllP>+*aJDa_|6XBaD5~E{iS(Osl=gEin>ew4 z2YxS0zj5M$`NrSP_I2ski?e?j`V}#F7S%5s+@k##C^%9n^68h*p0vW37|aOm!@|!R za}69#vwJg!DUB{%;H#kD*pKqA>)3o*uGuBMxK6;R8wk}7AP^QxMF1rbI*@mf(Jr<5 z#(*taKWR{bJ?NZi=H`CmeG%wo+0p)TpUC|r=8lGhw0mxpSu3WnB$GJg%@Un5d- zv%f|V<#Bdgs84EcsJ|Szt==0($>J$k_vD(lH47AVme5I;(2wEkOQB+@$eQr$5%s-u z#8Iq_z6zMvWFo-0%{mJ+d~V2s())OlCp4~dnOXBEu52$e zs%{UAU6yy2G!dQ&Ad5*MM0wiRtAt)bz!XtY`BIR?!w}yK@!0`_vpi$SXi4%~Mh@E) z>;s{5Q85cuJ+62$Req+J4OL?G0}`xrWx=@8`csy__WicD1@)jXnZ@ zo^D!03c%+v2R%u@2L+m0El{9K=!bTT)Jfpq1VX<=Kj-rl0geE9v)KE^-NfsX!#Y={ z2eP*TQ8_vZ$9qOT`qNZ;uB2o0z1ELEL7g$H*cKfe=j};cdMP8r)`#Q}Dq{Hd3|SrK zcWoEi)_h}bXnz;LG_Y?k`Ye!ZR9znoebr?wnr%25CTOG@LsN@SlkY+qmDryHj3MaH zU}$Y1v^=yQbiwSe^1Eek%ik8nP(p#uvL-Y}7gtpyThQTDY}We@whCpS6*GhPEr@fqy)bt4KS zvac6P7}qfz_lQ^K7>?U@l5IGyLlTA`?dwC^p-y7^x*cZ4x`D2&vage6K>kPVYghE? z(b?CRsd*Xp^>M-|fqmV(i}d~zQ*8G21&mMYH~5COt`__H5l5YxO8sp?K?Ah<@@Vh+ z`<42{zViI%ME146#C9DWdb+rwjt))JNwy9>1W?kRF4*d{uP@=Ag8Yg$^s=w32xeGP zoHZVqj^7eiZu>eFsZsm-D5=2pDR8Z@eO(^>uiDp*C6v9Q_VrWD!a<{ICVapw>qh$h zFg9n2o!w?lL>w<>Y>v*p_JRd*+t=!V+JDb~{f34CkeZ1>VBIBN|4Qouv9sH(X|QWC zmCI{iZ|EJhuPuReZ~HoiezWPXe8?B`Uz=heTSFj-ZP1B*y+*<~%D%pG1Ov?NzfSHP z9f28_fn}V19fSgj?CV#YO`QJg0qP^>{1TMtuRY*%@UuD0gvqM)9Zq5#UQzzLvbQ+RqU$6PbXp{$!Zu?rajh*`6iVqB>VF0AsVGvj~waQ;$jn1CGh{4L}cA;|H z*BfYGn^lHMxf62|?P~$npd2+SK0wx|(cv-uFYML!m1*lR-mH2M#QouuKlu;=%YViP zZrc|%pNJ30^1rLq@=~Jh7Kso10+vDjz27I{{i*;#ZIqBbj4D82`&8XNE1%N|$75{i z-@;N!wy&Qw)JYhRkq`dXlqBDlYZ!V<`1O+`eUXh#j9yq6l4MuDtr`o>xJkwEbFXBro-l1ZP+-$1CsN9E_b!7y-owr-B zOMn(%JqjAV5x&CL*e_F`V%PDKGQY?EFIbA0#j<^mo$T;2^$Zp1j(m{)as+-DS4H?+ zM_FUU+&?4n38%b6uCU2_5L0B(_y_Vnf`x3X%6NGtf;@`=hKT5OC1rRrQXpTXf2>&l z4CP=^{j+sFFSl7eKF2T4aFs%~{<)ax=${^JGnvmK&x3pF&aNpXq_ZE>%uZsctY8&N z*f^>9S&3EC(fX17Cu4r?N%ODpa}14|lJ8>8a-s4~RUsSK=k?UIkZq*qTWiTp|n-!tV&#yTc}bn;ZHWcGIeh37gD{-y)*s z6yu}xZ7==Jmtxg|`*3TlH!)udeh#x)^=`Q=YmqEyuzM{BfW*|8#kMIJ(kvyduz_3- zOULE$(qh|CqgC`Nt81Uyyfjc$HB-cl-`I?x@Ug-ruc~ZfMZ7-r^ZQ_uQaWiZHN&cr z;v21HYim#IcaCFYAVwgTlSXT6!wr5(2(absqlaX%M&ww5tn#irTK5HJ^sbE!B z^yvrUr9pY-F~rKPRATiNvo{PzVt?MLXi02vPR%=ScR@}%V(6uL)pr-%n_eleDO!V% zp7Kr#6pU(?l6O3|>ZONYfN7O@``FU_uRAvXtvIakB@HIe4XodR)8Z9r4M(%Vmkz)m zYpe7e;`^(ul^B1yp>x7pgptnwFqZ$KSN`*{`~q7(8kWoWWrC`R_HXkJWA}ZDd95t| zsd#hoSJCG)02BsQm6Vi%Qb7EIOyHq6CeTv+_Pqt7;`bK)JD?GY;r_0k@W;{~{TR6c zvoLcKe%pl(Eha)Z-3_G6k;9xBOuLuk*) z{D4t2GjQ|DK+y^cl53tT+o5xf3zkcHFdT@3lJjcvy@z);z-pRxs^P%`K+wS)T**59 z5SCB{!!w7ZAN~}BA9Vx{i89NwqqNcQoFZl2P#vEKZd>?9=WG%*s3m92T zQ;~07ENxbV#su7~8H}))cc$+y=$KL|U@WHjTho4Er8Nal;Yu)4H&9f-Wd0Mlq!pfA z6Z`hjipbfmGEzeAbC7aNsC@_g48ZPx{M;34pNpT~1^Y|$s)X8KWIZmp9+Cra1hNkT zZK0kys%BvCSk3&o;}nE*%_W)ZAu+t!1`-Sy^jB^O!>TWyiFJmdLAz6*;|_9J3BNHn zbOa!2SBgi6im+X1m6ViT7zYq`Ec|y`;T6>Zh~Yp&-U%Ei0%kk~0(nVk*VelW?oO$c ze|!w$gx9fH=3;6flsbgu{SLl~fG-!T@qnJ_eNg#8KYXHk;sE?J>4_A)kz}^7+%9`n z+Qf5l+K<`3id^@^i~nZ(s&f7B8c@>kt-Az9C89Hs05wMqv`WB{ZJEBNFq0s~3Aury z!pwTS#6P5-#!IGU=`>z9i(J#=#eM6@J+5;i*J#2V;2m`b;T-2017P$!WWx64z_S=( z<%Z^{4nSfcw-QELb!#^#HltSUAod@dqjJc4J9>ftcx~CPciXP{L@-h&1y#zm*$&Tb zbFmr$VQM5%cWc0Gm%}dB^4;EnmXNQZXb*lf7+RZ@nOud1MbLa8mF)#q^}s3}6_9O~ zW{YOxN=tY&vhx5y`m&xz$hA(Oa;E?318{+PFgoC7-H71=c=YA<9tolNiw+~73d!RUsQA#i#)<2==3b=@HA@TKj<)nzZ92- zDPR<4vMptP+z6Znj3+YL=mBFvCL27Ey*};X^D$I&!56L51A7K=I^Pr8Uahb;?PJJn zf!qhpPIy?pM00*3b2DqmUXxbntBZ>^!yyam+m6(b%KynFFZOelp2tpvZgvD)@9hcGF&%*qgtS~pb~&&@8hYkt_hAj{Jg!^ zeJGaOCNDE954ZcQ7laCV)@FJ|2Ehf^>|6i}Xj3-B2`;>96^96sf$<|sTaQSGIrZ6# zS=9g*7!ZrK1PHy@aG6k5>=s9DgoHS@27iPF%hm(3bi+IyFyK_EncxcJt}HkiY#B5G z{0b2jjgwakcFB4TMj&Wj0~@0h-(}U?%jrYeIaEHxDk`F|zVU6E5GY~_l%)`(!DcSZ zJevcbO&_%mxQzL*2n`Uf_xF$e(j#T~=i&Cl7 zdIR%&uHo-|kysEsPOqTVK>3KV0A}lvJ{=PBU!;GLp2KS``MEhR<3WpMJw>B#_{K4& z5FG=fdU6mE`(R7h@E_HSLWHz18Uq5A{$Ld}FqZMB8b`cAXQVg(sQE@sp9*^GbqsA7 zC>r!3)*GCErKjUSzvC-pnR%JLX>2aUszMY*F*5d6&Py@@?-cUV;0;7jD2jKH$0G{3 z%_ve_uL*FWK&0y;CMv z>mHL!FEa3$T*lRapP6ee$eagCP9QSB6w0l2|LluZ44)Wt%Q7Yw zEXM@!d0JtMblj9@iaCu1F~zW&Kxl&E0wq}m|6z8aWUQS-?-`ls{VhjdX4|F!=A*nD>pY%qs@)L9m@|1zK7 z8NMm--2dr(H}$vV^WEaFZS&oS5<;P8qtPzFlQFP|fiui^@OewEPHX?seD?}@dCqrz z5cG~XYDY2OeYg}5zV8ojeE*KQG<+p2o!alGY)jDWE~dohY2W^<-P1;7K#%W;w;{&x z23ZFxW4N6*Dq;)|F{3=ju$Tqi{x&d7hlc;e7^>Q}5lkDq@9)ymF#klyZ^Y!eE&5Bv z<*?`{P=v^GVHxU7EBv6m;?L3Im(!NRhNq3CaS;m>izo){b|x>Yp3Tl6lA^*jD#UU% zj0i(4+O6JeE&s)3W(F>iQPaFx%*@az{7*U6LpfA!Mn=UN1HeZom|U#P;B5v%d056^ zq1+ntn=-=eQsnSoz!+&Y-wU6|>WAfaI81M_{JNWw(?BHcV5STZfIJB zlN*|=F@HxL>+WAD3*cdB9$^p#h6d~JQfte~e`IJb)&Uu=3Z0JipAsC#QYbQ$4vF~e zY6i703++9K8IT3VyY9Le24x5AtL$U9&6jyu07Z0t=)&aO-`@0p z2gh$+=*DpX-2ms@Xa^imh~gL!rVA5V5Qk$dR*j(uSz|wm_(1+M&-;(z_}CU+IL`l3 zn(S8i)BkkByyNHOIDQ1rc%nEq5%*PH9XDaFz#K^&Bh*xCWi0BH%a;6Gl9a0gOaAUh%#Q$IX9o;duK(%I2Hd{I9~mkf{}+k{+q!9;8>!nT|WFrIDSI{4{A~4 zw8yvb$>~4D@v?V-<2IJySe^5Fg!P5i$l4l6oX9rECl>=nofzxEY~Cqd|JIXVvF_Ed zdAqT=5`caX?F37r=TGR)AilEU6=2r4Gcdsd^&1TrGUVJ5iyHcp!-fX=3_^QJ2(3Oh+;N z?q3e#`$+6BFL4d0*cl|=FUz-bh<%7PCkQYH%@LS6Rp>ZeCuzZvQjm^icq^8Yi8w0L zWDbe3?LrqMVf{9?-B5qpLKVgskN3cwx`hYu87Q*1Lj;v=Z}jlPI(u0(+uot!ACgm# zMK&Mk0qi-^ekAZ@nKc0`bWRu@<`F7hY#r^}m;s!L*FjT)4|Gpw;2Afjxu-#k+4`Rr{XygKgV z`5Mj@co#21X$p8E2PRHL#=JQSy|vOhQwKNHtmWx>*_|#lmBeEsVG!}YHonCcieIay z6(S%}YPE;3VGKl+iNs`AN-S8Kxv`7~FGKVlT*h!;$jT=EKJ3Sp{E3KuC!h4{M+wd1 z8rvpyxFeZ(RX$tBlUL<8pz`9Gs5y*X+(OJzfTq;3sIUJ9#gfCS%Dt@QcpsoNJQV5D&#Dc9C*{Ek3?2o_!p&I%P(mroq;q3?IFPHozv89H z4VQv9HR4J~gu@BktbnJY9&S;ck*U`2P?isZ zo+05&APBGHpUwQ!88U?*VQfahYs<@mp-u=-*Q&~W1$skDUD*VXpJt08D*S+IY-w6y80yF# z73{1^EBp?3kPLia0{HSHWV0H)p|()2N*lX^rOj!XquIfY^;IiWR7Nf zrEPpR@tXK7zE94k?=UQf+$JHH|9Jhhx|Hh~w(HrpYYt-mgEaCCjMD}G(eRDtui?9k z>pNU$R<{bn8plNIa7`^IJTVIE@7{ubc*}0+5^zcRh&BR?$Zi?a=4BZ~z-ck2za| z^@fVnV_Y@j^8jin&$gGKFz3@5OfVK?vKi#r_RZ+tTyuD4-=KLdB5nZZHQ199T4DXY znMMWvC9E^npu@@Vn#=(bWm^MoV)_v79w?@!H=bfhc#TUQjH*WDlO-!vY!_i>2zAim z8%S{npn4TaQ@s1CS@uk<-0_eg_d7mI=q%#Mvjl9DvF@Ne*guqm0;QXMXzGsg6ahAj zY;&xj2#m)ET|&RNThs#;o=NgC@w|BD4aP1Yl?@uRK09#ujYac`QM#t2k zflYus&pTR&dU&Agv+Bo~?}iB0jjzE{kH%23#qTiC$Nq_JJYI~ekCAEGi`*lz|8M4sWO5pQk6p1{$=GwZ`L&lPn$LT+shfb7vo<3FODgMt6- zLs9SX;Kt6#_CP&~(Uv3#WFOA!68!My(v+0`_#fFHxilT>SYI*XLW8>68b&V*Z<}`s zMG;wd!!^BU!O4(<12>)p)1E%020Zj5PGTLog+gW{%YFT zDL_M*e?%^|9=k^xOZFgOrRgg@jo=&#!_qF5jPRSTf9vrV=3Zc1$$Ap=ggAScUBmYR zZqfd0jdE69@Rj+?HwP@s_g(T!!Lm!JRXBY={D|lqAuz06IW5*fw~H>}FHoB;A4|GZ z)RL|?TEqH&J_VB_u3@=wo(Ij5TFap|!kgiwsD1(68H(;bO8kWR8~s9_1JWbL&N!*0Hl9r0fJe-O*@6z;gGAVl$(zve>?xXHkxw z)v`#DXq$YWe zj+)v%`w)_f;U}$zM90;GL^wG_8*$2MwRoKsmRNVNVm1Ye>e(c1>@GBVcsl;D8fA}H zTFrDNts|o1`_DS5F_IKc;dj6pmh*|FHgq*Y=Vtq!YUcb^aO)e(slgo9T1ix;SNJ9R zpAB=^d_SC>3=5&7)bfMCghh&H4wa z;AhY>S{br<^ewDQ&mCLfw-vRgA<=Vb6{|a}Iksw}y3MkmK0-+3d;^b}J^q8tU^}fa zHrYg<$AuT8nwSEU&>qV(6P))viHvCd;|`DBhOOV|Po8gmkldr@iTv(M#4jhpFUfh- zbHGj-`V2^q@%%?x`nVY|WGg2@1=tzh(^$&dJUH6S#_gS`kwr3Wx*EK!hqo9FMXFRAlG0gdw@#}(;*2Uk(8jL`;T5+{cbe)H8 zx4q8bQC{%&pLrjnxmY02_c0!()8Tp_+{vl-LmF$4*WCaT<>~ira`=m-bD^{DqUC_N3MBkXh6E9nOg{ zi66Y%la`JIB#-8XXolNU-R08UPbmRui+{_%@7^!lDDHu1CQ+N~l zQHTPV_Hl6yi-A*D7S{C^XgMaU`cXrclmriyY-SA=4|Y}GUg)Vw;WqI7C&d&B7#Z28 zDEnlLn~e(FRL<*##3zu5%hX6eSUX_XC@u%L$ddj#$0d?pPUd*VufcKO zEBx%Mb^~Tj)qH4l6rZWIC!}knehm)mUg4{!fNm0W5c?Fqc`D_Wd*+9`#qLQLZXdfR zzi>-+A9|Ncg&XsZ^Aq_|h42Zn@{}`NC3a6e!h4>L)<=E9J7V|LH@qo!&vpo}jNGSJ zlR8i-qg4f}r_`+Fs1Ddc>^l1pJ;IMX9~tS`RkHTDe@%z6=t>kS$6q}ZYO`HX#Tq7QyTK|^5c{_e0X44 zep+!;?Qbw{kcWLAUDMmVy&Wx*|0~`j!{K+TeInoGXugbf=A@|8+~jQ`vHpgy3Fh$7 zyM2L)>}F|&y{W6=``~ya?qR}Um5_I86UoO*atK4*f)D|g_>J`0Zac01vyYUjSNIkK zt^u>wgX?@L?G|B6d`k0;Scbr5*vPeu*_&~JZtx*65(5V8E9Rl>4QYiJNE>4m2Mp{8 zL8P%OE)a~vyV}@t9tdHQ&yh9G8iWsH-^8)zU=^aAUOED@au31AD~B%nTGIVUvNqrk zJ_s2^C`O$!S7N=vbt^VILRfJmF!7s%u-BPkiWb@b^uOOpNbHyb6z_aeH3PAAu|XdUir%i(%t zJ?{uEPac28M&1^^FNfaKf@9^-$n8#UB z(cvNmZ*5M~bj53wA7#yFx$&`bs3K+TM`>dRatZKk)L-0_c5hC4+S#z^;ZG3XmPM?i zp@#vPx%`lgy{&JR#GTfuPeD1jqPOyKC7xICMQVHB<$qbcIofgZA{WmE%o6J2Vw_OP zWrM7?&DdO$?|n)t3I zra~uRT55X?uZ-C!88oj%{?vIS0!Fd|p#pX|!Nu4@H?A;3lNT|`$au1j&~cHB_uw|; zhyOsn7C%J=+wm7lLm#f>LzC&;2=FN4K-`F|UDZVa;Ubrzsk`xuiWx)#-+HkOI!chD zKbMk5MkgQ|VrNNWt=;K-fy+OWG9l_SPjN$mCsd>=G`Y1D%or!yPLL2U$cHHM4YC+4 zRH4;SL06>8x)0={Uug0qMLq+~4&esy4*PmUB-A%4QeRO)4zlE6ldEM#PiM*BjrWyq5{0TL-bA#=R^8m)!d z6PdH+c5+wV0u{0HYncI22S$=`-8Fh$AjX2)002_5fbX&Cx>AK3x;0uJO&+~2$cdF~ zrt0k(O9?OqI~(epIok%OnNx zi0Y^x)*zpTKTGE~i;_GcF9it{befd`7d_W}aX;=EWT{4n-+aBEI2I)q{c$uzs;E-y z)sv~pHZ)LmjxKgngf+VJM^V9ySjr?xL8C{@qtPSRA!8Y{Lz6f2$EcM>Gh$>M5LpZ6 zNnU}aej34)i*b-!W54{s3h>vc^)MSaG&!AxjEs6G;jXA)E%HR((9}gz9HUZxjb_3O zqf%}s2Y3tP8Y{n^8BnuXBnj8)(d&W~5NOW3rDQ?9SW2pJLuW_JqqC#e1+8Nxv!rA} z*H}spQ;du>8BnzXY1FEqClfJTq%^uA$_w2PxyFc@jcc~hc=<8WLzqGvt@*80{ANh<uK#wC1XHUKY!l#~ikGGzn9HPD_ub6|7~F;j2m88=AbEcjjcyuNWJfrFg;iXz8iz zaf#!tiwgF~(kxtBh4hXMpIH@b%*kpV+J?gr?o#P~m7Yaw8Djc1Dm}ltlphdHzeuGw z;2Z!sqUo6`J%bGm{?YWBDt!xk)|{M$A)xsG$w;{2YfO`2PFALj^?t9?@5UUO8~R0+ zU8~Y+Lzdjok1B0}N}E*~^pSEiR9d@~|Hs~&$46D&|NkJ2LPH8mzRW zXq`wRGa78PE&ETpo%ea4_pvg^=j)p0(~lOhWUd-+V?n1O5Sh%zmfTN6gV_>{v|xfRU9G)BGGWqe zrj_cTZ@KO(1m>>RlA_mT{)@7rq~+9^Zk?gLL9Ar~<#)AKhVS7O)79A^_7lB8PUw3n zn1||r1g9v4Qxkz)QZNl#C2waKbarDIYa9Cdx9%mRw^&WHr|HsX_GB*AxLy_KRJPcz zR7j5pd@|pzFZn)!U6gx)0+IS+RPzbr+FsKumclXiSTF0sCAND zk#!AwT=fab%&6h{S-c|9cQK=|(LswZaW~vX1y}?=m&~+EIkzbW^91+)HJ@}7oT7OU zZB+K6Hd3zpn$0*k;Sh~|FyCQTc$(u4ThAv%%65v9AblP)gEpLhLv?_CKf6Mm8C3Gg z5LFW#=#Ki0UMy4AO81^{vvroCN7KH-&SgpoT9l%KN-1`HFryT}xnpTv6<#i{l&Hze z+})P-LeyeV8{%!(Yr{>3 z#b7Hf+Rd+t4~d>p)|Hp3=?UP01B}{H7kt0WRnQhDmMQ!+tm%r;^B5JV`OuGMLm;23 ztO;hRHz1}I{GMo7Q?;I@dEVkGSW;JYX8HK$>(#nOzYhM4=Gls|a}ujgsB$Ib6duer zZZYUIWNy_q@wThY?dTnMt0gNSZ|3Uq7Ai|Ga!b;328y?>Cy!i_2p`fQ=Mue6W+np} zjMUg$#FG{gJ0yD&8S{R*$5rr6W%9nNE8ZBcf5{TDTsbi*}&&fHpFW+O4| zVGQ%?>DhQ5Yny+kHFwzdVIgCcjQ>hm^{gWdCa)8KK5uP#ETkuWWDYRKCNH~Abv|G< zq*|lk{Szz|`;A^rS1qmBN9=>+>=j*cJK&v~9m5#-{;AR6AZLFjquxVZ!jiJ4n0az3 zSWrdY9+AR-Lt|f)cG@-@95gQ#Y}?(@K+CIJ7xq@DUi#YI(V~Q^g%h7-KNEd_4ipn8 z%lHUaIJeNyzm_g>rfV?S;ZbII-9phmMvglST1!0;jaIJIx7XX+{Q3u@xo>TS1~C=? z^8$>9E27>k8ns=o?)v%&+8V31Eo#A;a)2ZLmzF;u@B_@C1f{}>g^=!!pNl)K=5eqd z4+!&J_ET)la^A?y5;dp?Z?L@Teg%U73lVDV*C{=7hh3^%)933(G?rq;oEYL?T~%Xg z)Au>_qOQs{zdySD&8E18H4YNX*HpLG^eye}eG1R~1t9R{L=|VIP=p*?Lr=ub4BS~gL2FH0Df0eAWtR-%M_Lx9S&^l(G>RA?rlfEYE(y#j++!x?A zs6AbbSx6+A>aZ!5G-Xq&+TBvcNBKYvEKpT9T~*iay;P%dnV6?yBw_V!l6^O9M$!l+ z(J1?xxUU;e6NF9tfB60C_&&8s{T*HRe*EOQNO6Ye^!Ndb&)=r0K`GI2P!TWp|M)Kw z@h3Z^H^}TRM68lL=uMJ+4(dNWUh#-~A8wh-JlHAl<8RaUMGY;evrj87S3*noz-BDh<$hc5W>4EHWTh6oEQGK8w7ASMU~Z8DpfKX ziBgxWTF9{_!Jtz%pgsh{?(81YYv{wqq1^9;@A8>l(DY?qEt7^$6Nl^lp!Yr)!hDGw zY7*k)J_byUJ{p<_{8wtK1YIqqsq&YJtl6DByORJwPU0< z{f=^pqE&`#-H~_;sU>CZs-Gbz4wmmzxDJELBgq=flqxUr+g;xv4)E?JWSm9_8=sGq zr6z1Rcfs4fJYr%&E4R^b5>sFT{a6k3Z6K!{&MZ1flqC zL+*&_)_^ze^4uv{-b2cl8(rdmO|toe&M|hFm+^w2le!6W>7@Au8UGvMGO6O9sl1H8 z+)@Rgh<)W{{Mo!x?}uE>fUF~kgZbO^1gd}!M3d@F3)ShNBAYNTGCf05UT+x+cQSvE zYS#AQIFN4NzMxu3@(|@~e#bb#YWIpNyQAoPV+6R z`E)LnUD+eG+SCsBncqaLvc8BrFU(4zR}g;a+98Z8*}WTUC)K;-kXNdtOq7PW=yGpd zu9UpGd71`V@<|fB2#QqVqs5LSgP`>>n3ww{$vI*xvp9l#p7OU)OR{wylHrBsXL8Ty zX6If}o}2iS9q-pavKQz|-cIFBYxhVfNZzq|!^T7Rl%*b9te#olnA}QDM0_bI#A%Og}Cqg= zc33LdE;zd+Cx6RepeA~i!C|b4KAcQHB_HEOe3Ghqx_S5Nsx{58rhJI!0k}0xF3pah zX68pH4(-lXa;s%6cbgcR{Dbx)Wuy73_dg@rDV{C$VZ_&SFHru~?#W--RRrfoihFzY zQQp6I8-5aE^c}Zd8*hTx{hDPmj~JZHdjTUPFGurCMjpV?%oTxK3Dk^w%Z!BG2jW7l z3+lZ$nmGl2w3-5$tQy@=)ZWMuwQ3Am^Zo@sUh4<8d`AyZ3}ZLzJFR|GO@&pHuaBFg zQfdNbm9@|v#4K^gpM?91k*mcwSnZybfaH8=>_wSB#h5OfF}yDQy#%go5(~78Ioil1 zwe9?&YMc1R#wSIyQaFu_T_eZ$>V>JKYvcq~%wb?%BPZ()!^?HL@?#M~S<|g8dI)06 zKc-0QbswI7`VWDjwL|Z0og1#jnk} z;s$S6fZVLBX8m}3nn1hEeWC%E`0U}Lx>RGx+cNZM4fs-WAqsOj)=vfa4av+e)B*WM z(Wt%i&BwQLR3bte;zrY2npS1vHTF%J2ZNIutfx9nv6k}#!S@S@65QQH7!2lg6t@Qv zdz-U(tm9VEjlm=Mf=jABTRwmBJYj0U;b@uK$sBUnNXvkBZG&BHHrY=F1hJBT0@;nv zUwnBg?*!+r+QH$MA+9pw{(N3JP2p`;4H!C%zPdbsPR#xZtSR^&Nq%Vsp;wWA*et1a z#m`KUdOTwV>G7=CkHz^3NLu_XFioEfN`~_^blBK+zl(t}_`?kB$Ny3CvB~?_;BS(5 zwlw+5ek0^lK$#{lgQ?4{g2+F`J5A|j8|fhM)J7^RJX7CMxc$g!r}W~I(`(`tbES!+ z!7t(eI{q(xKR)IIy?B_LXWy@hk6A$8vj)E(ANLyn-y>z*Jo3GOE7>ZtJj4Gd-mi_1 zS&Yyg_msYTf~0l&@^SJ!%}v8&ylZ%hj+yhBY9nDxXZZQ6l)H%kkDOkuH}Qs7c<~%p zGBnVPhC$80)hwi8J|#r%Y>#knE^S2+693&+LyXU%)WrZFmf(WH$vzj9^fVsL5>vpJ z415T-jq*=O26)nh`8P2hN1qf8M@=s|Ca;B#$~dVKIXv$0ehC8|621a_E{ycxJ<#?KFYosZ^rxWNZ+H#+$#GkFO5RbqeiTS7JVVOIiD<9DGuk z?2VtqZ4v5PeH$S#Rfdt(d*b6~?hn)hM!7R-Ddf#<*q@g-*PqLzGSJ8?5CuK^WA%aQ z--X@3%*M=gc8}x;xIIpw?RKN?uSbr62I-!uT8Uwys2QV@s7B z7*(PxO^ls=Gi)-0KFh-uS_FxLwex(f8SGIPG*rs{E3+)8-=>?=u)9WuFEBFjJwB$AE6Yw9ph9!)Gg^ViMgsxYJ-~4CqL;vng@j?EiAwEpInA;+J zpnHs0PlmQ7dmieNG z-&WsCUs1!c+8$2Ei(#-Amlf9q`LHBKKfY)dLKMVhZmQ-Bd73OnSUb<*vz0f|lyEC= zH)$xFFE11}M#vbZP3F+f3uxyBWyrb3#cegjW1h+YVh}X;E6ZD+<(8f}f8+85<9vA= z6$eYILtrd{KXA3;HY)AY@v|-%#k?lHCbe!2XkI+2IYg5hj?Mj2XpgaZO+`>Vuj%3| z&1-h5TG#wqiUXywriql1i}=U-?@Y(s3JyFCU~$Ng^cA%ym3}6@hSPaBY0}uRNfm`5 z4d+{l&9-YFYnPvH?W#4mRJxC0W}&_!e_m_vf4lyT#^02Ih|CcG7%R|aOb_Tmq#Q*7 z6(AEL!i(S;O1C@@6Qkk(!~B05e#YhH_v2#^5BFGbdlUkx%PvBU}@> zzc%N&>-JMZi4KbyiLNwI1|hFAS|xjuR8!t}MsItfJ(8PtkIuw>e}N=gMfamnX|rO( zr-*+gx5U39fB=fcHVYO|=EH8>T{Id=qGlfn`rO z@FHrret1pkXf>>LK}8QuX+I218jyo9CQ3i53%(ulqxU>N+GWXTHsrK@fLKoj+rt`a zh%lSWD?Oh6<89CK-gp4`gv}+D?o6$FFIDwSyj^^;rfO01bD)BhJxqSPqpQT*e$NXg z!*#*;pbmmOqgs@>$1o~*n;>G4$#Zwd1f~j{4Wl!>IA}Z=o#eFe(V1PIN~M>if^9fI zJh!dnV)`jHrRtgHzbC5}Cxa19Cu#n>OEAjLjpuyvB~ATO>Hg#zkxW-fN)1H|^=oQB zZtSh9m_Fwzm;>oypot9RS@n;i`C3PZ_3U4nvTdGNCT4>ljd&A#$H*0*F{*F5Mdty)l059&T@ zvRcggH#(-*3qB2BKJ9(PPd`;31YXmP$(sf@XyR7k^%?X_%4^XgLJ0pKZneAu{5ymc zpLGb}Bfft{-wVnAweLSw9@ z*#tih2+RL^zWnUIKQ5kP+WB6B$=|(Rf#kwQR(kk^RQgS>M~!CJ9e_GG=Kfq?PQ~`%-hM#PY|1#>|}vWkCDBhEx8~BSTxId=bScr zuH{T7h0ChDpJS{x&F%F&H}w>ug{I2l@5oRFNLH{$cakyBKHAa7WcoFr%m7XE19Zx3 z0`P1qafeet$o>PFN*I!$Wrojo;8JC~m23b%cHz%8>2E4W5n|(MX`p#OrE+^!H04i_ zRe5i)DSxzNAm6rn{|20B&|_KnxF;v4gew}r2B~j|BE69X2=~p#eA`z4$Z)pNPU16x z+zWV(WEm+xU-6ynUXpt(&)?v?EX?)kx2d_n+Y`3>Ubwyi2gKnqDJO48PuR{>Bs(JT zEZU}|4_TeU?a*g(1-sL0N{3$GmeI`Qd+~lLmAhU*&WvNnnnGGVp@Ae0<#R(6qN$U2 z;So_bjo^vYxk}Z7{$kyP_e-LCEqiF;KYHeVd2}Bw{0FiBSIJ1G12H=3^BUTugH*px=&_R!w0pR5j|7Q1j@c% zWrv&pmh+CJZ@*+o%m{QC>|Cu11hG5cRU7i*tY(q5RN1LwF<1S7$`W1uq7UD)@&u9q zK@#0|>Pu$W=!@_W&}x7N>^O-cMKjYuVZ=D%pxrd<`K#TTr|QMAASil9y|V73teIhp zui|qK{o)hOL$uE?B!gBuY)xb>CM$f8`z{+oq_~62M=QYDw}E{Av{fxO?Jor;BLGQR!O9VY@OFbu+0`DOQAj zg5B;`ExWMtRCJ*4DKeswR9{%aIx0*mI)HVACB^!`3Y4R@Yzr&pN9luCHW{V8vqht1 zkTw9k{}WXg3t$(9GPVGxar`~-Pbmhvd0m0#A-2`^6&l>~bX1ymOL4o4ru1ad-r@$oI_l|t!3_O($IQPNWxRd z5o$jak`#p`l(j@zGsAw@QA8mhoUL5ishX#dr_dyb*SF$jQ3wIFL?IW^j1(dc`o^Ek zeInMH8T2_5G7)`XD%JAxr4NWcSe7QkwzO1-yg)sW2Mdb`6L$(3%*Ey|>jLBvZCdVj z?Y73w!fYXq>0va-x3F~~G^_}!U$rD{q>WB$`MjmX{sxwbI%cZmO*bva-{v)w|Hg;` zjW3YJ%ckPQnqcY0WHH`di8clT-yoi+7;Ax6YvqQna>BE&xrtr+BpHmDJePAHfumv$ zCDlmH5?TbRqh&=m6?Owe2B!oTNJ(RTVqJPUlhx>~!~A^R)6<7E($mxB&wo~W`r`LQ zPZ#yd9$Z9EhcLkqJ-sE20ySu^3fI^D!g|RHAgPrRK~wAB{hBH*WK1VUPX{fBoOra{IGvmY zkJIl9sr0joPB&FHrn=02e;2|_x>nLGh+b68E4JYln8$ zWk#3gc9lJT*JOI2R)*6GN}5c6)O0WgExd$+s^q%0sZ3vvAg$E7%j|}4hB{eN8%^Lp z8dlY-sftgIO!r@a?TIg&7pc69aJPK{7WxMYbt1JT*m*|cXe{k&P&RMc%0RhM>jdfg=4r08*< zBQpKpQk#wl`YxA`-B%1mwcu|bOG;NHTSpG=O~+ViMdKA~(fYJmYH&qKa_F#$kKk+i zd;l>!eDTTjepHNkDcyI++-&tyyAi}A{sQK>3$@ltFKf(FvCQ3$fG&_T{msYorO&A5 zU`eP%6OuG&885LmBDU9~nzPt!ayBZLHjR8tXCyu*Erq=^wzy4gq4c*mWlnKAMbjc?F9=@=}VE@UR+Gq_A}t#@zyRbJ_5mRFKtEJYek zTR;sHPnB*S8AhjH_h*Xv2)FrN9&gJu3!|$nsA{*Mt|$rZZ9d{jaTz+oB(%3^%g03| z(e7G8(jRy%A9%f~CcUPI>VzHXp-Lt&ZbuQPCytS(t~J+Jr>mV%VX zFv^&0a8bgLtS()K&s#6Xw5_u`y{PFF&iDgWFzL$wrbDA*Lk) z3@o;b=3swmU>jG$({p+*+hufo=ocku;q1Az*{ypF_3xzBXNGl6VyK5vfQI@Q*p9pD z`#px5y%q1c^F(NVsE4hZ%1A;Xf4w_Dy2A!iitzPj(riF`3+XImab6uC1VwE$pic|k zdJgDAVN%h6-cFKQciJ&%b^8Meh(XWC@~np32n-415#frwkWExJZCd&%R@7SM%~x=@ zJCfAg9aic)?pykbQV*w8sgH9=&pnZwo_jwR`VA!0_f7*~khZr+#P6A^5CHk-V5;`y z7vlW{hd1D+xkIvR>g2u}DjYR>#Lo)t&ze-r*W&->dG_y_f`vIDY5eFoSWa}F{oy9! zdY)%L@vK-ccL=-Fdc-T+Lj1J1jstKob+B8=Ae-hE;-~p|Moqhid|z>l7G0`|D=rtJ zl;%}yiMy58#}aKHCZ^ph5I6S)a>V00UM~!A0y5Tm_cmOW4NN7 zgJ!Pf6Kri9Uq2gcZtHCR0{)WGh-k#$^c~QeTwLqJ-g#Ke%(A%!h4+QZ;qUpKneuiG zrrIWF@reg$ak6!CWv_VKU+nfF?YHIW7A|!e^Xg^LtJ9CCpFvbf*+2Sd5yTub7i#q+ z+10Ll{le43f5x|3Tzsg5G#u1eW7Bq$QZo_l^C;%H<$Bx`vmj<8EPZ&B$ZRyuyh)BN zAC9^0b?krasu_5i`I%@Uv7Ir4W5ua0+M}7vPcxB=foz={qOJ#X)c%_E9S74S?MM@! z8ZJVYZ7h*M$ejJSgv`s9_MHj@LSr&>L?hnD$$0HtU{TR45x-_(qHR^Y?N^owtAFeK zMmp5V9D>#0kLVF=d$UGpr>8 z);vo)b+XSrX6$%Ue%fg{PR^412&z$8{!^KHiaz^|>@vIq+@(j*D68}^n%IEzVds~@+)?s`oxl$C%elAno>`4S=V$LCwdhcW^fmMIRbhzMO9r=gL9$P8rMg$X@ zQ6)LG9@HVY8BQHpa)0SpxE})Ud=x*YKi=pj9a%A&cVCNgnU&nVL^UXIUk9vA?`-V= ztdMF~iN0&8a6CimUrT9eT|iwvN~!RM$DvGp!my>j<=+TfeyCc$k$-z$-+EU1mb9%B zL*~OOsOqqUWc`o1JED?5r$TTbB7d$^gBdtnOvlK1G%4I^1hpD)Pc6M}x_`Tr#1@Z8 zLMnUr`Q0xtlQ}fo(9vo68d^MZo%|B{@w+}_vW1(k3C>8+b8R?f13;~@;UF?@w{?j) ze}@cmKRm*~A~%BA9Zw7~j#5)q0XZF6A8*T9Z)$051DXU=2ZkkD!sy4O-C$c8Z@&Tm zH@6o$)@bBug&8ljQ$gn|w$Ms8vL@Az^g-p$F*7zQXRAIQvWG_q{reOJhn6U`AA=&9iVAam%8#gU5+iUmwN~s-PX_7{8gYI z*s5X$vzn@Xcq@k8szFy0&-3)$$#c9-YKY8Fm5XfqKcl|-^!QI?=tx^w5;6*-{FY?& zVPR{LGE5)%7AEo(o?i3fQ+tac1cQF8rgT{=_*l29T|aI+?MBts;<>O-y!}EZX@v!n zfe#7QT4O>6_8&zUk>nvkb?x3Y63L@tNXTfR1f`YRYi!GC`a^C%|Ha8@5*Tul%BGuo zpC3-vSZsd>6yvmh(q=m;!#p?o4VLl<;(cBDc>ZF*bsG*h+}{(2<<%dKX0Io%mtl+n zfmRRWRmADFh*>>N@CA--Do@5Mm;&HYj)+P~(yHFcjNq83;uW9h`Z`50+@)uhH>{11 zLx7AWtYN(3DLl@fvV5S$DjpcUvBPn_IbT`r>Fh9E@T&?l<+9!!WTFu>#Q56(AwN<)OQ zySTzBaU45;fgiLz2Bz1c=`vq55x9NCpu1s|NYgRTCQmZut+=R1ODr}p2U}_$F@YE!Hj#7=KWK3u2t76lbN4S**0vOwypamEIjmn!nRLpog?t;xpbJA}4!TqBqn1nNG6T#%sRH1A}6sMe2=Zh9maK~DTQ*mdxQ|Vdzql{8tbx0l&iqLMuHiuYWjUw1D*?K`^ujajwbtAFv>P*^NFc9A?~ar<08wE6K6{ z-9E>{_+{r?j@3^GwF%0D4#r;7NyhjAFPy(^yiKtKR1GrxsRdrQBS*V%XKnoCc~#r+ zl$qt99*Lh2JCkzbCk*&L7il5j)>3`$bq?*UYCtI!m*eiH8LFr4hb5}wfTe8m*_WUJ zP!!Ac;dx$pRq>Taqy&s6tNSR$CX3nx(b{&K&Gy1z*D5U7eNpG2weBk$=nnWgIw)t2 z_|16Rmv~Mgn3)sAesC|-_tA-}lBVT#K{Hye)QL1E;B9RN8tJw(9#CEPL**`WXvpOS zdlUQPP=)9b23-ws2uIE1LJ$1*erKMpvywGl%0OGoEV@ru9d2P#rM=m*z^N zaaFFhs@#t&Qxhx(byaKP?T?d6;C`$HwVPNAaMp*MAA}KMCs^31c?Nrd%}{`a;N4{F zMHLMDqbflN&2P;^QUj;?2Xw}QN+{=t7Sfd_>eEm6)9udR&nUVVz38VrVc~Y)X{kP4 z=%F83miRl%vb5-adC|Qqx?fXtzrN_c7oE|MBBiJ6C*8gjtm}_AH+0w^Leu2>pm7?N z2mIM*Hh`CY+o!00Kco}F6m?7~d-(I`b}5>(55V>l+PlJ?>zmK_7HfL>eA9e+@wP93 zjc$8t$qvfnB|>CLwuZ;Zj;3HUinnqml1B333vMZ>R#!#rxlvd4M3tB=4V-v4;8 zqJC(Vsu^-EWr+-Es7n2GFUr$T_t*Jb5DuXksxiqSYlMG;353*#>9``$3~o9gc^`DF z-xu(Ij!)fH%wHH~?T_lidM~$W3eZOu#Zna!%~F*ndoNB_5iQ(TD>9l#pq)C^V(>@=Pk^mZGZ;L@4OHzIb#JfztW&#v@#Ia&4Gp=PFY z#-H3Koth0Se#5ksaisVdO(A4nigr$iY8FQD$3}q;cTS^zZ++7=g3Qh@ zP?bove__}3q2tZ8HD9vuGOwkhBlB>DRQK#Fb`aMAOXE|o;VwIkKd_0va7l*RtTYIA zIqYhQD2D7lcGqL|gH>{y{VF=CE%&gD;|?@#=($nTPRZb_t{xR13713G&d(8UWtlq) zDt5mgp=4H>-f;(zBgc*njBF41_~FKCr;hThb~;1iS#5KeGR>znFU(!-PEk30w^V5q z!Kbs_D=0&`zqnf7S$vNo1(?<9&<`ni$jU)2ZFGAaqEconL2LMzpQy({1MV2YaSK8u z{N5~-Pq33)&O0RLeqvsY$@Iv{-Xx?Tm5!`Mns7m%@%~TpO&B?u(t5c73kgeuuS{TR zu*%9`?Y;p8xl3uexh821n1#W0uCW1P$e;$W#5;~fz*Oj=w?6dHOSruhevEFEk>ilF z^FB%$R`A54%iM-HLm#E%sfw6n#Xd@}Gmsj+A|It+C4EvN)f%n%29{Lpqja97#E$qY zdI;d3sZMO_qjbhxsVTApv?`7cb|2G0%ysV@zJw(+$&z8oHp=1tCY_3Spej0Z(S$Af zD82RvGT2w4kJ53&5t2VfD&{*R46~KWM+|kq%R-;-wWQ)c{Z=U`V<%yE7oz@FXaLsg z0E67K`t!iX{}vr#(ep*KGZUkSE?I|7SJQuS8E4 zPm-isNU%OM(p5Glvu&A+gKj@>?^^ZP)Eu32+k6c8YB|98AJ~DmO`zi+y#~p7+~1_) z%{Vl+P_y`D^yz-^O5N+{HJ96pG?(w-C6T+f1FC9Xfu2cF#v3*N(sF`#X%M&`9H~AI z>tZSM{%=x@(tZR@UDKUg4Qyu6>?6*R{C*_HqK zv-;WH59>6))gvLNjv|bxJ^_rl8d?x!i@^9pv{5A$f$?}HfeSkxsOvI!Je({)9+V); zyw6pVD|e@e>lyu-ZPDeBB;$dUocc=jepb)*A@*BMb@Vj}HxC|Kqq{z{mvia4v5894 zi%!h`4Ls=iJpis|I;&-D4`jS}Y`ItBqo0vM(?~MiXxwd5QE;R_Zh|Zr^26EM`FJk_ zCE#BKx9u=?^lV>GdDXgdyt!y&C?5_gpr~ORk8T=tBf^2A z*tCJkOn>U#FKs;Vm4%k-I1|y$N(lO~6xIPnM`g+@j@-w!kY1OWBuiVTh_VHeugjc) zy;jew-2^#GWk!zIGt5b)m$(y^7z#7+PI6N}4?~()swcH`aCB1^-Bd<5J^SL^VX6o2 zVA0O0XQ9b&SekUQH9lNKY@d6ei(tSR-^CtK6pM*t2vjUTmN4!hI|?Ff)58 zx!r1i->LgI{QV5wzhJ83?CB~IvfCkazew_2NBneMGPme5y6T;#(beYV6!|d*m#~B6 ztNN_`eoZ&m#OIz+T2u9Y^PnPvVsD?(-9;Jp5aDR~OthL6^)ex{R*+0Qf6}BsRnr{$gUf z82BHs3H;yf0smdGSV!<*mm&ykEeM;cT50hAA)0}>kf8s0A#!H6wfuFj{7sZ@7u+?S z%6MaFZ~V$wjoZ%v7aRQ>WjZ5ttzHE;YdR#fpKyRMAkN1lBkXwls%DoAF0g=PyG4E$ z%ui-Y^>63n)y-@0hp8t|5@+7bE(_ID_xjfar3;drLQtE-y{8Ir60R#dRpnX z+MKyZ{S1^J64P)BmgYLUI2GOc<|UVUXBI-_`m7h^Cj$}N2N`ExIX@-32I_*}_< zLsPEtpieS$dwC^Sj1I$vP5fklNEF>SME996&|h14xKf)Pb>!w5u$7s|HHiWnrv zW`sx>2ry%g0AyLLlK64EIjO>V4tkk3`9!nM{-c`Jx?G>|y2IC8*Sm5;Dt;cagjN zs}d+?#>TvTxB@v1SbDqgKXx-pGvpHty6z?jJabnsF-pJ)SJF>W6UE+;%TY?JPEJO`P_+>?S9RFSL1S$4r%!K~PRb%XBZ`P?L8snxZWb3` z;Z;kN!l7z*X*InOkmldtuv{;Sb*eJ|p)`8Xvqew*)BszaYSfb}fgI{GCJ3aars{xB z5Ia?KhRjvggC4$*2>uVDZL&Nmu9dmU+G!`9yynyU-Kg${>ck^H?Pc{cGpOJ9V)U>C zQ1+&4d2~wO&`C=m1AM~YR#T_*s9#+$DIxRab=(71p<>c@{@H=B&6gkl+S)bj6jQ_Un3}%9%95eO+fgZ!q9-nk z8Z=AKX~Xg!4LZ>`=-Hd|4T@TVGDTx&P&kk)1kuGnnBm#W|(HbUGgGpI%7`_V4T_w+_qyA054RF@#oW2h&n z-ptiuCNsIQa_*{Zda`jpcJ|dhEBX&EkU^zd0w6P}KQ&9c^_`<*Y(fc#FRlu_*JAnJ z1>jVNxebkHGn=j@_%mh3+kYhl2x4)Ytl!(hQ&7qTbDEN|+)qrV-^&g3dWDu9*eyru zjw9;J&cT5tF_@?3_mfpmG^IuyT{f{M8C0{9Ho37^Q=GT#=q0~*Z>El&L2y4e7=zr! zJ|nSM5dV>Xbu#Gt1WfaK&MU?lIaGKP?UKMDZ`!X*mtC58)ual7E-yf2I1r{68Sd*fPr*Vo>~o}(tA8fSJf z1#QKFe@d6?!g+rMXn%SK{t|g#dyU`5&$A?~it^AOaICA5iCUwKgYnvbU;$*ImdI;1 z{z2>`NG2a2mT}4Q%*n%7D?_hYBG#hvHm+}zc$@)NS$2off z;;qGd+(LYy-+ob;h*g92aSvta(g)>=-_x|k0EJrr^zj%I@q0epLd?b<@GgqqQ;&}5 zg9*j&S)<55IKwEm7ZxH5;%cDl86Gl$y#0S0KkvUCkM6%+|EI+R+ETnQ#c>%OY(u=T zYR`^@CxsP!%9Y{=dmD-R?Nb57%yxdZ>rvFe%|(l7KIDDlXTpaVCft3 z;lk2SxEnxE+cO!oOpw4E5lg|Z9h-fsb!YNRtU0rugd z3Jk`V2d6hKL;NaOK0LYt>bH=ZJC>ZAHCS}{_Gdw z#arK>{R0&c#K!+h^*3WPzo^99m}`5v5waafSKDNBHcON};j?8!)P_NCM!Vaa5KE#~YyzJ>hVU-bWj6s)xPN`Bj9!MC+Q0r05T$c%bRHPBf7oXbXd=B^9+koIm@^RBqG(EB~8vh|aLa?t$ zq}(>(W8WQxeb@D{FWw_Nl;>C4LYQ-J0Yz`$1x#M6M%%ISVpWhuej6dkp!K|1sr1+> zU7Z498Wl193mLNAA!bdQGlOI|)ZcgL{>yfM(PX!$ZUUC3X<%fYwdq1|634&&xE{YN z#v`;?hyAGwzO+ey*7WGl+Zb5#{i#d8;Rewkod3*TTBRAcX8PDmS52P_1$wCjfZ1{@c;_di*i`|59 zd5-jr;qr5kq}ZN1g~Dt?QDC8de}5g(dc>dQ?Ljw+sXVE+Sli3 zYL=O!DY}~?D_(FBv(~(LIt5QTI3s)GSEUaf-OmV3y zP9|EW^$b3vsL|p~g^6r-EO`nLF2cv&G&*<1rgAL{;$&BbcJ7{q&CkdG+mK{0pvL51 zh|keMON!%jlrkCl@5Sdh?8|`v-;2+2?ymZ@%YAjXQ1erKj(L?zobP@bPORStjQ>V_ zjz^IcSQC20=QsgM`R~Q&NLg=JyMg6+MZJQ(S-rd!(}W~{fAumygZr%UIllEXspOUL zd^ZVhDL))LsWF3RedwXZep=}nnPC%$hVeO6-A(Wn=e{Jok;^<`qcDPNZG3_3Bc#cJ z<=)ZQ!X&~iK8JZ;)w|Y*s&1( z5IRgmj#%5!3iG@u#OzpYnwfcCEG+fjPOn%}><&7-6$h3lZV>D2>A*5FbYQvOm+-Yf zobQ4Jp+3AWhfUlaWg2em1QQuOV@ORX_F?%}J0IJsT^NMyuRGEB%>@g2XpI=<+p5#Y z3E2T0M@iaxoRFr;VT_Q^Cw+AHe=9!7a;z0wjt??gl2h?Pp3o9mq;L87AYWH|Gh2@j zvXjsW82I=g7IQI=YL{uQkr{T|SHt)qLbU_o5AGs#$s$z44UqG*MCcyXh8=Pws7Bgz zbMn|V?7aj0Nq}=nGko&#L3)Ji^Y-!!i^KKZsrJc}r+`nt4wLZYiSX%iCDFQ?9bwWS zB@edw{2-pykPD$p^OBR+`Q0${4@9iq{b~W$#YH~KT=k|E9zfDYQRbR%c7sXHUC(#K zyu)qb_1s-W@j+U3y58FH~0xP;~)@{k<*FqUlzxRZAmMWz?V+a6IfX-^5qK}*Yk&m9B;qH3TT-uWi~TtAv8=t^mzO2BvZdTXlH%M8RTqr zVufT@1NlpCp5NHB-XBAE5rkq0 z>xFI5WG^i6T5m7F_wP2{jo`bS$wD5!w&CfM!Cv@1A3=BM%UT=>;oD%iIPBqR1^E8h zD4Jmgc@; z&j60$GeM^oWl!X}DBexvzu@gqQ&u);o|xvST&6>+FG=Lug!|BBaUbL(YuCu%0&MoX zRIoXnz^$N8h7g|~*g zR&X4Yaxy{81)nIpV`umpN|QbPLOi#%yW-ToYQdnd2|I#ew_a92lB7sprwcENw;gP` zgaL|kOW)MAed{MD*&M@uAwu`G|AlRUoA!Qfi+VqZaG-g>4U20-hqkf(&63so3*#a5 z`UuN|8J=#j69SNBoU|z}76CRQ-4@ykzH$;DX%%5wDmV$QU4w%|s4pcL)6ok3$A{8b_0#?E=spK~c*7aUa z>*~^#ZW>GxCyL+G(^N(*o!rZ<9AA8E?mQSClcjg6M$vXrP*G)rW` z)o?CTozUW|noP%gfxzlYS=1FFr2CPr6UI(7<0Q~Z;ptgIVT1Xolng4kA}kmHX+_gY zsVFW*2->Ks%6RQ=6IaUka3G$^UZXifX26bz$Jn+}NeM%rHWF~RYxHnFnyFGVlG#^> zTfRVbkf!RXc-t(ZG;4E`TtQ?rOe!1;YOr{x=1oXo|CQ9k>)jpX;R(Eupf#8VqWZAFwyA)}MMo^sQvO|o_)m^3|VUN@E+!Gv|twmuE4Vno0QexN< zVqCVp5;Y(QVIZum>Wa5LI)I`HSV{FQs>Mg}J{CtAprw>}+x^Ot4tInwR-L43bZ2qZ zZ&5#nK$V7BD7O9UG&HL}pt0F{1Nr;ME7h5s2v9rt;W$*@0-WJ0n(LnUqgW|Rdg`3+s} zfuk>O$FP2O9Nmc%QiWn`C|0j}V+sQ`r5w3=~zExbso%a%yMwH2y4@032P4=0IoJ`?&k-7rJw z$o3`62E}J4UTeas&6t2ok&VNn%d2PoLLfv|& znOC*fXi}|#Fe>(hN-JNq7Z7xv7ylm<1{$5@_U5TC{5zhp!^C_A`gR(H< zRytMM_i$qsuAgZRsx-`EKzMI}jriz8Hb3GkR%yfs-E?p`(safcaoC~xy!KqUoeDxO z+=p9DUKe3{&R3S_!Y!(BlX3o$rEW6L-?3zk^H#?t&q)*^L#YOe`B2Y z+rT()g9OTt^Nj`7v}n99hC*hbgkrQvn3uA<9SdRzB2vRr(io+)E?nqdTT-j{cLzPy!9lJTFVyi1GA zd*$!>ez46t!_hYGm|j?r>uei}=@U`TDn{+1$a^8LkmtLaP0)_)M< zs2X6qmD{QpS9^bV@uUc^v4&1w)OR-k=Xpl}^<7JbX8qzpr z$n-xzWzeFf*&hP3Iv5s6J6{{;-GLawwH@iDzVO-gwyuMbd1JUez}sZ7OEhPkhf@AR zynO-Lv-*?!jk@~UX2)U*pE4G?KOhZ&!+h6?B^qrhdzn6bH~UK!vIot|{){^SWhV<} zJC%Hq{!G#z`i&P3f4rPFFWdCT4>_T7>&i0svKpw(<_ldfTj$Us3LgB^$l!L|UagP4 za31s>ZRBI+sB2^+Z-v*<;|3{k@ar1Rex|f+6{BWX;k%QhrLn@o8WWo; zzN%?FU-Xk&$7mjERzS)F-6`@-w-=w~UhT17Xs6SB90I@~wB2@m9mJl-B=)}tgj>(~ ztU!3zs*iwh<~F`dHA>9`0j3!CDdvs{bL`aLclroSwH_qy3s@?&JAHX!fs~GY#CVuL zVI~aIgK;8eLzf;k6Gy$t;vsK>?SS&c>}*t(B7h}ZR}atKUnoxnxpSk;52B+KWwv!D z^1oEbKMNEo-XB4Gs(xIwpJLHc)7QsplwtI*l?D8~ zZI^<-=CQ{OeV9!We==sxo|=9CB>9r!^q(%K>7u7mA+`8p@MupM7_Mper0vjWxW0f< z`rM<1^8d6d<|cbTo=oqMOdkm&IfD)5eyW$kJgCxzJ3}}}dri}h1b}1jj2mW)W_*UR zY^gpoVsj_Ix1k95UQYY{A6wY_VdJB|l{NYT+e)@!m`n6YH;0Jn zELGDN%zvH6Z2@_FiyK$dhF%)xUC)Ctv zq5B<4xmN|h9{v;wd99Qs#bLL|8|m^=lb}(}V=2p@BI}mDLrp;~u*K`J&qXCYV2dvm zz~%GL$(Yf)AmRCEF-+su(q(QpYpG%J%8+&TB`It#zN*@k1Q{I<;0_1OhnLyetBV9? z6eM=wHbM;vDR8jrz4^l87Z zvAQNWrL3lE`NZMo>)^gcd%Tl_uqHvQA%jU?YdZO#q#y+%h@IZyzuT7Yv>s<-eLFtO zakm;N;P%rOf@{8v-AR!O_eDsa9Jv2HTf9E6^DRCAO8@WA^V!=L+Rdq^mSNLkT6CVz zIqTKxp8h_+**4b8{TMy1Xu!NbrqML0==aPu;s%pSKbITe=Lf+a@bso5%}F1k-1Gen z-7Rypd#P8`8_CVApEtocSG!s`G~?3TX-+1q-8C@6q!rctR|X*T$Mxqk!-9Ox`-p36 zGXMqjrGTiO?W;%lMY<*qrc-m8Uo=`2eTAFwYAHXrq9}e$Ds8?dVx`GsFm;CTDj4*w zQ-$g?TkNT28kb-vTd4f9Vg7r${uaJ-OZ#Z!Z5#N6y|nR5Kj5Y=IJ+XatCKr}Ji9;N za&^E*emcQjHmNY*ofdMqt288;0T=G86=0kt!WH1v?hpM?GH}GiR!XE-&9tDD!s71@ zR(zcjwerhKcio6XUOSn7u=;E3yrjWK^J~A&7p5{7vB~0X*RonbN1~?k(eh6ENJ&EH zh2bL2kxIc&gn@FGh!%A!_Bz*>03HlfQh*K*$uxYx-7;H(#EkeyXy2+SuQXTw4(eqd zfOAr=9j4#2s^tO!B=4kYMeQP&-0z-q^LU$k!uz#k{y0j00;sM4SSG(hBk(Y1a zida!yW~ygJolT?b(sOgWMExzskE#h}lM4H+hjymWfMQi=mz}e{j-zVxm21y+dK<5{ z!OwtCDhAJ zvyAyeg~5fJ%IGF(H<{WJ+y5pH6&7p~Zj~_-t<^!3rJ5)bY-TfoObUuVYor#;b z%Vus7jq$Qk#cveLgk+oh1dNrmH~kpm>2_ncA|d@Y8?t2Ms3y+mRS|2#+b)Zspa(_p z@E1cY{2I>?KIL5(_bm6ww8r>A6rW_VeX=uF`W0V^sf?w*jODrnu@)PIiO{_UEA&|` zb02-A+2slVDKYV}lpxcZ^CY)aaBN*rA1V|ET`+RB`*Ua&=&~t{G;O}oT*N#VZ`NnQ zY;{iR@UA{4V!UVv!=W-W1$Qk`j?C;%F7B1(`Y1L>-S@8^naAj~J%dC@kC`X$XjZ@<|fGEir^lpjo_KlB@b!t zf~O=$AHJn#wboXI2WHyoOB|Sq{jlnhrq_mc2ZxnajVw#Vuk6Y#@p4FtAYgVke4q}6 z)Zw{P@p*Cb<4ms+7uld)v-3TDT~eQ1r!$f4C`UWTQK*HFb}Ic;aCS-VtA+VVFpwt4 z+k}w8VZ2|=4p^16h!RqGfQI){RU4Z2tEu`y*}4BCCj5t-0Nds66fy(@F8D4Z*LsJe z+}^>!nyM8|dwMPKK+Rj>5FrdAyRxr)bb2LKH4n<|8>S13!utE?<3r@ubg(I>sbBR7 zgwCWrjiKPT*hyU)Qv^$i`xrx-J_bD#47tuwuE?H`1n~S4KtBVF%Q&||XovN*e=>8g z5e_4N3NuAS>Y8Hy$%G};=c|m zD?lw65fylq;zPH;$r}0T zXK+xoWzOwQwUeVpp24l7eKl3Lbn;=dLI^hW&>~t$Mt8cnB0CQ=TLiDjs+C~mC97U)x=BoCfS7CvdELWKlYm=9iCj9lpq}|c+$yOx z$|xpO_9hQKTi21-XA;?EGz5KyxLp9hZ#j!y+nD0hLWu-Cu@;r+-oo9B*HCZ~6yB5i z1y}vZ%*nR5VG)CZy0fn7S@#TYiFg>?t9Dl1+sWUi?X!oxz5$5Ta9Bq;-?sVF-!s+l#I!$Ph@IA2f9m-iXX2?R|th@%jc^k2Y0PkUZQ)j2X}y*NYNa8d9f0hGP{YP zD(I?gVQkQW$AH6nr-L%nCOOlKh$=mnX($`8&O(Yj3Hj*U2ecH4whjiuAIB_7hx@bP za_r%;LQHm1-c$-0IiyQ6wYTY&R^gYyMp+e znI|-1B6?59S|mWJt;O3J0&P#kW_BL)1Ct2pm)wDG8zjIyS&Z2yz4u!ix;ut;=Uypb zyVlQQzppQ{=WQJCg!bCbPd{TCN@qPE_WORm^|uW@$P>`w`uu z=NlbwDgKA%kEvjL;(yd|ym}%2hp#{0_AKwM4Md+u|45}fqxc{9^QNY1QS)=K1|b91 z$=#U~$J>6-3)CKq0TSrITc#84Ml2gX{6~|Io6#`=D&2bEk8LBn%fMvSGtJmJ7qh{k z=_K)&U5Z0<^h>4tW1Sh1Ojn7|^+s{As{Y-$AG;P8{s$GF3bx5%hh7}T_~>7V@j>*c zGyy*TRv0>ix9FLz;VYLKFl23VpEE9C@fn^FIgs?cbf+l`d?qJTshLT$Wn59G~HH#@^Vh zm#HPHUu`2TXKGU0U{@2dx2b?2HseIqzft^(3nY;>_voq}9DXS^9ZX;*)+2t!>!3my zzry!tTHU|bpTS%2PimQ3yS4tjfP|($OA!>C^yiOalcDqKCS3~SP3%Tb#K`C)d^AmI zd48sN6JOgj-o$gys79HVmbo#iU13#o&9({0^vH;AHQpvXXkXq7Saots;bJ#@Enar2Oi(99!IrmhAb=7z#vLB&TnN4zn*vyDPkwyn7h5 zHeLqci=f>vTuNhizc%>fRh#V%)RQ0=j8>UjY_;vfr_{CB3#P*K40L;g@6(MbgYXhh zy9|D-K5Sxrb&K#_qFRgN@s0Ets?keCt>68u$vH8-X~2uX_L>o=674xsu|F;QKmOl5BP( z{4M4ey+k)fp#9hQ#eq*+<99~;+cLj+-1qQ_!wuS@Bm$fJH2oX=qF(q`fOox^LlHht zc~K488o!8p+idA^25;u*#Evpwgg)*~2{rKx>^7UQjFDx)yTa9DZt`qg>hL^9r$>D0 zvoSY#evzLIo-X<2^ifW1Y-62GyCu`}gConTs}@fr4#>#C zwVW-5IV4-#_HZiwQuAIi=q%-JGCpcvDn9DzP%D<+llg85u`H{;JD5ph6LiO9VwpRK zj`CrR4EsqMKR-7ooVQjVm&}YR@$73uD*ddru4+-!B{ji5H6zX<@7hUh4jna^)ncp* z_y%HJ{|d#`j2O?$dFPBLBIn>h&?60K+G=$SG3!l$R#%rFj^>Yil*t7%cN?EW?)yT4m|D#gPs)NjwO+P#IdGrAf|20FO z_KDcbBvxM<+8I6<;?Df*@l9qj?JACMQi=BU--~Z@sxb23i*ND^i5EB4zLHG5_b`NZ_PM|_iS zye7aouymaQdOVv9`W%tz|CVs%h@kIsVfa_Ha-6P(RrIl>G&Zr3gF|yF8m&ec#fJBy zLGt0o;CD%XO`i`45+%O)WO~2nJ)!p9F*jSi{Gs)BwHt~a=l=PwdN;_XxV>ecZdv~OIAx7KEoo@KC2lKrsZGD)Q3eGAS9h^>2YcME?1@S>IYS2%6 z1WL)Mw2~+-xX3oCD$JJ8b9?!8Zj!y1)uq4U-bSdgVYc6qFg9Y0=*yXw&zEA~o*eF%&$TI-qyq_5sop`IZH-)5OtfJ@zA7Paa8r_Co^wAoh@%BPLYBU~C&z-Wu-Rj;34>`)aOlulx7aOYnBAj3dGR zC(_rt;G$lmwU_!H`H5#(0Fu=$Nyc7_aKt7%WUWa&W-D=Z13^jp~T4J z{VUO49i0V^={X@&aZ-(|kGFj;+@;f^FW3WWUji`|s~>wdQuKxT9w=|&S-VKvbr4im ze# zU@ey|spzr9A24d0vOwfllV0PQK=sKA=a846GA%bo^D6+==#E&X0cZ+SJ@7fT*dXuE z`w--{vo`|!Qs@}nSZ-jOg8dP_Omk4L?8*~_KjVR*?U0dunDQGVbnwesk4UY{47#&_ z7=uXoVS$R;%3Ju*{oys*=UY8!V74!K$z(S(@fw@psss3_g*#3;51bo{#XMZL0paE;EFXDj%b zN%ih)sHf4uW$UB``*k@?@8N!j1N+jte?BMj2#HsqjO_cO%xJ$u3)N;PsG1I$?)UKf zC3e*J57_s@KYh&m!gpX!_I7jY#y;-tokt10pAzTjdW5O^n7xw=w^!}S!S5Et1* zc?ZH}D97`c=haMBKr~?B$q$4?ne)n$UDYL&2g+9)i{WZ42BI?7*V}D)RIt=n=%k*D zvB5*4+3y&Ua5l=%KB^5O_aJukBH{qURq;X-!-q^oTk zU!oD&HmcL64u)@`ZR$8Fd>hl-)2%V*4lnk{2&T?rNDJ$2!BlCih3EJ^qb3*UXD0oB zdp89HE&ewa4Idif7lH(jkK_MR}yXG+-2pSe?wJ_VS zX;-G|Qc6qQV(`P_mSZa1mI*fb@txg??5B4yvv0j*c(0~Cf}aUc?GHB%41OUHAs73_ z@0lu3%VM8?%_N6*QbV*}-ZT~hJRT{J%UTPW19U8Jcw(A&ihS2TWxaAJ5mWJ7W5sgP z?ou>M+~m1xuSqr>&>}nZc@_Tc*ywF;IsAb2%SVdgq4-p(^d}Zh&6dWF`%X1B6mw{g zop6wNy_TlNl@F$&=@;F8psJ>WaWQ@B#E3K*W!8s$P!^&{Eu~wW>z1%(d=^g^x<%NE z^wo>J8TxXrp-8_ChV6ZzY8kYG3uYgM9HJ|3q!@yADl_apTw(1D<1W|#p$*+kd75^@ zJhWpfxMZ-~hq4Lc)pT6zd{#|`8LPW3bX(Q@cDXdQa4HtZ)I6Q)Mwb_kQw&57_Q0_=V*6G^R+f8*U&0OR-2~s4IlOmC!YqvMe)`r zU_NS*hoW~#m;f-cf8|91KZbT^KSwh=qWN9kp2%|D%d*03@c14`^;qo=5j6bL`6`*l zv~*r54Ezu7T@U0G8tEk}Q}pVg4@Zj`Q&vi)1mSV$5nYv`xnt_76YE!y{dil(-VeG2 z1r%_ssp1j_4!l}M7)=;|WLazoaGRR4Kt)DafxnzQhrB)j4kL5ezB)*!wAJR|4n(GVR`{Tl-q7b4flIWQ0 zeLn?w07vG}>XWgdwNQclb`9_I{y~kldyrQ9-sZOle2j)uhZT$t7uE5WrM}~Cx{o^O z*IQDEF(WU{w^${ix%|c5PuAQY@})}au&t)Qu_D-NDoFY+Hs3}@O0iSGr-Re%j{yVm zeK#@stgU5ES-G6{yYER|5<(qe2&KS)3pM;FH2T!|ID z!Gfh#Yud&dTrjkyB~@z>BKOvyv7!c{nzj^awVG<8scZ0t<@S0t6>YKjsnptv)sJG` za3!q4wV+k0TEUfxQ9-DHTlqa-XWs9-Bmu48&*$6UAK&|cyyt!1vz(bZbLPyMGiO}? z6}*T|TDyYknA8GMxckc8`XF|wo%AtGYzJ*`8%bW=zWeazXbJ9j32h-XzU;!y(UVsa zx}mIvq?<-X2aXG)U2FOmzTHxG8Q+NbhZj%Sb%InBgLCCzvJaDmeI zw-C#{t3~6qW$OrM{bEX=8XflB*>j@9-mHqwUM~As?j3(tEt!fua^NQ^_l1Y8+`&2J z-YZa0?nNpWLSN2at@S6uM6^|IUNVmHO~bm5hIei4MAoutc_X7wTsD?*);I>%8l8R& z(YCiWTaPowbrfs+m8K<1UEM;au>((Nwplv1`2D^dsu`|26Fb9TxNp+{IRnD;$8bDo z0N0z}V2$2mL_O&d_xvl+FADa)#(Fh%k|S=TsTZWp%#`>KK*k-ih2G;<0_<7<1L)$U-O{d?b7q*#dB9@#JxGGt0Max2^c4CfUIJE7Ba#%fC)g$=Z>go^7%AtvXsF;qOO;>jnq z+Z~UkqOynHpH9~3Q#rDSZmdWh347qEqql_)?4iCqrt*oVe@N4>ErnRBxuo-q`?WW1 z_k?+V*=@cwdY(zfxsFV=XRwW~a}P1+2Ncb|S4)c!I1sBC^UT>au{)8Uda#ImC@Fgo zc^yDc+1{&n*nucR4X@$tU9SnxEFE(!KA_|6ZiZGv=@GyG5IWuyB(wnf8tlPc1cA%I zmO1M@8U#M6splk?!A{6LIog&BN|W+8AtyCH?rN)muEIzi5-% ziP|+8>D8PaC|~u?ddA@Z_;*MmTiyBG&1c? zDKT{>^U$O4F1wpvSjMJUe6f>YQ)TLc+GM+N3OhY9+D=cvDQtt|90r&+IN%m+a0GmU zeGkC!itgtoo{UaEk}spUxa{e0hhsPZ@eGrM%k+YjTrWwaN~_x{YmRXLNs!tQQXd9v zYeAnH1aZe&gGO7m53ng(a$#AFzhuYX$z@ZgM9cq5Xi{1IlrhorCpL|d&{Df8TK5=G zvH(!`=#){>@>QFnlhy+}coAcn@QcI&HsNsujY;i9BNUzRD*vD7|I_>zaA5y3;=O=S z!k0Rh&BNAhiXOKnI`bD)ZBe?nR+_LjoF9kt@*gGY0IJW<=T`$cUs{&#p@c!ZgXv#9VI69FsNA@>3 zeMe|AKh+&3F`wBSNdN)kcYhI*96#xBo9`u#)T3(T>CMsB7D5PsRkKd#_~3fiWb+6mJRo|ZC?>&J)vPnh>f8Y; z(_eLpxr&=>>ZZso$g^5u4lxfkzDXDz7d?Pnsa;&nwD5r;6a$GfqgsGmX%_ZZ+^Z-U zm}#c^F_X1_cSm~>4%|m={hK>n=zk>_eee56hdUw*zodf=>obL~yVI)ehLCqSKC}G( zdKw*me@yabwUoNP%^;0sITGCAw}(?!)@;x#z_QQh|$R z==cMhoFan`Q2z|RdVd}|FEijrhsd5_zXzo9%iMY&_KWQXpc08Cb#Fso+ID;y@wCC5 z8vG@i85bH=aZZOo>vXPAB9l6MsyiX|sU$jWU&XX7|JiMdlO8<&ZSkCmF`_s4=o9Nj z0aL^CAL+B-(@J8+=w>b~4<-%;YJKcfi}J}ikjky_9d#L-W;z}sW3E{azudyG|WukNA> zPLEXNR%_;9mo+(im7rYhZgJ+Wi28Y~5HxzMen+lZ#0dr#aU75VNkkn?w~LwFp! zdC9|1)_OX9e3b`2Cg8MXDp9n_un0*38~P3IEkrvax`-*zvyCCfYAx}CCzt6+?!@y$ zsjvGrlq|OJ1b5jGwd)@l{ao%c;RBWlBbiLmJsjr#far*x;xL$pU(MvmC?=qcXJWAv zo=-|fIXINBg7cl<iktss#y~thLp#*UQboiTDw+O=quwAa9xkDCTgx6JPRbt;Yc(y7^g>=4)bfDO zJ=!{tNT%j#_klahG#LQ7*3uKW!K{ZiOAspG9G&zJLX*o5BJ?^RA29R@TxFO?%OB-4 zM?jw)*^d(^xft7&`o+M;oLf$I)5VtV1Ab-;FP7y)tc?h%gksSWqrn#k*T#q>qgd zVw6^Neg5>(_Kl+wV@nDb&7tP*dcNCgj@eW*<(J_XECb6Im6AH%QC&);f>A4~%L_(z zRNG|=@g$~WsmSop!!A0itMr{`EO^!i&pJItAtb9;nCIlZd6Jy26t(R#$e<1MAj7L# ztaCgAkir`Er-^K*w-8T1g0pWwRA_2o!=PyEu0HC87PT*tYDA+!fNM^!Py>gwb zT&G4`zvQF(TtAbOtJziwDpw`S9R8ImTOMCHWMp`9(mxL7N{iJdVSak zirwEbR%`@9;>>F$4$t|bD4q+XT8_3(3`3vRG9kNc+deHpcKvaP;wzK=WW7XO^Hz|zbJn_uN9He!yIX7#z#$8A~Y zpYtEEG)MR}jn-uYiOm*+m8LWc+I`%G%lvcJN=vh?*t&U=rP+hn#$qW=Y37KN^PIQJ zKU*|OL|bq7Y5XwyENRg7TWLx&e~pj3;06C&xX#l2)Tfavn#B8qh&{>DOtx}nz3Su6 zasD~)O-u6?pGNXr;{Cy-35ScyY1!!G&i|)>+Aak5e_+*VxG2q@gpd)fG^JVip^rOD z^D6Iibhrn7Vz|bv4uqdjM1+c+XyoqD=z=`UgGj&#o%YQ@LfNGvwTRwwjii% zN!08eo5^-Hyfd3-n2pPwdzfo!)%1nv~bmTugz?}{-f=Snn~j>r?A`>+nqU6EoPB>Z8nMz8tcnnw#KR=A2n95jTSUk zz2eYVlj$Y!rLhF?FSL`r4Y5yS8{GLUa2DyK+qeLe%*o#(D z@&aTY>cy&ywDKQ_m>?U6HOeo=N*Xs9Y!lT{H>r-_(0W|EOiSfwpbBxOMaVn_u8fMv z=P-*QzG*k$D(-%oZ=+^#eZ2e)uK_yhkHJYQfB4;fmFD!>Tt+rNxmzuP$>x4Kq-Bx* zTb!8Wj>%y>)%QG;!U-8Z_Z9BN{wy{(*4QO3j!wXY?4YoFrOc-tO9CMNBY_Nm@}XKL zD=k)ruwv%*=fUf)TGrEIm_3fT8xuk|QM~Lj#7=T35x3T6m;AH@J!*T7~;6p-wr}hPU9IgTFYtaP6q( zXjKECDXi!mp)E4bz@R zNvLy@V8p7RT=$~-^+t=ewDUSC9Mx+2(kg8xwRz0cgG)PoR@5f)H7kCDFTT3KeVg*t zQ&%dl<9uFS?CdV}Zb;IH|LUcpf`^#C*xPbxElSddUo6lr9(2A3oi0$sgHH3HI)OBe zkZ`;QRSTpg1fWqK^fiIBLIpI;gZ2fKJtzr$PY>@0eE1gLck%CA*OBydKIvv#NF4sE zK-yv>);bSbEzn>OdfbB^5@?VI-RD6!3uJ!u+TD#FG)EwFhtuw^@}TJg4fF}8dC=Jc zm3YvZ9(1ZeQ4gBvK{Wz#BcJe!c~GT513YMi2Ypqb{vPyY5BjV?a1teqdQgEt$dv+p zC{=0t@VC|iLYxz*(}SK9sMv#^0p$1DL;VLvk$x*}+MDx&-qjmwuXbg?kKjrlD(LR(ZB+m#ie@eS2(Gh$Q0nIFZGYq{ zzPs>y&Kcd%)tgOzIN3Hv`YmgqNPVdW{w9Vc+OVfIKvR)3jOPu0`9&tSjzk8J8KnJrPpy>^FcBi@s-$vV;(cfsCDGI+R( zqdL%7J*f##()RY*m>P}2)+)kKNiYuyb@4Bt)zq@Xhdi8sj zdNbnG*ed)1$I`!P7nXiwhRCNwmJredk`7bc3gxLR`+f80?EAI$J#zR?G2ZH{wXVOa zmFES6-RK?qXD|mVx&9eiZUC1ZpJ%`Qw?cJi=h=@?2B}DuI=;LA3)U>K!=3HDd25?a z&9B+^jZNDyi+1b0iiukL`L-W7_IG3^8}KLS?fm_?Ab!`gS-Zn*X6)BtukwHOJ=gX; zuye?qCG72;<||}vn8HWB*=zit;u}jxZhy9@0P~1eno(4_EvEr=J}m$J-^I6ke99Y@ zS6(_YyxaSJ-QEZ1y$hdg53!%yFV?qtp3t=RFnoJ_pOg9C9UrN&`7i6!7S-RvIq5&{ zT`ukeUH-k&-+LYYHb!*ESp4`(#eZ!7jEY+5IfYEfqYLD;A3D(wm*Wy z1_zpsU@7(8C6>g9kE0JbP;A*o{Ovi{Cw%Ppg_6v2dYJMxequg<48e+WKAPQ$S5ACN z{5F0Jem%Y~l(d(FLO1;G%c!OoZp=0_2cVtXIEyInh%U6-*V z${Sydr<;f`w$Uw3#I=#e*vL#v+yZ9st;l=3_LBeP9q0cr@q5j`BFumPoc!fqiQ^my zmN--$JXn%dYQ)>S^XOO%b#cFoI3-(PSGS8HhIAX+*_nT)Z2G4qPNhcNnv?#wADjNb zZ2IN>Ed80JAO5gAwR_U49{iH_`TU@uzFGU=w(_7V-OMqm|9)Et|D5q)FxU+<%2R&GU2NHKeol&PizHuj`X7 z|AruyJ6(x1S6mNdN?T6($L*l}Yb={g`6q`teJRYT4oJvPng6{%6+8dX-Jjsw#7rIU z7ZDxF+7g$Z2{t?PCuoM}=KtRBdfh?}UWPOM%u?6IeohQy<-T=@duGCf++&t8i?3Bp zH@Jrpoig@LVSdI&S8+VUXL~~TY_Hm3wm%KBJzLpgPiq;d(yoL|0=>~vcZW%>9xv!N zdoKl&)c!#hhbW6IEolDB&99wknf!jVll-2Y>ub6erB-fsV+!)}YaqW+J1QN)#x|0r zN0+n6D%DtDF}j?EmT8j#RSCpuY)E#`4`?iaN*mk~g}zwB87MHP$gJ0F%P_0I?HFyE zW%6rYF}jg_*Q^-bq$N*_Qu8Ay#;hN~HXkD1XT2B{cIulFy6Dt@VvyCnz1nDo-1?P# z()vk9Ays#``ZW~otbY3l(~N%lf2w}{gZd2$>ZkD!Gs@$qk@aeLp^<&5N|1jnb%k=KnB=pu^f%7s z|Lv54yrcYs_%rFYkBv`@Rn?ODBQ$GMNq6}#SD4ax3golo77X~){V8_P_ju0Y*@miE zo3(wS!xowfyG-QXjO^b+Y<^`>}*4bF0l#hz?xkk`r25{dgp$Z{xI=FlUM zt-FP}b{p?6UTry_YB`7F-Az@-BH%@Q&ZYJ-nh)~vzic~5`JpOCFrXkTDQBQH`%>Q9 zl8=939{$G@$>U#1mihSKlPx5lUwzT%e4XW-!GHc00sh-zG~Mu*{xX)4ie+t@+!D$h z*J;E+K$<*aL)ReOo5+mk84O=(=o~FcMjoh11(&WJbZ$KPQEc&Rea0m}j1PSwbFM^_ z&9^`^o_bK(n;q^4jo)P6#1Z}9QRl^ncElHN=yP;>%tQU@KMuF_kEIZNzJ{4t^6X;H z*Z0Q|(QH*-_FTH0YK<%WXHDU|g6m ziT7iih!_5Sq62Ymwxq;6A=(7~>0?V`Lm!DHUf#$?X^Bn|pm((llCuqy2!pLgo^9y%}p3c-vus=*P>2jAN8>*19#^wuXooY_ z>F8Gpwrdlw}!h(p`?SdK&)ANn`;s#DdI zlcOi6s;6T3o2ot|Ir@xLbwhG=L-g+I##y5qc{I%$-2}!L?h-OY-BYtJ;3+G5>!hpb zBhe)B!bGdc@XdeJrPExw+@5==3Fg;aJ-|}TN<>>a%kjU7HrY!cc_5TOruShv)81?#c&KbE9#o+~? z^1Aw&yr0B!=->0p|C3Zu;-~e?e?YH(`Pq5VJmamJ*5ilnJ1i-3eDz1OzWO`Qwokb0 z??Qitf;j)2VR9|UmYbJ8qx%F6Q%2+h?XSNJVBzv(UYLCeGlS z&7^ENR}WE#^Q^FE&_1q1`aK$nsv$#Fk{gxt@~!0exEJ6|VWs;&_kn-&&u9_t0-5&pqYRauSHK`&JK5=Y%Or&_+(AR4!UuqnP zt0C4mIy84~D?>inK8}@mXzTSO=%gn3GZ1OQ3Xx6KM0jbYx=mF^kMI+fjW<( z3c);S3vyn$DtSe8=E17l^es(Kk4tW3Jy1RTEgSy1{(v*~Dlw5-YHS6LkIPw(#fNgE z5>oH`G#HHa-hO<|$$Uw4X0%xCwbeC%GK~{UPo=F#lm46_y>4FK&8oV=-OoClhRYf% zV6iY&$j2)U*r0F?W>)o$6Nlrj--2BgVSTk9!O~eKkhtbrj@Y)MxTccDR%6-J#skFN zrpltMfm$~`g}WJCB)JXl(q9TGbl_b-5o4!hQAemNFNI@Weno= zaGLZe)>ZM;RdyDJtEp3mEkVeSwvGpEC$Sfj8p^^5HQIWF0SB*qOLRVB0>jN5T)ESX z!L)N5bz-3=6>OgS6LnO}B@N6hpSKe3alqrLnd^9L9u+-n<|+cz9_wBiyW&x0=0+em z9I`^7L$f|-ej11{7M+eOE2S%0B%5js5-%(pzqvYEVu=*ELR)K|<$vEN3-^pc@&K?{cw*G9HR5zB5C)PXB#0()Cm^qJ2o;MZC<%U8|>fT}poj91i zn3o&uq}1?s4)z|zfonbvA!i-t_D7F^pHWt9A4ckf3gZ|!K+aqfTh&(VJIl)b=QDI9 zn-8kJKHOscXemnVLrIYT4Q1;TMOl^Ghl=3CwRVonK2+F;l|fcl*$FQDFw#D#5A3yS zexGRh)<&J?Xe^sFzmUqUv^Sh9q4IkRzc`#;I(ZAJ261lWWXIukYCqu_j-XG_LGk_i z{$6L(F|#Mpik`BLsGN%B!wO)l?2YP7Se|*S zvTr2%Cm_sB`MbuV(TqgnLl=R+2@F=sWiiz_x^`3abZ6KVxArUq^Yyl#Qotqpg1e&^b4-yTD&rXA2HsqjwkW*FY~sb)+8o z#c0z=TC^RUAD9en=g{nh&}@d(70oC-L-R(?o#V|jE#p#$)J?hn4$HW4)8A@@-EMHN zYE3t7nRsEYTC2^h#~&zb0VTM`_O?1AP=~7m??`w-(kITV+0ZgXGpN`gr1I^V@pm?+ z!iALy%jD0fXK##d}Irf;}ho&P+IfiCa)0DVP}+$C(s_9F_JR%?Y4m9@u9N} zm{|Qh@`%EW1TT4SUy+=+;;Cb@bAS7I-0g>GueL_;O#n+k8_jr*`*bo5F%QP4QmPZoVnrQ@e>D2koXH zIX>o_;zluYTHvwhut{N49E{&JHN|y7Q}Chl^S~Y~Caxy`pCarqun}`w;97% zZ)BQplEH&97R(>rri~ohwwVI%*Lepc%MEIf;G?m{5eFMyS0WZ>hSzk-hzPD}Dfw~? zC<6ZmlHu{2B{4qnuR>1ef_7Hu&thk%SlT0d)uaZ|3r~$hgMOS{)z@WL^_2zdUitHH962VXi!|a%9Pln4W0&;l&b%*G zS1xUOLF;xMhqa{z>LkzjSyeLc;G-{|{Lp(bp9P|$QYSz%2>ZCPP~WjgsqzGtT%4>0 zsW;qkO(9yPWV14RklxqR$J5untfxbJa;{0LeGZ8i1*Z27cj(}Mz9gaV z2{?nhmk}*zt3TjH?$cYq&J5@^;3hSLRC>feW(6MK1S>}Q<&M8VgN5tHV|ek_E(`0}7cmKLE<0)qFe#xvOt*g~87#>%-7l>gVAm!sHmdx`T zv%nO&d46Mlc0MH<+sK&Vo*aNmv%a*(8YnVkJ#sZJl;w(FwmFIRD%s47!{Uy=tc9n$ zR#iwv-t|!%Vk!DY_bLb9r3EL=AjKuxGcS-M-4$lz#{HD!EUanr{2Lm=^@u-tcCHXg za`J4Mo5=W*{{gO5z96Qt@2;656fUS@Z32)p@ioa(cPC07yBDJIV6hA>Tv((AcS7I* zD$F1MUlmLsnfD$Ynvx12J>r&`bm$1xf)4!_tjAsYi@XkHskyv%5nE<>Z$HlfvtEJj+vm>fh z`+(fE%k;!g-+DJCh<1dSX3`8v&?>JuKp8O8kS{7iibDr0aq)Ebn@$ zD~(n4#;(m-hNAt%XzO~~%_|NzW_JEY8gEIBMX9_}W{lb=y7WYvV_fnP_O}Y-Ls_}6 z@?Vxj2Xd4ynz&Kz&yG4#;zOStSGl@zXif5AqGbyV_s0rse+){)hf2J1anpKc8WaMn zwNsHC3;*ziPJj5~y*>X)yivk*d{&=$qLW0970AHCrp{R5rdZ`OjU19aOBn21AT>Cj zsy1r>X%p;cWRCdCckER?KODNGCb_b)91ns19ma?Cf#ovLkAXyIVUtsJgj&3CNnBT2 zjm7tvlx-n>ieYNMZaXYQMhgled^E;#wThHT>LL5Hxv zLpz20u!Xh{yTqEj=?$)akG4KcrZsE@Cf~PsJ@-4~l}~HG6Vl-@&ro(XHpUX`HpbIq z`jx~Mzfv@=^6^-D?;(xfj3?LBBs+b7-~y!)JC3u|uQVh?K||J5KHT&=&brt*eJ7T9 ziH*}qyJ_Q;F)*eHX)5`hc=8m~Qd2-LuSK);7VlWLk(TW2tLD^x1s&4)nyr0Ws0Z)c zI#082T6;)1d=>qW_fwxf{EN46obo1kV3z-&OhX%#vR&@Lh$hxiRHn4j=}5qYV{D9t zqh`r@d!MtrH#1?*{mm?WMwP{^+Tx?WB(D&O4J~e(IHx{ku}7ZL_#8{`+4#&eOrR8# z18k(S4^uL3=*l=Y3F9#1jcc^75}~9DQ*mUlM`J@b;~u%xYzi1EvBmH8slg9LP34o( zgyyCiEOEx69$fr#pK(K1jjLSTI3}Ks^(Up&dP5(T!&0^oSXRSpTK;-IM_-2d(*n3(}Nh+i)~n+#ISxOwkWf|>Rn+x3rn~dA;q_UJmLDw z3r?bwJl-gbCwJBU#;9bxxarmJrU&h*(f*Yh4vh{OgPM!#Jmcx7CRs8jStVJ+b}*s1 ze1Zt`566Ga&?l)yV+9*1!T86MeKy~kQC5|BqN}iJoeY)Y>Hfcp6+UWw;8^&; zM%p))KCyp1xiLO;bq#g1t?@xu%jWu+bpL_D_!yu~ndHDx%)QCuf;`*%i@0B^DSXE2 zVI{|sr_xh9tw)=TNK!|@x-|A5%537pG@#0%+q8cir~gG$Z1&7-7K)V^H?j@%CcNUQ zSmCPZl}q3#(Yx`Wikri|EXKy@%smv4O1P2$8r7=!;`Mz@4J>|f)!E_~T(^ZDmi( zp+_bkWX--@T9jm?DzOwizy)zPu#+kHxp)Z923Vzx^D5^2*+Oz}M+f=^&k+26)~Usv zn3sq4j?|!YN*@0}xxA(GRb&>9O}=;|{NpFg?>prm@r9Wo0S74(Ti_`o%5oC*YCHaD z&impyQCb0`xuR*|i6_ra{P>CCgsdp!D94`HgQK9>u8pPIwD3n`swKQmUT@nRy?9I+ zr!4qGu%>JqcU<^!VexA(B(e(FLFAnN_xWGu^S^4xN%Hb&RTsV55B{yG&mk#O*Kw{hdgH&Vs^NrPS>aW`##S8 z1+;efR9VSotJkLMK1)A0cnXqOLUE7edZWO?%lcaq9>@#4F35ga7zQ!;z8MzRGKf!EpTQ+Fk=D=I6 z3^fKd2yZN-H-<<*(2*$3ek{)hE3!d5h~P7-%0gpdFqx<&NJe!bq$5$E4NlDl8?wRX zY_KH^VoODkjM_p7w44pj%LeCXgA203g+b7jXw;kQ5?B2bf?O!hHL103;i(#V=hX7e zU2Cd=!H2&{7pDfC`8*FyvQndKC7f3H#$sc|2Z8~~1i(6oSspKzQ)5Z*moYUUE;30C ze(vweV|2Z@{Yq5%ZknYW_-R5QO^tlHq+%t)QRvQ4yFp=b3LyH6ze9=#dRj3aqhGc`87|FS% zmQ8C}L--YhV}d1Ti>5&BCUr3qsLdZY%w^*5h#rBB&nk3_Q`RHl|^P??-j5YoG1EXc&5yEEZL&fv=o zGh%Pd#GsWk;e^l*iwT3txynvzuyS9U3yjQXD;an{__Vdk0*jOI*wgV=$J9cLGvHT7 zXmp%GXWPfr;QLouO5Y5L0{cb}_>>!c%4e+yXk~*Mr=okR^p-xpPW7%J>`|u6Ghwz7 zLvUhECP-grV$i0UaAI2~N+O#FZ5qZ+5AFWGNnF;Fo`Rm zRmR^__pkHc#b3B<%ZuRVZ=~1QLsZ?q_ZRDtUf>1rL!7jIB>?Nr55HhuOQeU`_i+2bOap4eg*y~frk02d8TWo~qoGO?rA=o$t@*N9Z~ z$9(P@ioHe`;S;?yK;2q1mC&f@7Jb^Xc7ReZvcBfu26x*Jp-VKp_ei;h2VwaadCgrD zK!0GXj1BG@X{=Glc4GW%91i7ZuqbXC#bx{}@cwh&D=VT`>5x`Iit7}!%ath{0+T9r?1iCz z%)ieRF$1ci2laiX$Tj!GO=6!180h0viX;EdmlJc6q5Tr|9zlY zBISM;iDcgg+P-Y|y`J+hXy>uVtfgA zqQp{tr$nC_gOkkU+9_JE%iraAIT^;lrkua#H4`UnMQn0=Z>p2a`fqQWN6D6Oh{Z38 z4nvV<8I+#ir*Sv+ulC^R7t4vWY?I3NKHoLT!!a3{JB8@5$=rH7w>?^o+7f!mXpP@4axnw(B_MK*|iWMdr8#b5U^?C=t)A&VbI`2I9gK>y$XXm;9pFR5ju01+* zSpr=SiS->@+=DJ(MqizHlU4i9Xx9^NhH4>VXcU$PiNWD4ytjp+Y2c-%nu18rl=d2} zZXSW5-#!-ma}==J0w2qbFN0RG0UmArCzNiR;7{2mc*ev+s!4sR*6#VJpidf%^ zOY`SN>)#^zd9gl5)4K+PK=hgz62i4MwA&lDe*;JBMm+!8U$5H5De1;fpeOc)voz=P zH6JriLVsB49feIMbV3d%A5#pUUNyFrVyMzCo^0lu{NtlENg@us?tW^k_0h5< zHL3^qB9*3c3IRU?{PAv z313rzEOloKk;F1&WtEOVC6o@HAnZ1{5kCvg6{dj(RMwJ_Vn$K2A-zl$JXaYWx)BDmA%yG0t|1hf8?xi2j@H1%j!m!Q+B>% z0=YqaT0PqNdfR$H7>tx^z5FTqt9a-2tE>_B7sbG`85HYPEYCW7ny1GO^+_tSQY(Y* z{WbUakFQ_9y!!ou+%okG>`$oUr?7t{qdfb^qh$f~AG3c{M}JED$7&_T{t@{AzTZvve@z|!-Bi&!*|_X) zCZg;^@kyX$c`Pw{2uIwPu@;462DY7iXYRE7=}%`4Rs63j`2aIJRQ9ptLC>&EB~sDu zUH7Y&H(715e}r<}VYZsY{xPWK8K9P(;d0OGJZ-EPD)D!5Vm!tko_S{#tF6h9!Di*JNFBj=8J(#NFchh(c(CuB6!sMGtP3B5oY+Wp-!Q(P28?f{r6En}wm z`ylt60xt&?m?>t;{Jm=i+V$HUGsQc)HgyGhfLLm#^s-g6?wO+j3@P-hnzi5~$Xafa zs_4Y5{o zUL6U6^`nniF?+q6tv@vkAzzqUv*E@(i*@H6>WAh1~DxIp4+v`ibyn#*0StEmWCbRzr*CF{G{Py*Am~(4bhZo`VQiP+-r;J$Y z{#knTy`VXFDb4;x@?{y^uXnc|Y8Bi=Vns%#P*U1tgR2jUS@<0lw?WqC;{worT8gFy z|4Aid0aZL|q3UIsruJ~>@fDfprkd0lT0X9Ichit&(xN=>m6)iLvahSHFlre&LYety zs{BZz(#>inf7b`ZyPGvuv{f5h(Yq6K_{KTdvRTu`mH^ZNm^EEIh?h0?B8FoUN?VI! zA3AtEgQn@Hz4nrle_V?tjRNwT$*&J`I`AbX@6JhPn^sk@{mHI5F~3W(>vz?BYu!LP zxUKRYky7Kxxw=@u2h?miKbf@>sea)tYC~-CP zC>hbtjhr%KzYP08x}d}LRVSuTAE}O=snUS0wSwr_<*qRR)lB45YVhN?^yt_PbnNf= z%7FOx$2Aw&<{3l%LDdHEqw?U*i#(NE{sO(KiL^gTJ<=YK+ho2L0O{h*rN zHTkgkiu;MeYAUX>3o_}LJ|_spD&NKO(awLLUdyPI52Hv4GSQaCQtf^8ZE)CkZA_e5 zQrHyDA%?$6dqSofWwGH9#=|zZFU5cK?>qMgOHQ;fi$p52NV<6tkh*8hSUuOeb?OVQ zOz+CMuQ%xLQAznw)#)77J9&?`MBIXJ`*aw78ZqS)Kp%B>Dsl&M=a|aUXzR-=ITcxo ztZDC?q_Igw9{um&eGfb59eMty;Qf04{YQTe-oNa>-vJA-^gs0Po9_wUFZJ(p!}6~8 z?~fw7`ttny=?jAQzvvw?tlqAS4h|4)aC?mjF0ozf8nkdp54eh>C!-eHogh!jo$6XQ z6S}brq~qv_;lSg$N;)MfK#pI{`2ppO$qc|4UuzJ_uyLlP13MZBt;+TQS5%eI1iCL4 z0MOd2d;r7^9k3^WvwYt_;*`C2U9By(L6^A9zm(j)c)TMJ>y^J4=&-Wv+GJj^ zu&etz^!9fsLVEAi=#h&Y4N#Ll2gCLHA@19%foHtizo{ViGHe~S9WPpIt@+)qa2+Cu zRqxIam2qT;U4A4!(O;5IdT_@D!IF$dOrMQ2Z?1uG4O_Nvw=0l1jrLHjjl~V_^g~Dh z=JnZS)i$~`xL!#ObuZ1FaeJ_h<_H>My*q-4a`f=5L}|FA%_YD58ZXn9iS9FuB`X40 zeb?pI_q*0AHqo5L+~2vI)*U(f6SU8^-1uK0J{s7_xtuQx+G&4yXXjHo7S+}>|2IG~ zh<6Ef?Yvp>^7Ah#%4z@mEdKI)FQtKSTElhZTQ&WO#DA*;~xugb)KFVpZ({mlIT#Z*gD5z7#>WicWb%JD0&F>L04B- zXV?0!*ScQmdMQh2Oue>VzbuG(m0~XTBbWQ&Wl~?cmi7D@e6K;Nkw3OhR4PP_?ARJ( z`D}0>ikvBV4Ec#SbJ}KU7YdxrnX%>mTK7SgL*5uJw4%DY7Anadox`C+MpW0|JNGx4 z!OIi231*DF1p;?zn?@qH{t=f(sr|0FSF`dhW%Yc*f-uerm1lNNny^$eV)$)aCnM<&p#T`S z!ygP@Pd4xajOw2B@C!7)(z8o5@cTUcbhUDN_Ph-IdJq4KwZ1Z#paQ2YYaxavHrry8 zAu$tQR1P%z9_g58+yRFY4GwgvNr@ZWeWp+Jt0#0vtd|~kyAY>qN$yBwHuntig2Tn| zUhBHS>sK=R6K!ImY-N*@u~TlnK%gQF#4He)MltqSN9efqTUu2hELBLFO5ePaSZ-G# zh+!0i_hL0(YH+{1%n`k^&^=)i+RQNOJgqWFsDTSRqvCYq=sLyYS+8ecFNGye$mcpn zH|qlD{{%KoM#bo%gL zT6%be-%~6S^r;I_j=Z0{|G8~GWqykNr&;Qd9q+H*tCDxR|1?$^u>UDG(|!MGFIDA} z?SHCfrXQMFP8vJ^!-^$ef1~)Qai2`L`-1E~o{V%frS1RpzM}uXr;nM< z8FsLXq>1Y2=js2X%snlvU(apMy>BTUnbPh3$KBpf$bIi#f2q#u%d>s*KmMMMY#yDD z@3f!gzJE-Acek(W{?4$togtrVZ~1%Pv-XzWdNH%VA$=z;i%rgq68IfvIQ;^noEcJf z@;)}S(wQ+N0F>mKVBI}a(|xJeNFCr_xA4oPWpEGIFld4Pxg>i7qk2+uOugasO3RHYGX?^Rd9Lu_~}@G{<1nh)?C` zuWx$I-b;+g3|Nt|Y^)0Ps+rNI@!9>psm}YqnLC8r^5(B9o4>?G2g`2J+y8ul3C~KU zKHknqmOnIfQJH}&=3~_)10Z|DTN>e#9P^*#>r^+ftjd^pn-o7e_X~Yr(rIeM?o2h@ zFSOk&Ub0sk^>V)u>Ay|`!?Sch(l}$OBc6~@9Ndp|U-wK}Xka-Z_4?-g^aFhQ%X8A7 zzti-Y_WEd%BU^V6&6(#3`oOQMP&RxY3cgKk|%BJypD)@(?J!Dt9^@gBzu1z$?Qs`7z7?m zj^&6knJC?9RzM4Q5kIn;h^8D%U(&M-cPMdf?m7D#6qb8m(lsg|ysyd1z}E|s3jaUr zio#@vDp`g^+u(<*pWeS9Hm$=;b~Ec)eurwkew~lA|C3WA=?{E;(vjaP8K*?b74 z@F)7WHtgRLsw(H2!5us%xm;E**l0v+E*IjrVsr&ET9v6}Lr3t*(WP|5cdyIuFSVni zDMcn(1F|=@Vr0Pnlc`?gJ-7Te5bIuk|4&^0BftA3<)0Ch-`Gp}CB2k?+5Vrn{-3D) zHv_TnpJ<(W)L*!DYybYAxco={>l4*KD8DgNzA-0BnZ4MD|BKjp_Tm4v7bxz`K0Mc! zv^V?Z|7Sn`ziU5k@gsXB4 zBF0Q8W8U%{am3_p3F{Pq?}yhI%3dPKoojP9A5m=DbXvX;CeAuHC$C^XHF8Z`xBF)N zjFa8f-V1K$ju#`)8sg6^4zm0*XA9;y771N{%YL%_;g34*g@f@Ek!?;a-Ljao9?xjH z$6G*6v9jF0TJv9EUkfAK_2cl_&G1;l$efb9pT1h^Twyq$FX8<6pSGXB1(omrCHwh- ztiG(M|D^pqq#64dSylwke_f;cB!&klJik5itRd$B9V}->|_y+f-FNj{u z(tDS^#a5S9g@Ra?h|OMxY;?EJ$es-XuY;aAG zg^iC~|9`UM9)fB=Wh;@ywmywtN^I*JZM}@4%VF1O>vaT%w|7qC5z@Cd@6fJqtwBxQ z2D~PHgB_@4Ah-gX&+ZbK*I07zGI^KNGRTc!698AYxVU9UXnSp`qOWGMiKl-vhpNQV zcbOUo=w8e?+E2T~CaxEigAPfWLBV?Wk+tDkceSNGX-G}_0aMUg6R&kI@>w3b&sE~| z)hgPYDsFen^d%+N=j-FR=uG{xz`kMH;Nlkf1iWj3+siMAA zsEAvp+KXd{w@`G`8*HqDoo@&sqp+GF46E`MPB(j#nA(z%u%K$naWAl|9nzTberuHV zZoJktX}f>Rmyf5}q9Qy_4;&MbRy;(3HSAh<8k;(v3k;hs<>2|FnvP&~I(?%}w~ale+7 zNX34K;x5ZORDSOG{(w4z-J2^ZSk{30VH7YIn-0^_LNdP^`qi^Vy?ej#QZXqkXtPnMU`?n zKbV$+7BpfGn7|@-zLiDzNyHp{x?vyRqKA>%c+J1mzL)RG+o2w}vjDz{l;)b^(t>FTk( zkuG}3sU&o9tZgbPA21lT{h6+nMn^RFlk9Gv(w_?vqn92-KD?dA+sn~Q%XyP12jo}| zvX&fzhwozuOd7_^SbAjAQT&;J2gO)UX<-?@$TFB<`Y}fXG3-Adf^7e>FO*!_Q^Oo}}5re>!@?fKxFQCni4YC%wS8 z(;&4|INVl(1IS4fd9sL!DSHC6SjT(GSVY*9H$geyQZ4{a6!tx066t*+U7|yC+Ui%W zCM_ecSNZau@+HruHS8RhXa_~-F#+=TH2pcHf9GEq*=>Qn4~GO0E9{WQv^Pat z?kie(r6OlcXO)-yFL5W^%aEGCx}Y(#F)^B(){=kR$cK*U+xS~h(0?@4u)+-G3Rjr% z97#8-B3usJr6gmN&Qjv=IvGf>rRA;Q~C3w$^1FJp25XQZ2nFbTj5fMA?}i) z0Rv&0-r_#t<*#M9jXm)*wv% z>%%5MKPA?CVlD{NqiO%D$meT1`v`yvHW$r6ze^=L*<7nbMun}Q=A{`_90 z2qU=vXLq0CTuGMxxB*I?tTyKqlQ_BmhaCMl@cH@kZX@BxpJxARr38r`?_a$K6W;m$ z)l6l8AFeA^e$xXXt$WfmMeKJT_wiY?RD>OP~NkXwe{Qb(2UW?meoAGLQ=pUq2I&%k%!J=zs0 zNnF4YBrM9r#n7!@%tGYcipJ6Mj^BE{#w*%sHU@_2mYi7foC@0}(CF|7eU-fNgjnMA z3h`323(fG;$`wrD<&9^>EC1QJkYy8Q&?j!gscwvWchX0Z+vo}`S{d|1U)D@G^jY^3 z3;%fXpt7!O%r5EzkU5^yK=A3xP57c5y2&lFeM5kWH^|`limoL3TK0I|GY2qUPGyGl z?_}tf3RDBAo4mw*n4X5M1;G20-w&_~(#ky_S35{d=09~l?oyLrKGppI_t>!SaA!rm ze8j*hcYWY~QvE-IL?kYv_0Xp{AGh0nW-Fd|KJGW@cK&ncK+ZxaVvk9XTgKlb`0-p_#lMJy=EjUpXIF3Qc{w^Ks{@jnX?m zAGe3u&WK5m7knDmJC`{$gGI~)Gs9)t#SNX^d2U1M7={wQY6$-R(T^CKBj8&O7< z5^4rLy5qxg<&2?j#P!+`56U^a_GAFcA+ALN!D`Oi1zvryBpYu#a~kgwXl|oHGl%7_ z3?lzlBR3@F%wf64o(28@P|w41M+5Ekuv}oT$^CyhckId{-@F0Z92`%)D7Ka>JN&TZgXYoFI*uWb8Q50 zMy8grsP^V0Q`;V$=4fQK?8NOq|fN|Q4~s|=UeXo z$l$2v+KEakjP_Z)l4cDrlekx)^&*YRRZt{Sy8lX`Kl(z{ri57YOVX`UtS@N(N!?+s zr?oatMdkyKA&R$C4%Jkus#x;bSd#mP4rLA#t(@aCr!?M>?VsYm7OG2K=We2dt?oEY zm?-!x2j7kY|281DukqO*MOAjKK;!AF4U5V*8uuOE?&V)08&Mte6knaAR!rXrlF0uX zToP8^`8-z7o(_CX!j21SG>gcz-IM%hMO_kEj7^K$lC|ko=7Nxb_j*VGMF&mYS*!J9 z*fK$WtUTG%0by$= zB;XSb%3EH8&Jpvaq6NxQPROzU+u*(z$!)P{YbOQk+P+@ftMgGq3;k8gMGXZ_P4QGy z-MDmuVLb!(UbNzZaS9| z!;ce2csM9oVFc^q&acvp`tD}iO!f)r_c;?bx4Ivaz*nt1{jTZfaj(k5{mMT1xDPel z$)Q)gcMI{(AdQXa1{UZ|T$ASYj7cS%3>!LM4`!dNZyn zq^V`4OuZ93FJMul^%lpd;GB(OCNNeORnl7uhAyi_hp39XZf}!)jctbIm$&b~QQmI< z1LfUz_9w63T-f@*Q9pl;&oiML6|8MI4D}*Xz(|e7VQ@Z4c*~nU$Fwidn9zBLZP85O zen+Xrf_~@+p3&(yF|&_K9YtsK;a+j}bhySc+BzD>L-#c9&UJcSf61)ZHMh|PYqQ46 zSS=5s|IB>3)B-v`Pxnh5U1579Mn3CZg(kT4&FvJSLD!} zgzVr<%y7dJYe;loGf-)#DZ!b7OU`3E$WLw%9vgKWDbF;cKSn{axC@@l*L z0rPCv9-%(f!w!Za)TIAVMa+N?2%mo1w<#(@nhm#YTs-ybHJ}qu%~;1nmnF4MqxjfR z>4EpT{xHPU#oMst9s`WsDVysL(zgoU{w8j#&*i+Zi*X8{ zbuZv)XKPbGX@}HoKFaP>(OqjH91XP>69pxla)g{rVpVtL6^7LqLEnTJ2`q**>M(eOLK-w-iW2sYSvigBfeRyB<>XT zQ9NAfWaCjAaG-I)SMK3DrkAVRloau?V|qpS)-hd!*ne1Sk-=a41p}v-@*&eJ2bC2@ zr|$~S&vuPuo`+y&ottc?5A?g%Ans2#y|PWe+|6aO*-7PTiQLM6F-OiU`th@engN1i5JVNu z{`PwxmN1?DsDYE^IaQ>hQ8;N?W54K0k$3p0?0$EdQYh)QKIx-YNSl9w_C#tLu#>oo zrE|PZw7Gc92=Talo=@_K($5I+5G9W|TX<0VKpYkZ`K=_sCxpjFGI~ulU+U1F=H9^EoGRn8`CE`aE2ne50KCN zC4$3EEH|acpU800DhSx^9RgRlA8h?_`y#cH>jy9}0yR^Tng9Bb?bgE={#0t1(dF2J zmJ$tHP&?+M@o8>+(Af^*Ta~`WxfX?ROktk2!Lv@!;HZxbRmCF;b{Qntf4QOZC|7oP4CNixtEROF&xP)yK7J8B+PFLN47m(hU@EhRMk3r%Ei#u$^M8{D(# zu>3x@w$0GJ6K_!q@!jFz3BgCEjeya6yPyNu(h_LOIDyu>`#@b9oIRMH18ISF>u^`v z>TSJyA7b!l!fSUU#}CB1WFKJL)Bb{LPhYEzT8+Mrk}j%yBtz&H9|;0?FR_7ElN#}U zKvnTY^wDAZzoEqOF9Byy?~)_~Cv)TG%>rTAQ&XL-ir>I*#?cySLgQ*@wxpRDd_ z`#M@)y*-)LxO)E#);NH~ZH@~-6AWbTKEGq24elsFU28aZy;$e2X(t=rvgzvU?%V$1 z_O2(p9=D9Qy4`|YK1&kT1L1!51H!%lcm1}lJ?+g^yu?!XtYZ9Yf0as4E~69e7;noF zHTWULBIOL7Gkng?mliE`*BZr5J_o9b>{GbQ{5N?3P!G2pq5nRX&hLd;LbyM)n33nd zB(mqCC)rY2MmrUyImQA~b;4coDwI9Xkpj4V(Jiqltx9+)%{~4hG?TL_oHt+hw1=W6 zGF!v$=W6#<LPy3|rXSTd4O9o?g5~o<#byW| zPA0XnND!*a8TrZTW_JL{X!NkU2J_|ayW&+O4M_*PE9Pig*67Dg+~T=_5lp}ZSlfwy z!(qkfu`yMGhCpL#h_vkjZEznkBn66ikcQbC0caCU+wY%gzfl&Xb?#!@jEIaqQ?<7h zhpM!wfd1rNVzGV%S7w8vz5uEowxFLNH7M+rTc5%p%qA6i_KT2Mk4rV7n-U)#v!yUl zZULI3!o36HX5u8jCuWUDhjNz4&4E$IQuo_f#-Gzy@aLp(4}VVeFz_%Q*Rj$pm%pc! zcUVeZ_cbDlj0C-)&fPEm{5TxP3CAQm#_C{uHENT<92&NH{9wyZpOO;+!XGCn+6iNSv-&1i5@o(S?kt|Y>fIfhXhU6 zYbT01j12p>N~b;D7Yr>dlKuSmj%sc6602NpeJR=raB7!tuBj!M0>41gFy6gi|N7UD z(EnI^p>M7gvE(cZ*(c*l$yvhIonc(~4&^BVNF#GX0O9KwjsEXw2)^!%tnrW$KT$XR zlc+p@$|wuG$$+yvy@H$|F zTfn+=0Me+A)u-+^bWOHTe<1vQ*BIbJ53tG`;B*f#5;wrf28fKVm%w@dLRD46m6>z_ zVzz47{H~YCR)G*4L+te~gtV^dUGH>l=z1&9zhGd0?#3u?DzYD%wp`9p`aj7z+y=1F zVSb~O?|s5iuNJ0>{1~@UKZp9|jQXLUWj+z2?uy*}H+{m9dv=eJJJRRxNpY=v7!l3q ze@JfrSAN3LcR-KPw?>qR&%c05f1>=`h5uifR$)5#&S7wvtDnHp&yCuH!vFSUb@_ws zO4l)68WH_`?_-&?TGL1R!7AmnT;YJw0@jc-46`os{-_Lsc%C&J>X8da)MG{$nGyB4 z)-44h3g~Q}#yZa-NN_nL>hthWjV9Zt%o!i=NU8L-9^=FP-IPr|;fn>AJ(||7Ir-cq z_*e!LO%>v9BcsZ=TFziP!~?Q}>5Cqa9ZUlZ5ZN-R$6)%Ah8dMRaFd=JT*6yz#lgQgIrymc2 z%iSI>Tuv_pn7ddUxq+1FUf0p#;$TsQI#%oHRAkgdjp>~)rQsmK3cABDoAVaeT0;jb z>od+O@3EZjeJO2Bi51fO8Yk%(lDJ<>bKRohhLR%HM#%4ba_L9opbo9j3ObI2zVs;8 z!{05uy6HuhdeNUzlfaLM)=P`{e?%-eXCp4z%Rl6`&!SQF3-?&57VqwyS3o;;v*CK+%`GI0Wv&6XHGFLGM}1<^+noD670m6P zYu*aFC;4LX^hV|0Z7E8h-1U=;>Lcv39$lmc47{6kUz}>lgZrP=SlGu=5(2 z>Ckl+r{ykUI8~S1S_vl6qLgY6eiHesOBIqF9g_g9S;ebWGE((azjCgwQp6mQy4K#4 zEUT(nT+gsJ44lyi@^(kHsb<9ZtD8Hjy;i0gtxUDFGSgd>0Y8FjZ2bs|GW0X|dk7tM zdU0Q5LcfpE#=v3uwZYwraBbDp%d}S|X>%q>y9K#QjAjW5e$q)ZbnYwM3-)Sz%4ah9 zYir>|M%aC-vqgK`J%cVIjyaOJAjf#J%MlG=SMKwZ@c&;ZH~h%`YzXXdbs*xq;a?$s zLGc%NiKs^0c9Pf)y^+)I!TKdogwY4#>ctcmfpK+5wQuhH23FJOc3GeatClA0fz!1# z+F_d;jrHE{EOm|meba!>Ow2uS`DPXHE-trMEv zUh6^~*h@^axitENH&hy}A{Ba;AcKanf^2Q~i{96Ec`ai)Fu&Y`{QNixS9rl&o)WCO z!9B^8sa@3IOj(W+O!9ysI{7WCZB5|UFRE;}t4f{?b)v{z(93^fQ-Bi2T>?(N0`ljCZ^gF)sIrdmX) z7fL)mnjwlC5FBz*EO7%eC_ZIEg%MY=N3m0MuJMpTF{ZLo1L{D-W2@#2h6+Z{CAoT# z9%yD!+yQ#z-t20+p*Y0-R2qJEBZ^}Ws!}#zNZolxMmg4Ug!})Pdl&d9i|hX%3|phc zZctFHmqr_FycSwhiCDiuKz21~tXcyoO)FZgT2oDw)(gP|VY_adT5qk^rr+9Dt!=UT zRqBm!4c@^kUIS`nwu=U(0$%fff6hG5?z16y>Hqut{r|i)`#k5FIdkUBnKNh3%$#Xv zCx&0L@Sk7_-`!LLbCkl@A)mK4pI438P3z<)e(Dbg+tN*s``kKTzsS&}+Ua$Rx@m=eL|EZaMHGghf{Ne{hQLcESfC>0 z^sLB#fWQNcK=~_Sw5IPPeEp*H_z;2$g#`s?p!hJZqC%hfJy2iWSqzmE(|4NsF(rrn zkEM!=Ur(|G2U+%JjWHjOMC+&h`2#nNS$4VYXmj^y0-lbw4i+OnnNA2XTfoQ+ofc}i zfKb8f^3>jsqMew&&9q`b?GM(9+F z$laW~*9z-#X9OR9=Gm*)ZO!xJ+gl% zHf&@ReFXP>EE9Wu|Kj|QMDsIAm0^K5xzyF5wQST}?Dmo9rDKmxl*Y_E zmbcc*|#10rK;}>OL4X#3cxSv95*z#na;HJ=Esbk$!cTYRnGzNrMApA=s!5})h-<1GIVeg5x!=KOm|MAKCV z`}|+}v2cXUWyiN?bS}+z`eHE zZFq)6eVgE~LC(9#8O*zj`Tr=L?vwa`i|^@EvJGI1&_7=~YH(lrb4-T9uoMi5Qc;xw z6(cWfmB|!t1RVEZQ@auHa`or*{nj5M;9nUyw&-ZZSpGw&s89dKSE92lS^Z)HYp`j; znEN%)Xiua^YZpi5d=y*n`uM^LW#g({^R5wh*7FRg1(qjT7ng#gnM*-DPNFK&jk?_i zw4Ew{eRs$i&f+O{L-sko2IqR{G|Zim*4-E z=gfEB|HJ(LR`P#`-#@@4_!RtZecki>fS3F7`%J#{$L}E^?vLN^GAHbh-)jW#hu;qh zzBPWI{jHDVx4*_@3;FK#g4|cWF**8^@06GCS0?=L@cTWczMq2MJ87z5JwBA{+h6>k z=)R%bL6kjhOS%1(;D>AppC$O4Tgvm9g1@m9d9FZnZ(W}MH~D+nQU5#q{WVUSPr=_i z{)F`Vl+_gDyfXX4 zTXjZxIlk)B=#|VWIrX@E$ChDFAO&G0mIvpVN!Z@cdF|TF8I`uHCOETwDQC8IUYm2; zoYqc^K7UlxnZZHrBl%LXF_C*X z!jCZRY5H*8|F`s>D;kRFeG!|uUwZG*hwIwIcsWS8WbB>91Ao5N|4V8Hv~GAZJq}k& z`oCzI#=g{E_AAFPABZ8r49gBpxZ7}_ zCUw(<*1lk?p-W~?9XxU1n-d52H0_W`Z=e1acgn=aq!1j|{*F#$j^mPVrvIFz$|d%D zOwzP4yG=6Flo_1cKEI#-Vf7~VG;hzo#q`mosbe^@bqr@Z77d1q=57p=;abr@gb+=J zZod_Yg>IWfW?buF+37y>&a9-Qzg>z@lAg@V$h^4u6~B>n1g6Wx)Pc}WppA)k7Nj-2 zM=Xdy72M^LIpl)m!q>OS#^6C9NB=m<{~MO5ek?v`9qJpIY<~J)ZBgP*OinpuKM*h- z+ckj-x4SG>%dSgJ7?nuvlHIUgih)j8e4m^q7H-Z%bU@80e#T%Q3BTG;`hvYnW3oYa zV{?q9tLB-B)RVRQy_#r!Kb}zSE<9A%`|(OwTG2dtO#H4v6?2Ig2+Z0)HNJG&plzfQ zd{l$HJz+O!%Zb$Eeqq{!HkLt&8=c7y?h$RYaIZfvjd9X|-0kA~Z8`1{`sR+=k^%0e zXVK}A8nlP@+WQMOiy5u!rn@s`(RerZR5L0O4eZOug);UcqmpKLa8+{07fteb(?4S2 z&(n{;+(K9P@F;hL{zX}Sy_wGb0+ENtfRQk+nP1+lRJdj;ea?t0s?^Go8Oi4|!PknoGt6z&!3z`&pdrU&DMoE5PBr-H(eD-oD{1{G+xlAIlUy$Mw&{dG2}_?Y9) zEz@gxejBTAd`viEbF{AZzsl5RmNx(2F!gGTX_$JfT=!z?u$6t8`g_~w*gsP-ptj1? zW3VbBOcmo`W;2>p?E0pbuESOcnA+`jAy00V?N7(wQgokT?#+la(;w-t8{D(7h6SLlvNHk}cwV1OJv7eGn(q#GjMAiQ}gXIRn0J>dF zIAuQwkHP>ABK~j$k7lwFgW`<#`C5vNKxple$4BD38~)ZMEjnbXO~CW%G~gar(Euv& z<8$O?I!|Lc56xqv9?OuP7K?B04V78z=2DE|VCx(K4`(DIvB|fLmpW^S(yJ^yg%Rq` zXz%M^%3l9m)V#{aN1wIM_9|>GZX_oSTR@&r#2-#2MuMP0n#P)Lw+MxT@8zmaT$aM6 zUbZ-oUz<(Xvna-Fn~wuaD!(n~WB{urABIwnixJVU%Y zswhADoKc!q`iK#mtr_LeAd=WqTuv?W4R(@_Gfz|#p^K?~2eqfAh%E;Lc(B-V984;8 zM>EQiEc_CQI@kFqGR7&mFOBmu;Lmwu_vH^3WyMJLFwj+kO3zv%imcw2&*W*=x=t}4 zk;>uSrRs6V;jrw} zzC_|JT^zZuC*R)x=kKE)BloH13|rch*OSV<{AB+Ao?X1$OvxVnWMBJQtsDAo8w-dRtPr;skUU`ZYfJTbYN^F3 z>>BTFM4K>Uw3%1=33{%W{=D3C`6UGC-BoB)g!vN9v)T8vt->81RW`6|f}x4t2yOOq zG9~{&;Iddy4kdOLDc#X7qV_Kk^&MH#>DX{A+}hMxj07x;2g_VGo3Bl+mXwV-RmWzG z$b$kRtHc}cr|24$y_S{<>_=ZLT-Dm{bt;A8BX(b0SepA{ls|`AQMPX@eLm%W8{6XY7L}|S-sY0o zoy~0S;{LFgRN0G|S}tXgLF9=Yf@qexXJYmniPTx8V(oa{cUy3}uOZpQ*>A+#Zsx(* z>0U=eTEi}NyBXTpQ~w1IIm26mg~H%GuS%fHg(arXFJsN;WOFKvd{CQfh9jh0 zA3ctyc$&Fi`k1oX^w|}q)um0B_zgWoFA48;zW7ibnQwuT;BIGnvSMtbvFyMJWpb3Y z2?H#gnZj1|G7Vc0ZTA)LOdIZ7mlVv+mt z)B8krCZh_o4qs;UShnPNkzeL=+uH()O-*{Fz-Wq1ln~B06iq1gj+rrp-6Pm11-3oW z%={B0W>|)Uw#WxJ&#s8i_8N3T>A2L*OGt$(RAOI;F;l~OzRHB4-nGe$PsjE^+}L=z z=cvj7_h@q_rE7{dgU12Hq-@bIv4SKC_L*l1t^TPMlbH)>J67xynbsD;cy4slF*&)N za@Q&(Iy3BF1hg2(Zjrhqx8~A^22~_8Z9xoh5)7GFsB z7CGHK&AwEb3)Ng()K&xy;4rdWmHGJtoM-4tb?G*4PN_lBR?#0Hq8~2wv{-{$jPl6o z1_iKMVA1~Qn`Ps>`DSUR|4t}P+a9jP-1mao>0RMpty4#}FLD<8m%>re!3DP#hH9O& z?JjC${iFFyS_tfR-<0soTB1~8J6ixL7=L0#gI6TaJ!swMG0n>w)Nz?x4{Oq_Jze#e zYFkMCw)!i&=2qP+s2=mv7BCXI{2;VaeD<}2VC0oE1d>}y7V@y2sA6rp!|N3e4FxiI zN{mF(GYT^NRQB8S0N=kdr%-t2qDHs>eUgrEpe zolNbasYW8-NEXTpWM2qd1mT~aWdi7*p4A!j4KA?es% zQtqOeB-34`?V5`1Dz5>il(+&KY0omD<$1pF^A8?$>NlS^kr~?{yz>CMMwua*s{Mu% zwe3))LLlyw3P~SyKQz>)FF`L8^1;z{bta3-l?vN3`CyXfLSZ(-oENXC?w=&rYKH z@p#(~KoCJihJhJ}Fc&g=g`DxWUK&e|Y0&CQZm3OA>VRe2ni>F!K2>+cZSQbaG}B+? zBPve>@lD}wx%(-%PKzK94d|&fdgesv8DaGNMrCe=o}UNwl#8AbqNg&T$6QR1Q*JEr zj-#*3$Cw$m+pr+CqIhKS7v-he_zpCAN{8*X6C0sKaOS*g=_L}0a`!X|EcPNp5w^w} z-Iy)eWwV^yZjG9h(h8ofWprudN3wNEnZIE84g*E6DE^&6V&{DWF=GRnM8-rm5Yx$m z7mMkfBO_vJqGlJG*Ly^7jg-97Tk?V&M*x$=yiTUsfsYicF7$vJ`r3(u)D=E=V2IFn z1$W6m7(0)N#EU2vf+X`@3$KQ{#mnNS@?V0={g}E;NB^^%bj??2RyA z(_wD&5}$|piSh_falZ2GrTKjLELJ2^%d*!iPSjn@hUadp@+@!eK|$&~Bq40si&4PT z9(}yjt;VvIK+WxZ+z#)&MLq4p4npsX(JY@}wCTq2_arf`OGZV;?|?d+Q9Qhu&v5Kj z*#JRCm1ub%ATNtPn#Pwbgc1eSkV=8{^BHE<$bVKo0*DX?esS*Qc4{+{+Sr^sGjo)8 z>ia5TcAdQ3-K)7AapbY18OMjKaeNDwxEhh78g-5JJ*R8z2rsMM3ElCQ8e2IftMVcS zk*&x4v@jo0!ERd?zo2bO_9HkSNv!_TXZ5B(>NeTs^THugn0HfZcas2^<0xAarC z;u0IiK;3^!KZ)kbxAf_@>9*gN{`~r_wse{L`PN%{4K1jae%Jbe7m<8RKLziDmfjUb z6>aI%J;qJ9Q2FvL9qJMG*U=I4_mQSgu1loWr>@ZiA${_26jxIP>szITdkR?M!#9QQ zyfT5L_rBu&nF(Du6ToYV;IWbWh4Ms9m6$GwNu(xV*TsOOJTS@ZpzD18_tkBFdG>8~$Oklc)21F{s)MAW^-A+C)&wa{IM9Oaq za=BxSOUT}3K#J~rJaa4M4=gVKun^P05Ys3i;raykr>f&K*=keQ7{Gfa?8?9YU-So! zdzhgS({Y2LyR5jvji=y(eAP=lrH{lTrC74M{AbWa<$nu}(TP9lP6n9y4oX8Z~IV87r#A~;iZ1e?h38R?;JCEdyGF106zW;0_5;faYyg9WTz@?fnx7F$ch z%{QP$F+<9MeGMGi(7ZRWiK#VX=D!XxwW%yOH{?yOYfQ2*xst8Ru&*|urcW@vXhY#r zKs|tJ45UFbG{O!xM;P~c{{?dWw9GpqgDaSH-zO&0$QLk@MqzO$85^1y4>(3u&5=bG zwUdl0@v9f>b`Wz3+#pP-@z-o53Mk^6C+Yz?C}mhATSKD$Y@h;B_qbmH$=xB%K=Ay< zxmSwXH=b2CQvFUU_ zTSyPDC4Fu6hNctc?U|ALf}cm){>hh{{wt9_ptky)^5!>jJvHqlH?_Zp$K86n)}@-^ zD&fkZkV(&m_<<)v8E);2ghR!s%_df_ZPIZRccG-qM*}CmrFrzi{R)ZnPndaZ+gsO= zNK?vK)l#A1@SU}8{!;vM-Izm~;rTT7y)^qyV4oT$oe)+?uEx5AkFhp0aK|_ALWTGUP+Xj+ZOaJqd*?>=y&Rdfx zNaj(J%;~woX18cx@5|ifyfwMp5g8BVvRtyL`I%&~p-2{U5)rRD`p9AnHL*!}LtdV~ zfKh^k>{5zatk73l?H;-jf&JOHbM1zaiiHUJ#J4X5fUls#V>B_MQVFsCQ_AK ziqxfYZ$mPAG1NDsMK2(xg-g+5(u)ck zl*VU24O6jLB|V|kNO^e?@m+O)dWkM@_-~T>#RTRY4ZN5)X?pn3s0a6`=%SxDU}0g~ zxpQRmQR@czyzSn~(5M>p`%bxYl4 z=slmey1tbC<+GNkLR^~>Dl}}68n#lsk$a7LtJOm}>T%2N5?NK7VqOGxp&YkJw4@Lr zjjX1WIy7+#M%Jr7@0HSvxPR2EBtfeNd9}72m`Tu4p#;5>S4xN5N|Z@ZIB32*UxXJ) z(CY?@Hv3aRs43*T)E^O|JtRa5FVy3H%)2CE;Uks=8E}6LPzG$hRRBl6@?oVu_5m{TNDI6(6$a@+1*^NW%7lx0^q1d^P>F zL5<6}8tA99i$+d7wTzrBZ}c~EvQw^d*@Ir|{pvbT| zEdWJ^vf}~K7$aYB+ulTL|94?vj0nwvTcX<4^7S1UOFTAr@9!y_YLuX!B|L=9SekoM ze{cd~Ihm~zD%-~bkIggk$l+-~gWLxhY35323eOr4Ps4y9c zxxs>XJ-$#Zcv$9Lh{sf~EQr_tz6Gi$0oAgD-JFzR$9+KQp!5Q@Cbf6~{h&_7)G3(l ztf3+rEUyYMM%sJUmWBM#3R&weFg#0gkLEgw_;X)wLvDUfXmESB&KxzMX71e*j;8%> zmCn|UnHVz%&{S44V&!k^Y~GQ{Fl)#RyaNjUm5XZJg^b*+!Oh=C{*kWq*W5Q4Yg_IW zPFCCe`7`OxO#YVJ1r2;scfZ1Fy!ap57OfCc-3lRXN<`1lhNwE>UQ-QmHHzTCEK4Ww;UJJM}PC zo)T?%-ml;vN~F)iFVN#|lDwsQ;&-igKQ__ZjfBl>po?Q5ku8JLf63HF?{Cl+eWEc5 zs~!#q)YUV6}J`o1+9#wdt`bYQ2^N`FC)d5d53*xiAo69f$5iuZG^`<|J(z;xS z@~{Lm(p&|c=#RJErml#qB>k<`>s!Z_`JEU{y0=Y~%vkOAWVWIc1M)4fAA__>bx8L) z4KnFr6TTb@+)@owco1f6^qipv<(F2?_nEVVjw3?#u3*s`G!=3W_83g6GiD? ziXC!6GIQFi zV;hvFhG+Mkby7x6V#$f{Fxb;z3tMd!4N5)mZFiU@f*r}$E*wEJ+YkM#*sG2Jw?`P+ zws7_(;1&nM?rOFj4V)D4J2j<<|7PY>tjs9C&zDe4^E>6x+=pPl)4~dPfcDnfo~Wnu zH%M4w?q-9=zH92G+XQm9KtZD#T^Es^zz;l-Pc8XhDrg zz^e=&-RT2OV2D`&0pUD@5kJy@S%98>DoTE9QlI;S`E@=8LGiW=8TUe>z7A2@GX%(7 zQjaLR^UQrtyy{LUQe1+fCc5f2)d4S6&_s)vt3C^_E*2d9a>%v%?RFO{cfe5;eu1ec z7=qYf7J*4;Oc)`MXKHQgRreNIb8|IHJWKhxTlD7&y}lqs;O>BFB+UIhvOmxq*Qrfx zO_ygib$*Q>K&rsSmZ#mkR29Yn6`fkBM3e4VnmNZ&o~y&$%T?}s8dL!JEyMc-6} zRreeY0=tAHKKpgrIWQi&-9n}kSOn*7E>R8Lj?~WG&*WA&YqgM2Ba8W1H@RzU8he}F z%S)CCA1OkgDH5(r{4Z;-!k z5_g}+pZ6=Q2%sXS;F!HfQ0P7HI({)fseSRKD&B9HsapRoRAvIA$*>n>`7M3!4B1#v zA^y*?Z+E)uz?o(>@^Hwhejh5RP+35p(oq?j_6}CPFt< zEGID!H<`kFTN|xy4>$X_o&Q205qq%x+pm)JKGTUj+-4e2n~blhSnU&E5!{qkzXUfd zTfy1j-N6?&VXr3L@tyHGH$e?W=r-&JgFW5#4{1;LgCttRe(sg=IdA$jYy_VKk(0Ea zdntRlwWnMAxmS~lOT70d6{WloHZ0F}AvZ0{-C}GJpZqp>Cv&aJ5WlIIhdV1Y8{y$T z+d|@YHoLT-_@24mx7kPd#4H>yD@)z3?pIPw7H8%Y;!TIaW#q?~|1=0C#59C(JN0lv zjoHqx!fwlP<6*Hc>_PA4Q=^jT3V^(79ZoG1neh#Y)Ky;UOai8=OE9iW3kRBSwDpqv zH&Z{?i!G6zi*hUIyL@jtU*4HQU#NXYeSvw*TJNt&Uu8;Gn`}BjrRonf4dZok(l*l= z4bL;}aaELRE}MKO>~TYEf?V~`d%l-_>veU$u&Y)bvq9iZZZu%qS+bk41ADlz%pw1? z*wF$7g${Kl1q#|>(9qOA!Jv4m3a-Bzfl}S_$-HwFoVXqn&vwg~^H-blZIgeQoB!X| z32>VssUD7Npe*}GI7iB96$ziR#&% zY#aelHh#1*-?DKELi_T`mVMK)Q?8DbSI}PtTAO-9<+qsd_{FoU-OhZ-{fyk+H}-O&zxeUX?#r@K z%0{q6ID%<;Q3K*|^`uV9a=SxmFnB#j5rGG3ty6n368+CxzB8Oefo_1vA$LvS24{J2 zlY2oEP(}d}NQR3y`Jrp*tFk0cvAKTPdOrdV0A}OX2-Px`<$Pv-g|NviTbjHu*&T^j zD6D#cC%YLGBfQYTN&!g`bpC=2vzDl~eMc;jRznXCDOK_xy+Q|1nb+?wv+(?VnGsd- zH#76K(IsLrXkE21VAaw#vd~Aqpsj(kYpGeDhn*5o>*C^a&_+xH_0?T{cbj?{aRYNcbq~~r~BSl5C0Q1#F9!=bQ9&i5mk zAANrZ4G&c#_!;@28>23)HQFUj`>??WOue?td^Qd+&%~x3lFZVCrFQg)rl!`#11&x& z@$FjRYxUyuejy(j_Y?2zhaD@gXxNz{$qI&@7Exm=f35L5*1l_D*jXY_#t%DlvHr4) zQJ&Pt3SCS!^(kT0$%l(?Nb62YisH@7F10V(T3pb1;xu5cy{fViR0Dm6EJBXf6 zuanoD#96h${r70gt%q8UZo0WW(qq1}Tka=rr&1#BMkKZ-}u-4N^#)NF&6QI>)hJ5po= zHT?PZI?$jvtqVPKS3n|lCdvezDidH& z>CAw(wqZ38kO1U7mFD(D{t*DVj$OqKA*O1fxm;+{r=)eW2eI$YtekVI!WM#usVAl zHIx6hYDSQ44fO@@4rC+OfLxc=J5zOP@O@$7J9080_ov|dk-_)h`R{|t&j>Lf+eQJk z=|d_4QP||l)R8k)2UvR6W_sP8#)YeF|F}#`wT%Y7KU${_xH+1MF|(V?5G41Kq$$mn zu+*Kk8XG!(RO;@!%`hL=BjMu!sdq!&?dpPA zRk7S`Z$%cAk2?Vb3RKy;wVn#*9x{7ip-8}536qKi>_`VBr7FJCJ)n$QZptQ82btxfdIONOva?ORw6VeW2)_KnpGpSG`U_sq(FDG zX!0v=wlb#*wlU|G_G~0^sSWBquJbu>Q`G^x?{z=;-v-Rq6po`vc3l;0s!gsuaLCsc zbjM4-rg$-{FseTkfY6}f+~jV7pzhqc{Bo}<)r&Zz^7DTJXm}DyS|Qrxj_q-026mg6 zkkH0_6TQ={n7+ zo^h$w_)%9VVPJqvzyNuDkQpF<;|BwzQ$0ln$g-yWEpE8`8AR2l8j&vK9 z3eHnArgaI=B?z`RL&j7uIWMJ;R=?_8(>Skx2`Ou(pU)`9SSRZtk=`v)ooi-@r!VQ9 z1-YHW{hwd5`8nUg+`JyEW}#V24E91(WYq{)(yW>j5eQ@FQ0rr{`^&Vy*833OLbQ^B zN%KD#wAnHA@4VoB{Tk|);pQ)d=c@=0ZUXhy!{w*L6s?!;M)~%*hk~w3!q9Q^CosEh zDADc-%kK@`#sej8bu>e=p8-05ev1Gr1z%`Oi2-{DDQ6^T&Vy$d1W@S4RFe^FUrs!j} z>3!XsG&+rt`&T}GM|kiN?`V1|gR{F=LlZ~UzM?9oW4nJ|J?4@c?aC<~GoLmaka{^? z<_6s&W!79~UQ(R|&+msW?$VSdhw5w%kmwVsjpFmd!FdDkS(Rt(vuv2|tZrq`{j5 z)9h7>$X=)0Yh(DTI2vsgnta*U8QG=u$+*q|%ib2+yuJNrP0}+}yT9Vq!v{FJ+@JWP zVN^7N6!VHY`=RP1fFhl}LLgXlAU?PtWfYP3pcf{*-%KpUejCgeS5O^R9z?_=M{~X7FMQZ>irOnwBV*t++|C`>6!p zFV;q+Ec9iZt*-?~L?COd?tsu8$H(kuSm8IAJfF?#`P$t7v@S^Mdub#lTFv?PQ|{>khu#ODGPNXAN5G3ggAU<;(%pSg`8X1fUTGE}SJ;nv~sHF;SlQ7A(~!pbcT}Tc-`~WKy7CT}sEWbvEPiV|&an;lYy6SFB6R}m_9f&$cr(dc7nUV5CnOT7 zWB7jx2jj=iu;i&J(^YaM8?_oqyEklJW_v>h$~4TATc*Us0z6VyU8^p_qzSdhg{Fkk zv&=KW{iVheWM`~44>iTL&|PxmYE3hjYg$cQ1JO<`jLZ_Z<7GfWa5NdW^tbvLJFs%r zy5*EF2AS-%ZM+fnB6$z3T0g-@$PdAZ{`^ZU6x)n@Kp zrLQ-M#?06msIaQPl(6e<6i^h=SvByhZXnO(fl~~ju^Qh9^-96l2K}0oPS=c#ZPY90 zc>^|gwO%Ix|A_F|VGs5=zwp=@Jf{54oQ&llwJNTEJg)Fh5aGjKrdm}eXnAA+^A`(d zx*j6=tV*%-s8c_jc%*?#-G$3F`r@qUb?chN1@8kZI4kZ_BW9{b-)06#ZRU;vAagZg zwoUGT`pq^|*|>LO9Sxh_Va@x#ebd8wdnHPh;6RjG6XKqcbNwiz(L}zrUeA)vbnH*0 z*G7}!iPSG^EJ=C1kMtcWkWAHC zAB%Ljkf#1+5=K0@e({~?@hzo#;M?zG@hx8(#kYUI_y&1=2fb_f);?p6xs^)KD8l!= z*>8R8d#9N{vF0}o->n~uud)cAw+H*;o96MwJpa!9SbVFNMC*H4zw{0D_#Vv~eTRH3 zzPUyC{v{)93!zzp_Xlyi+T(ls>5t>zs3Ls7j^dN|hv7QrnuKrG5~-|+>$IS6ZLIjO zRuW+$oNUg#fMuXCZL0UCHT{8j7Ev{z3O5~+sl$_l}T_ zlXD9;Oq%t2votTtiIk2VB)Lo9(IL3sap#92Q;~#owp)d4KD!;_qwv zyszx@{>47|x9{`*-Xl?b+!u_j5}T?-NJUbnqEBksbhJH_D8@5((`=I_wifJpuweEydi_{01UNxnX9{zw05<=+^| z|I^QsKl7U9pBl-3^k>OG(dXYYl7IV;&!3K^5LfH}LWU-wK{ zk&ev`rVkl5Uf(BB=3XVAlAVb?Q6!F%*L*yUz0@s=;%TJW7@uk_6t$BtW`-|juShW` zMT;3uF=0Fl$ocNu{m|cT^m_x?st~OE>~6RzH@`dG`;TIaH9#<%P^H$&0P|{nO7>Qq zkA?misZUly)~7z0MXg0e2UYrmnRL-&e`%0dZKT-7Xt7_XSkqszk!vW&&sDP@GHe%! z@!yB=-D_;Ld-HxG$eNiaCuDJYJvX(MT_dl`x zeLqwA`vv8X^yS-Nk^T;&{|g*sO1;A z!uUSs+gbr>#(wv-rR|Tbi_CzFEqUdCi>zB^HbK_k@kbGVC*V&5b#%u;MQx@*9b9hP z7LC-zPkzayYpXiRR3T>pb-2*<)A#|2lId7_51RLzS$1IA74<3#FNU~C%gU&gr9OefBFKoX>>eaY>?Q+s!L!- zbO;n2a+{`Q01e951B{%vLNI>EoOuiTtH_9u2^QEdr)*L1(Z1l4NWuF?3eIViSHXJ& zEQ&Aoi+<``*PlJ+%vl%v#T$jHEfvU{eJ&N2(CO1vgLjMi6pXxxJ^6E=VN?Y1*%8De zLd4$(7|dq^eWpmlAEGl*$1RxsN617TQ>UvF~^7(HxRUH!~@mG2A`#ecMWTD-q%w+0Ii*ToQk# z4cq3|W>%dvLq~>cveRp9=sx% zdSc@22b;c`OmCO|acS<$ejbw^A`&apM{*_(=B%`f!O4}ZexiBD>P^irCtItD}S7CKDAms8VkIs02VX`-=r5{``!%*j;Ae3%)TuZ8E% z|Nm3|aRGnd^86jTV&d#4;%y&5^~Cfxux3m;QJTx!P)P<4eSeYf@L*zUQ8Kkcyk3~x z^j5O^$@uI=eBlDKXH0XlO(>cEqHW0gJMh}{X_!cC&e3T|R#sAvxqBHMOa#&`jgq_3 zu`?NZA{lo;PowP|CrdPUQ=$<$y{jZUPhWqj{?UQlA|ISm6P@VG_TYGe&%1D)`O?V~S# zu{NA9_crYxMSiQ0Ls1S-3UZ~T97W$C&iN4tw=M(B&;_9)p6rq-Ns7_7H#w2Iq&}Am z2G7;_C5}Hv`h_U+v2&9=Wxj)5z#WG%^V6j!F#DKkuAE?@jsaW?bzd;$7Gut1|2YZBT}F5%E}Mx zV}S|GUqB4bqWT02wqIc+-DRa%+ii3BFQ03*sCWMg*|ist_DDTf&SE|G!7b~T#Uk%J zeodfIKX7faQhX2v-?*Ys@U1@#3jR@8@XbI%`HPf)yvkoxP^~7v(fVs<@Y(7gA>+#d z8B?-ZISKnIeYbvhThDIpD1UI7)br>WlYd?uWkzuS}tnhWNXLDv$q}GsTAS zmDHy^QN6k88wm|>`>o=J))KZbbq&vbK5P$Ni+eiLu&qC0BgGU&t@jn&IIBg>-A?EBPHy*tv|r}CAp zkJLY1kInLeyh7$v!z)xGuMqwsBEzY#a;Hj-_jH;M&AH?>V-AHZ=BBLK1hPN1wCTcx z!tt6{X(#eC0YdDxW65d9($31FQ#n79O-xB8^{y~ZZ9c6~|8RbkNUaF$X{__=XE@KJ zoSJ!PX*jn!9M4tBHtj*rwHql*wNuLDM-SWxW(^PDP@8*vtuyNeG!^t>*gv?G^c_?n zL_c6!P4~3S7w^);2AWc_;U_UQ>&nFh}s02+w z)c2A`*F*r+`vXdw4o*~m)Kullr!Wxg?dzEytNDJ@3>pG&A09%xD=nPc=kMBTPo$?> z`*Y=4wEfbTTHE7x-8Rv6l&??84Cf|_8bjq4$+L^(+#ccg!Fv7-2i}Q%`F@A0M_h^Cvk}B=c%G=38zooruBp z#V)oirK|plGtNi2>aqfqPJ8+NsKJVyCC49BMgmtM zb21$}72Cfyb5;XmGS`rt#WGqUXo=5;ZJusMZ17zZoa#5fLuxY@&A>6(s6yNgj7;H% z4mqwxdLnQ=w#!9lHvZBiAsJ)tT*TLt#C}hnbGlq5_eOyw_+R~5>agp_u2>$??>Nnn znsBf^lX~|G8#++6%bI2wJKU~nA0Ni{Qg3#iyo^nL#tRE` zmyGhl(`vf7MAiH})g)~riMGy**M9>qw2yz2yBG0mT}mJcsp%l%MD^11C+McbBvFG_ zK>0|xTR(%Pzw}UIS3IF12oKe>Toi09?n;c_qiHElt+qWih^0PaKYs6%xm!$6=FI?$ za1X1*!VA8mDiY6E8(kvombp0Dz7b!G*b7KDby?Y_(^G`F}+p{NzWU ztPif4`k(8AFK!ioK_7er{QrSI=smSReUJr8hr6{CPDbqW^E9kme+ljLP7+4+!H*b` z`qKxK1dr;2F)1$MNZ3dw6U4bXFsHiJ?@yH%Cp~PLW@S22IX-^ZQeA4fHoc>}oo^he z+#}I79x+pg&kySbf$%Z*xWuC0uZ$nuXUX1hTUL0=6S1i_bAFk7@;G>r`g(quJJr36 zjSfk;g6f^vYKJlG{8P_A9-eD<5CS$LK!5{f<{_UBW)V@z^!v8>kP4@%VcC zHE+P(LXeKl*NisZ%t|%4h?)*!TAQxto3=f6jUOK59AUpY4lur)|0~t2a9_Q}coNiS z*1GFdNQ$AP+ifT8-UfYOf*!lw8S=T!TH+Hqov847^jN`V|AWf&H!@9%bv_~bK0AL_ zO#7oy-U4 z@E}9O8*>_GKS-FcGO0VCds)`HX6td>9jI`=A8+5?N;i+lTl%7Mb{>rI?x4rim^hqM zIk#Ak>@59_Z$0&Jd{2tA95LXre=HvGN1|>)0y5Pe8xpCflPN+uvq$T2W6k;HiS!AT zC_n;dQC!UkM(!jV?#o^6H8N$``JmYs$9#1Eag8Rd=MPVpB$<1ai3@r#=}L0RC^MOj zV+dIjpZzC3`5M2`)HpHqPouy+Xq7-21x4xVv~)B7pHwM>;rXjo;&_#qNR15()bu9Y z`4wEhmMTf6P9-44S#TMlpS`hpZ?@aA2KbWr@=NiB?G&N$AH-qz=Zs}&?0uAYId*vN zA=w4MEfC`-w>@xGb$E7+Sr1)qZc?h5AXA&%UywC7+-A95uF>FY-6%xJl?1>k0M$jl zEa01FMlN=D$t3}BPpNR-&k($SA$Y&W-dE**5xviacAB+L!O=|HF;TYlI!%-x7cf0+ z^?j1(s<#%H;dZ5I5n5?UyzQ@+tJ@tcHNEx4f3&@4zcT9g1nIMpjB7g8z|G*bL&cyR7 z|A8U(WVACO2^D2>xh3@m9eb4M78}vynJawcjg*hT;VvF00vG1C5B+;ue>|SVPc;8K zk-8$l()T;kpzo3>(#T}gF{;j>M3JM`s53$Aa;wz6Va`08u-$3tuzytvAo^Dn*d)VL zQB@Dgqs;uS;J4`<)uUY*rDgrmFL(P`UzNf-YP24feQWi&%2;T1v2;GK!k+#ib9jyp51rk4>BL&@A|<#>&@K=;hS{N@jw-`*aWaP14DIlZgL`^-7hGln27Zr-tgtEW{AZRWPGZg;yhu{!5iGNQ^1_&96J`wX9_^=WQ1P;$!=1z3-;HUp4R@>4-Dx4GlbK73JQ8g_ zA_L8`8lqf_&oPO@=r6WP_#xu}$D>;Gc_E!XH#Xqk0ysOsJtk?-R2}zw9cNj3PZcnD zI)3Cv_u98bI3c{W&tL7OcRYRTq{YG*itCG%oeCL1eBRCcU@@Itk%+ftcoy~Yu_Q*{ zSuvd7c-uGW>*{{kOb2@lDoEi21dYPF5Anp?2)Bwf+-4|Bvm4&`^K4K57oh*1uc-`l zN~UVTf0qo%jz)_X#w0UUdswZ%$1)l*b`Fj02?_XF>7J*w-0X0CU2roLx@$Ci%9+>Y zMjtIk#F`$E->Fw9XMlppVi?N>;8rKM`m@6V>Cjm2Q2wU-TOQP$sPHG+rW4cb{fq*zHGumcXj_5&8E=CX;^V( zZlY?NY4f@y!zd@Q*0?-WlYUUv*P^7avsMi?&idN@Rwt?zB_)0of0NZH%0=-x`)CO8 zo$&iMT?0+w%uX0_>}->Js?Ak5c%&QM0gMz2$jW(?BSlNqy}zSpZ>ti$clBuXyL?0< z89So{p{eRjclWsE)?_+0Nk{T)Rc5vhu(IqJd>Bdo4b6h2v}nCwFuWzx7s9kr?rKn& zzDQ=S?XcRGD%mI$0_^NPemdkX7?Fm`^kEc^7j{SKigc{j#>i3bL=ZsaP(0c{i%a-v z=<)awVCD#o|6xq%Ifo>nn}s;=tDE3viidnZVV;Y(QSHhGWL`g^4c6f}>P8K3$7 z=QWIiu+m)sgHb}l1CKARsD$xujp-hLYAlJElzE%(Jt;9`@QNB^@Hr}V#{z@1W;+JO zxZSMnt_s@RAO06ji+vYyFQ}E!(fzb-J0;Np#C-Y!`^#^KuhS`ZW~6FpeY&jHOSC*EmVuv zqTekTsn&XFl%}lOY`D3Jg?&wSH3A&f7}}ZG$}uvr4QFJ8VvM~Kh9h&Hk7aiA!BzBP~^u3@7pvJbfZ z2|pd=141vz9_1gm()w3Q!7y?hHbE8X)7(uh?mWI{FEA8u;V3xkH)u;j;PQiEJhIcB zr$ z+qrw`-`p&)uS)4P1JLfr8HAeChIvh{mT4HxUWVwO(e7OZ`6*Sz-xo~qT0i0@re`E# zp=;(#$<$LU2*&5=4%gbuf$#7m32-Z@9OsNV;^#GI9a31EIcY>9JyFwhn@J_uX*q=p zV{0=L%W^xj9!t2C)DTlFS|LiL-fcQOJw|)&($$Gg8X zZ~#;f;QGATy~m^mFJTiOIh&UW-z5WT?dFHeV1$+uYg4DoSrsgfhWi)Dk^4FG$=b~K zIj}xqgz7Lc^-8u50daRTLP^1&d$@WpgDXx1w~bjOi`_$-htS8qMsM`%B}w_)@I9N$ z?NM$tFPGab!LGhU`sB@t^o9O_xKwAU`#gG#_Srp=dd7S$LbYkU80WOXP**Te;)=gC)&!b)(lvn35t762)yv$VQQ$kZcM71{idnS z6D5Y5xUFD3n~n#qNT!~dsEO;vWJ{(?weff_^WXd3zSCJOX9qF6JyQ!)n{D6eGtDPd zzu(-QWDKT3Czu1w0^{Kjtxc5^I&^gXO*v5VRD7ez^X5J;YRYR( zo62(47-#3*+X7IeDSre=YHGhj(B)q@U2gYF?#jEg<#*}WIYLwisF@-A;QG~DV*iSv zD!%gXPFDsr_ZNDPs!*a_RQdB@1y$~TrVP2qaviz1bMF*7RCs;|w;|n?`AK(ex}%Xw z``Df%H>MT=8`FzQI2Dbe1c~&`g#^5(7LD9E1s#A+?_J#dZ3U?Ct_87xVp zr_W%N-}5haxcpqP64l79TS6>7(!087L*Ibld_ck$gyq9%j>-2hGm(0-cE48>t?$Pb zy`uEOLvco+X5VKbwxW45w;&Cwn9B((U<}15o$;m125lof9E4!Z+gllIBJKBv|K_Sg zn!Wxy2^IA`cBNF5>=_};-L66Rw%k7%z+X8IPyb(zDBe-q-ZHavK=bz6rq*VnEXSa& z4KC1P{kYVl<8cC}9!5bYxQO^GilkGnguGlZNN<(F+p%f49_mqmk{G|r`J-cF%TVUN{zDl-P4MQ&|2>mE0k?yWG6x?0` z3U0LkMVX=CLJClD!^NO>Oa|X*%b8`#T;P*PU6u<3K zp@Lr#z~x}#eco06cdn*^N`Hg@ZSM%+H~HU=oBi*++XDE!0DhHz*)0C)cP=5_w}y7dA4-vL~X3eo>T0GIDk z^bGR99h!IW-aa^hm-*l8bgh!$a%L#~?)+-GxVNrS+NxX*_n5mEMa~r!;+KG{1EA|t zX_aQ5ef z>50spM#&lDf>%|MEA>lq&!EjmSQ?7fo`yBWbzvJOh?vX6SVV zi9b}TeY#F9QJ~Pl6}mv_U7pUaC_7_JymAp~&#zIjBS`x)ALwCrgA$k5=%O1iuL4RG zWaa!w$ad17i|R?mO*Cc4*wr`qP{_}%Ofaj1%IHHK>87p*R9m6orDMy5Y&FRoFlH~l zd~lsmsxR)0aq-F*`8177YIyH7gyZ7%+(TUXC;39o1S6U&8*WVDZ zj8fFW$-R*jjf0dzX&ZM}u5K0ihG0*KN@Rti?6#nNvQyN$^*+oPDWl>1vX$-AAw*n-^`7!`!PjJ!hpv_;on8j8{vqM3 zA1X2iOQFsf40P%mp?Fck_lTrbESszwz)ms#KCIFoRgwq!Fljk>A0+EsX+0=;P$e3m z9RME^ATG17M!eOLAy%X?gh*^Um8y~gc6f8LQCz zqXEgjsiK8)gybbd(8%M|hgIbJJaIkRe0`4B6Qxu6HuGp*#e{wm{eRMPl7f}OUCSL+ z{OobeBr6MA>8Er9u*~&^Ozjrt=X_!~#$8wHOkRyG7WfpZAY$@N!}}_L1PN6mfl;zr z-w7Y#nNAcyxh)Rq)*qyc8pk6U_) zx%%Pcm8$Q<%5zGEqzcBtnDP8ZE>vM%t)<4Uuv<39O#JhS@nU9nx>R%RoHPZE#>bQ!u(@3J^JyHt_8QuuOiL zPuE>x8OrvU!wekYROvWVZ(M%}|6f(jJ7le?aDRClN?k)D)OY&K)6iL#OY$w@LsF)z z9+IT`r&XxrXVR16l8k~$jBkv((4gv0R>e$;__7kB=G`Q`(EA>GVV(*R@Milhn-}Pr zz(g#Yw>gaZ5<6@CB_fAg^ z!vfq{s?xfAPRTsl@dIYi6uLy*dWDwOSUFDyFJ=GJ&{Oau{J&Buc$j2EPmYHbRzRS_ zB>E`1$xo2KT?QTv|AdPBP=6RK)j?(aOnz1=R)i_ylb_W4Q@n48AL!SwC#EOzg7gc| znBL>DTJQ6V)@GYN_YJH?{3?9R+pfX)(0sj1Nibg@z^B(|e#-ogIqs}=GLAL*8<)P# z)-Icefm6V|Z>)s^Bn)kK+q3m}D%FYC4#rI#ZWBbF&KNa5^~i?!YK-&Kx?6{kQj0ULMzLF8o|eJ>(2#}$4O?=O7>v=!bUF-;hglS#-0a7=|f`66H2D>iQ-J4B_@vp zoV*f}j;)lOTvZWBV&w`xOj@b5Z!6zb*0F`~Y1QmWJ)wZgE|{*bULZuP`V+L&gatC( zfJdEv@=9O8YN!TQc5J!+?ksHTDo`dxIBAh;WTR#$mGrX=eZIox3o2rvrBLRhYLtTp z(*>wyKWrca*S?BodhU<|)mN9QHK}J8zua0mS*_bib5;ZE=6B2>5KY>oKWO7gtI2nY z?9)jr_#cHZX`ESeFCt*KRlFwBWve$(Bo;S1Q{WcBpqgZjDw6>{$)CmI{8}+e(-F|t zS>8%s>OX+qefB*bG2w-ELuj6ANk32~X_{9kVx3<8DGXGBf=p+}C%x+HRE9Dl_d4-J ze4?a%*6>kk_@kn4VC7pq@XgBDsYYF-r(Q`rtrG7@_1#$%qJKQYOfQ52dS`e z5`*=3x|N(TVy5pdNR3!Iq(-P3PvjBQo}dQ*;_05|UsPyKy)x8KS1A|kabAn3kzI%Z z*>{@SCqZB%4{5p0Ct*7el^KUk;~A>#4X5aDhvnrh@7bNvBzVmX{hhCQ1^DJ_5E5YC z6~V*Y_Tb@WjWqgnody`v-mFQ20HII!I$7}|%JXzc%Y2_e$`x?Si~e(qxk|~`ArqGm z9i9HSJuvj=OU)ZqvOP&KcSQi0_ml^imr^M@R(n8)25(ZfJO4Xhqm!Xn?*ViF9RTJ@ zzDRlV2LYfx@aSF_cy#BPM_0H5SMJT`%2hoBU+#7C<+840lB5F7r|WN@#d8~PJMSaI1ub$|Z1N7?tCR!_`35$IL@Z?1L#7w4hv-O#+hofrW$E*$;g+4kG27|A zue1mI*-=WJO5_hxVXYjcv1UR!WATJ?3mKyo#TLls)Y5mf{U0B!CeQdZ`94Sd<;KYs zFQBlS{l{LL$9oY3EH6i;})1mecZR&$~s-VC?g6=V(^;i|hdi*N^mmapav$wy`qx zW^cQe;j%UMkt!F%b60zQ_O~7tp3hle8;#gEz-|G=Xk5i$m)T#g|NZ)HwEun_r*2Y@ zu_r=1A__IT!|+kF#jgHPwgzq&wEIP@z9RjxP3LGixZAzYyT5*{tF;ZH`EP)`V0Qs^ z-o+gQhaMOdWWJOQ8V_i3Okc+AqeQG1cDrxy?TJ6)K=z)s@ST&@ZltF`+joxIOG($> zv(0WCw%h3TWqL_Y)(Y6Tcq`PI;)BIYhS$XJ;>IFQ?&VL}j`>dZLeOdlC?)M)sYmXc zgpy$8cRK@hyCHzKT#vN#Q5%`GvZU(6TC&^%w_uetHfOQ|QMk;|7{l)VI><9)D|EgNIFMDH-sS&&At*52^(X{BhZRRaGNw&wwz0 zwlO3}Gz295;mUpcl0yhoQMGLBiR@nKEL%4AB%Z&`x^YQj{;z-at0Sh_$CClp4_r2O z68}%;qR{ntKt1D=S@u_8MLEAA!BUw*gY{;x9 zmku?;YbyrF58h$ZrJkR;5{(^YJ1y`-VA+&Gyq%`T_X`TA*t#;468B>;*^M^=)8GA~ zmxd_2`!xB2!7wpsf^Fuoqc31Ozjb0hzxDd<8rz^BwL{m~X}j~-HMSA9!6aG(3I}{{ zsG6!t$fhG=2VE}_YX(7U3t#n*$GQGVkL}^33EkKk?p}H&HKS6TZ6C}N72}j}3+Z^F ze%vXdOjKNtLWMN(RzHY-#cu<TZps{3}5LQ%hOzMtnI zeeXT@ty^{K)TvXas!lc0LrvNQCALw!U@O4)q!U5|K~rbbDdr<2Jj%Wr%mMqQJ6@1M zm9z?-DS8&IlF(Q5LTRxskBcI=+ZVNgUOED+c%hegzYhHn_0l(7TBbUbkL1yIdpRG) zwrVRQ?-kO5uB>v@7S`)X6Kif~qjQX4QH%6PcWC&12KXoi-}%o5@SmXVWAFkE@9Sjf zeEsNRJQ~`xKa>7{kJ5)+5?KCiSFT7&6UCT^C6659V16P&_>xfGsiGenD@7C>rmXAW z{Ztf(Qjpls0Wm6dR~&(IbJ5tHX(&lIwChVkZPRp%*80((j)kEd|6(zxtg8y7ASOtl z5S?K)ER}_=yx9v%HUc9W6z7NB%UY)4(o}EuJ4)%zzK-4;Bzp6D(VI6@Z}v$)0e=UI z#)Ou}^>8fw-*$3C*56Ep0Mxx}0YV^V26yYqef%aOxeOfE% z#pck9Rh_HDU2)KBW6k#lbR777?nDZ8O!IZ8+K2jlkW_Hz38-VO2P^cWJDf+i=tsB7 zBkm}$ua-yH@6AVzlE`AKYw(4KUb*7?8~}*F+Gt8P0SCgAdC58h1TZ# z@hP_O$}*;gf70pIRZ_|EA1GDo3UZNOY8Rk0LxZGeP6{j5X8FGFaWAH(q+gDR!x?2t7riliuCXhg8N0&#BD^HOI|rReG+d)fu(- zl`+2oc0@x}OG{sRGHL8a6Q8EHW9Hjm!f+PG(Y!a9qO?90vtf!x4SbZDrYKq;MKZ&#jDFBDz&5iw1QL6#Vt zGJdCpc|Z-HXkkW`D6Gtt4HfAYNWI=?tMutA*qGr>*rjI4&MAA0R+JOPODLx2wffO8 zKGG35qt3*hpedoEg`b~buR_NZK@@Z`F*5~;{TqUe#%@v;YHJ6%9woFNBk)5F+#$Mi zyS)!xqkgnjKiZ5(RoquVed(?k3W2rYsIao(dFYQD73N`;GBbbpH8Yd>N5ykH?H#Hy zDl>E3NToL2NYRUv%L;X+=!5f%TFsxxYRE&?xp-THhDZD43sEIyOip^qm*Z+->68QUKPdo=qK`My}gQ$ z8rh?-krs5F-SCqa=uh6K6MIyp|C{X5oWLgy{h2XmW~o>wY@Zm;+B@VM;?nHG7EOBz z*65k(Hz~E60;dliDwn1^1IuP+YwGdp8hMHPPx_<}lQ7bY-Ywmtwi_{pOPNkdP6L`W?iZ86g;&a0d2|#J3qmX)mRp;2RhOP57#e+IJnpf4e;b%}RMV zD`20-b1n&^V_)#h3nwYj^v)%(XgadS8rh^#W0VmI@+qAjzI-StjTxe}Id!k7?NMJ~ zTrnhdlsyIprpnj1u!iIFHN2Uw(T3S@vcSgji`ii7;HSmpZRme(oQ>_^mCDBTjk2*B zikpI^a!iZ9F;kd_Xs#M_gjwJaNoS!Dmt52E;>oeM^mA-@a&@vd>BR zeS7TRUmxE1Q_S!C4J}D@6yL!irF(Nj z_h(Km?hSvjQr%;32K2qVVl~8?FL$&8RxA9T6R=QK)u{|Ci&ehrRS&y{pzCH>m|m=$;-}SW z14nJir@eu;>2~|?rJ|b7U8W3EwmcPIYyuP4uoLXpU{gjb!@??nzx}-bH}nOf$AtN4 zm<<}}FZ2cVxBl_IU_Z=QG&Uh zYZh&{|Ni5C`izqj{g=>i91U64OBoi}Lsh0+FLa3+@x5W>#~blU_Qr$z>)+uVt_;hz z*z@Qkp~-G{06e}bo;#qc;!x9PwWWW^PN!~l6sUG_sGOm5ISzw7@D=R_9*$Hh5qLO0 zgO|!=g_oDfacHaD39T@d6Iz{*WPdPBw4X62P)P1v}Lj`&)hN6Q} z^JU_|7z+W8IWTTgnR30H71MqFFy4;WeXZ=xFeRe8kBxgFwBxVLn;nC6uAg+Ne8MC+>>BTxddzMV&@mFWhc0u-sRw;k)H#?vY8LE);XBh@< zSVHv|bnW>&g*@i3sE1ifrPxoD<92&6C(@OZH%~wEIgdK)N7?d7{1qq3qxJS_eALKj zZAMzqRo?KEcj!-k4Q5uW(m<2TsxQ>|9O7$yu`>u;pt8)G@^K3M>?Y zqu^~?@3{Rl<8~C|8aHqtbaiKJ!bM(sI(9dK?0NwkZfSw>4eV~<5`_!geHKX=4R@an z?oNoCk#b40J0t9Vu-e_n#$Eb9-F@IWNICU`!W|zJtHK#;R^uFL(v>()h$q$zXqMW9h#e|L60I*mgc}hdjqiKyxEhfA075bDTdA zo4f}ub!V)W1mVHqZu~y!CtweWB!G>Z$niXE|H3W)<5Dud$UXIL=x=wY#bdINYqDEr z-1>hnDPu+q_i4c3zCX6d%2V98!L?f07H=!Z*~#1p619`bvK45_Bc;o0TKTeTN)WrN9(J~jMs~s;V>BEO z0~MDc6LZ=yC)#qi0%~uEFYvS!f(xD|p^^9ykZ>B_!}{vhCm)aPrdSf(`3uJB^fLff zQTSO99e+;&_D5jhNuPATH}EI?jL!*NnT#`ET1liHm6W^UB6tq0Y!zJ5UGWg_fWvqI z0}?B61b)T`dL;V*^CA8QKhMvW*CaB=Od%{DEKfk~_jjF%oxfO*jMd-$T{+wZ%pFPG zT7v&}8mu&ATeiHSjTE6``=qxe8UG<$*l|kfOUK`V>8U=QA3TTaE(P23akbIiuiY91 zCdDOX53AYm7hk6o7WGZW#izKyMj504S?&*6grKWI$ar_Z6CVTC-Ou%alLT5}5f;0+ zi}I0Z5uA<^90B{JAYdrHyYd}GhEgG~SOvr3A|&f{Ex0Qeg3NjkUirNhRD-U!#Sa7H zH3NZnpiPh)3?wN|S02EUTCUMya5QY|)T{f;z))pGuBAGhykG_%IMy!XxJCWal9TQB zW|@aqRS_P=*j1Gul#KTUHiciIwnvm!k2DbQ3>pMXViUEWpob9O1x@i2ng}!}n$acT zAR1e0_)YX3l7LSVu<+N10rb^KK(KfWEFPmaJ>eXz)WGO4{4H0qMcY`^Euhd}KG*fj{~2lvGpS-4v1}i1ML8Z~ zIX1wUjklPFe22o&xK-x{!S&V1F{!+4T>ct0nv@&7jy6JLr(EMHN`(U1GdW=ig(RvIvmjvpoW+F)i?WpFXseDojlF)f#ccIc-DWc9cD(Nr! z65IFj9RG3IX)Raa&p{&Ipe+1H^N{5&Xr$13Y%0=`J<6O1+szQU=<@auiJN~FTLME3 zP84cYnf%D^ENf0Qkh+zLqretnQx4aV)lwEX(fe2Snm&x~(mRYwanhYCMs{IM( z4%t(}?tSDsrD{+g`}%hPs~mNMzMwhVtkycxguA)sW3b(z`9`(TTxuhC!635p2V~1-9DO3AFc82+kyU&DH__(Y z2FXU7Gt;~q4IN(R3~xx(R_8t5x}IrF9AV@$;3dQf;^H-Dd(NrrDV|e2rJHll)o>it z_4M#<{95|AQ2&a{)ENf?JVYqqIId+Z>kYKWrEb%^@I^XGd(uxTHKG!lO3OrF#tgrA zFe9q9aZ0Rd_r+kOAov!WHZ3G++T18|AqIU7n)XXj?Ye1`exgH0jsEFB^Wz{4ab_T97YO#W|WvdSj zRo%W9L7t$Z*9?^Q{SS)rA86klW9=JXMEg$vo$Y&m$wxi}xW+~#j5(yG$2W6-k0vcQ z+vVnhEIW!quQM)3w}av-{ZEn@LopfmQECI<=`&L z_mvrZH4Y(@op8x?cyxGMZuGhJ!X$%%)sef<@)7lc6wz2{a85vmABUGqq06s!GF~b!7|imshq8 z?+hdk8P`$FwVgw@e+ebR@y&F+XocF{1-nJOu%TP`!kp${hZOsn7whZAY(|GYrwk{q z5S#S{(uFz6Hv}Y6^xuJRL)lHEU@SpIU9X=co*&NW3__dJE7f4X?I=%3*1=ZdraD1i6GOkH&@@I5z!>$0dI%cTje{%ZEdKb8x%{sUzcHoY z1$sEU4RXsF8oZX7SaOVHOe>+i_H~?h1ra%DNMts8Y9biYkVvMSP9n@39OF4G1+l%a zf{lpkPPN-WuN|sdT^P!tI;&4r)yb+vjmD~T)$?)HIaycdHEV!rQk@YPiK-5sq*oQS zwfO|?$XjUNDRV-Kx56FL7Ycp5-3AW-_}bYC-Kh#RZ0DDENlfD^I`!$AoV)u7FZG#)V<&o03FktRLf$z zwM=!!YMDu59OoBd0E1TdK_S&SMvpkCr8W2r<%YQ?#)d~Hd|>T<37@?JZGtbM0iRgf zhX7a+vJKnH{@h*J*Ts;*rHOnA4RoOhh`Vyg=&a!`|W`iC?2a5wBJbat|JOA-|wz`z->bPr~ z75v9{mZ(cw!&nkuA;E}*rkRN3tBX*q@@fzHDwztpN?4`LKOW7%>-N_WUc9;zR;0ww z2Ahx=`;8R*XTtlKD*k~fG!PrWp*@E%sU3K3XR=VCF1s$qSrO;s0o@uUYyrU&$A~4- zTv|P}zPsW~Sie4W$sSsg7G6%k>~tZrpfr|;E)SMa3=Tx=fw-xFPjrxw4Y2dwQ#ydd zJaDRv4?+y&4DQ~iZUgh}8P8CRUe{!_c8DlazE64NaI!!J=XboJOF^j+XPA}!sk;L4 z!s#_(^D1PI3jQ%34AgL;yCO&;4%I44;IBR^23(qkd;Y6!ft>JD`W5L~2E)RIR$C0t zD2-071_PlYy$ldLf%yy}h#ua#Ufx02{Lrm;K?U%uL+tfWYr~@;urp`&2w)Ja93DYs zS&P3MMH}KolmCu=M>GquSmmqbDR|&5uTAk~??o`*h4RStz?BdSyw7?RfkM`%^BU{6 zNNOlVGuSTUgh-@73OYt5=e|PAb=*t#=@1Vuod7&q6T#Xij3NWnS3GDS_a*5s9_MqC zr`Xz6Q1Iao;W@&1(CMA1AZsz^44=aJh=$K!=JUH?;>FfiYX0&(0?pLhpCVKJ>EJq^ zD$(eJ#S@f^i||<`7jWQ;DQA+w_Iv2D~QwHNUz!<*snICjPU!DVps2>x#32MV72B^Y!E2fl?DiMKP4Y;4fr ztPsOS@Qr7+KeRD@0_du(h5h()bU(fOP1T~Op+kzxb=U{@3fKSBfjWxBXqLh^fdW%g zxb!|M6vtu>N$~|oB^P9W@6YrGFQO;)`0_>dJKXbnrexbCZb#;9&bOjfCF5XY;WCa@ z;Oj2?I+%tmak+49Lq_(l{T z0zrc&O&-as?Qj`cF3%U*$wPb+>Mz6dvd`^osSGWQit|n0mZ{8MtA`|((3(|@_r;d zS02@b-%`J56>EBm_8ApbQKCb9E0IwpM;~3K7+>@-?pzrqTzb9G8SgL{4NaN0*dDFxuicV zxm*~&Tm6zLC*ip-uq_S@3r{oH8iLnc_c&tmPx1~m5c)%yA4esD}oxNHJuI|0%c!w+uay-*; zd}ulLrpu1>nksZ9qSC(4ADP>GLa|xpmRaTdL9%=7y+%~39<7maQ`Z-Bj-M_FYZKK>hDJPA=l&v?}uEUb&bcv8+Hcd4LWBpT!vlH ztl(Pe1eSOHz&@F68Lp-Kt06+kQVyJB9iKt;y$$f!=L-Hi3~7L0j~4JNc;|ePxkFGV z_8s7WoKuA%w75pPVI>EIU?7YS3<#?T??UrsZCx4-UuLFVSi=Z@U{k2nFn;u1D(~V-?2ZS5U@5AkYrr>mZ0;pU&6Bn^bt=f{cMCPH2*jv- zqWnuK6T18pAgK;_RQX>8J-+D47{4lp;Te#V>!PlmQhvEGSImEb6x%+-3TWIo;-dn`E_H?n2B^#vzk{ycpQ z!%Y+f4tg_jXfsZqoq!bCH#{SD-vsF4S}$yf^Q=%VRu-)B1$KEe>%8-}H|rJ3o70N? zg}sKA1vvHWZ^2uV1Ghq%WA8@!JnY|?kNq2Bt2_i-u^{n>g2eBAff6KtGtWH3aJW&X z%J6OU{_Am;RpfRYpmQ%4kJ=rV$5-gkD#Q8o3{<6J8>R4^d1!ZdCSW;Pp@|thp&sYd z(>DJ%Q-?Na9y?^U!7=q!Aj>iJeH$KAAGKGrYkk3MGyEfQoTq;__I~cOLRaqdX0O0< z1S^D{pn=>he;X(%U*=cz=4F0nFNIsd8|auGd06Cd95T~8%LK+N&v-pTsXuNoPWYtl0&Cx-{1xRHHto-ggh&!;u zn+b8)2XRP}F)@P$TA@~$r>Nb5#H?%tzvJi)h6GLPWc$T0nJ1pkRRRGiMTdl^Fn+v= zwFQZr{YUP0k8Fl1Xe@5e-tR}i1cdbXN#x)Ie+$ywZ4fqVK5BO!PP$rNg036F8CYXw zV)U`dD&Mf9AT&NH&C1^G?;=P4{HWxd=k7Jd?*g79p-e7zA+o(Tc=PFz!HH$Qzyt^r z&fP0tkQyi94v*B@hj|;5Fh?J5j}k}gGkRK}+sdBjo_dgG5SA>g%#r1d5J4QR9B$c& z-5h6>&)ooaC7{pI{Y~~;+?U}$f@eB;5`t3?K%LdZ>;r`UuBAhV-RK66a-j<2&%d&Q zmw9jspJio#=s(r!*4YZ>B$u>}q{Z}Gc{Su^)IR^wXiyl!m3)UDj{FYYk}OIMvgGCp zAN1}+sI-E;EsE1@^jO=XCtiM^te(9X6SqVm|Y0gukIBh9TN~ z%oe8qy<#DNBS%aDK0Q*+dEgQ+3_sMn2nRj6!1FEH(Z3aiqfXo)NOtqLP ztXDjWYcvB_`UhaK-EhFd^Tc6OhId#mt|c%OPzUqeQ!YXt@R3tr#*=U+ZV)wAN&KUD z0+xuxkG)FOSTbG+x5OXl3GgS{6sIcjlcxBDx^6SoX^K;I6MRtrPGwUJkC7~S@QsvH zJM!x<;sHv40~NMcvoT`0fJKQA?~YjId-@0UtHO6Mf3PHmNJD!Hh0zU-g^#oJf>#zZ z1a9zlR$K6anV^>c)ZAV1fm|fH@1O5}b6NS;#K40G@B&V1gm4YE0(VKbbSp#m1P)^1 z-v}#m3dUa|UmbkiTpwb@QZfYHE97gC9nLqVl*h_=d_IR=b&#%?TL>__lIe60>9OUtK8)UiPEN)wp7P-c0KONA1F3DEyrzY9U@?jj-O(vx* zPptVE$|w0ne?qpzwG}2&^1frTLM z-bhN+{s`U-Pu@1{oeB=ZuF$W1*_&`&{BoMpFu5kAVO^#@Wa0jLH1hU5$Z|5A)%BAm zxp9GX%f`*H~UMNR$h0H6+8;Fz?=D{cQT|A z@DyAKJS{J<0r=x`f;~M>sbm?Gw#U%9cCL;ysbczNEb_M9Ua&y&_O6ro#HS*!LcW5o z%=``s*;($2ut=lp;)~Snhw3&0FB_>5b^Elwr6vUS#B&stj#S)UdbYa#PTj88DQ{P| zqw*BB8n-!!TMOH!cVM@i-;34v)V^GSJcI|jBF|gwA)oB8mmOsGo1da@3bo#hWw$xA zTZ1ENDcyE^F~>caQt`l<1+x`PQ>`G34D1NWUh1xx%J0HekB1hhoaYHzus^r(+QNcb zoJuPW^;%B~vd`HcOcZ$R=T;z9`mZsJLP~Y;N>waTkJ2p8`pBbO@W}ocf4qUsUd(a9 z>aHcLpXabN)a59w?T49TZ`}h^HPq$ZOx|KYE^Z3~;hfotGQ+e6LE~eS@RwoonBPrv z&Yf+gzl&OjT`lh6AIS`Hb}fXwX9Y%R1{llojmV4=*1QiNNVlgOk$f*moFMvLv#c&)-wEDNc5D zqI9y)l5`@GC2`g^?N8Yavfm2Hx;|K-X*h2iva{K4HV+>RNyr2%IBOAv5OdbE`BPWU z9)SOFNp;VEuokAPpBebE7gP(nnva6BrhzL!m-45soN4hNE;q;pE(7ID_#{xi8b9_F zg)Za!!CA8vdWJ$XE&c;~dh{|-UPWS{{2~0EYMOktsD^L{9``ey(@Tmsux3|raM{)IOf36-C3IE=;@MG7hM;Yo-Dj$8l zRDja^gx$wfF%E4gl%}@t@#~R*yZOet$lV9}znC zR&z2>4Q$A?2K{&jtg_;~;G1L+tpLPvYnB(BkphUnJ#LcR6+u+reG~ z>r@V+rL&G;cI5>SmLm^&N6d|N_OR zu|zw0vptt1okzHnvcWuJhg$C}{#gBEYoOx**38SIPlA_$S3R>Vz48_oS)uogL6(&n zU8_Ccnzz51`<2hF>>BsfPr<9vt*lVeBlthr3IK>XKtDnySnx?b0*^q3FXTEBYw~=d zR?}pDq`WjKDTsk}ij^E>n8OrLtFeC#T1nn(TTSyN&a2-TZGYwYX^A=SaTZ9;tCUx_ z4V({){}PNU+guFKWUIWu-{B{k-`1DCsAPr`SspY1smVi#^v+*LKBB&UF9}IRsvY^2 zbkSTBA}>n4$USN?A@T_CVNir7W#G^VI}sWqdqeo=#ucIB zhCo1)F(u#1u6-4h?A2-_1CA`me6FQIHwCqL#%g&44vz&tA&w+`{PA;#vg2sLN$f3?m}97(ZwxxgI1l z;yfgyH{Do)VK4>;p)nMuVS@|~Y@*(T%Mu$psw{vl*Gz?kg72My#l>9{m2Hp3W1K*! z%}+)2)#H$0ej2~w3%#EvDddl`5Np*6RkC$}nn5alv*b7Qn9bWj<#hEkgFm6lYW~#a zcf}8XJ@Tug$LpB!p~@YKXbG_{zfiq|Icg-AAm6S`=1-`SEu}7hh<>qH{Z^Lo7ysg- z!q!!?H|9UYik+#hK(E$Uc(};9+@LS(BqzK9o!uAz;gUTR|J7BJ6a0sV8PUr?P;Fq zNNJR&BRFpKO$5euE~iH?19d2Q^ro(IwsX0}x!k8O>niEjP&v#)MBpHdQ4aGkv(jbd z$;}gLD{&wQ%eBR>4$C$`T666%lBr9e0MK&Jl63`Y)U|&;g}2M&fD&_ugV~4?L0v*; z1Ex-4MrcftgZYnO{${}3t1uU7OuB=)O)zI0FoPB5XpPxn$I6p0m~#x6GZbc>USj^9 zgJ~m}E(XkA8H#jyS!1R-n6=PibqVJhFf|G@QDgcznCAs^o&j^0!d$8`X%41DFl>B{ z>t}$%oTM?|Zi(?AM=;q2Ob3Oz72A&Plb&LmH z1T)g`o#Pc|vBtdQU=js0%7EEIzfY*kwp5k3QU|m6E%M+N17?=Oq-{|0mgis|7R;>% z%p`^Bw?$!69L)8C8EwGyQkXUERo=eb6yrf>!T1fB_6lR^^2~5B2j66QN(`7y(3arA zDlAT7{rDZs2Z9-6z`UX`H?LFW@i>_K1vA!w8K*EFc=!07Ru1MG!IT;>Jr!oSF3;+( zVmvrgFt-^n$0|&+F3-~r=Epb4gMSz>>!B^lgLW!!qa4ga!JJ~iyr?iQXv_r;=5E3K z#ef;BFq1SU*})7F%wG+dT!ksrm=zmiJjfJGx&h->n7?YwbO-ap>*T>{2Fw@Gmf*pU zZ50oOJD7Qb>0rP-r!XIBOjidJ5=@2xGg@Ju)R-g((_b)|226K_Db<)I8)7^-RWPR; zFfA3PKw}CpFvxK2PbJvv4eSEFdYq;rxa$#v5If!IGBK7&NN^~D$IP1 zNpLWI1=GoZ>83FEYs|;%V>~!TFlQMsEfnSkjd{qyYB zZwscI0rP~yxHTrr!Bh(70t054!fe1)H}%1Rb+PhXE|?1qnDZ27mc}e{FeeJ;A_Jzm z!Z2I|zjL3131c{4m(bmS`4k!!JQ%1kLmbQ-g7FwIk0{I;8q?9iOcu-l1Lg*WX|6H* z*2Z{HAeey$%-IUFM%zdW9L#Zo8DzlJLtCOeuW3w`gV_w1LS4eu2FynaQ=u^f9n7nO z8En8js4xRGCd0u@5X=w*=30eWt})+#8RLOhFlh$NSqgJ7Mb&AwgJ~z2~` z1=HGqIYVKN)0p=hOdG)*YryPu2Fas23s4ma9pT~HRBba&vrh~#P(%+fwU|I{N(16(uZ3!McsxcJ~ zX3c-dgUbz=xe7B%V+tM2GlIFofC(zh#Ts*hgSka8y$zUt3e#R=>@_hSTqu}62Fza- zCUUf@)7Kr$k%H-Kz-))M1P`h;rp&>te2F|TVcu1k2Q|j$V4f7rm4@$3RhVHKlj>k@ zJ|w2M!sKbp*Q;YZ$QDdL!*@rmcgyQ80fuU@lXb!qzHp8$OHipo?IxHDHccnC|*JFFBY* z!CY^^Y=O1}4^lLy)WIx%fjk&$z|2yZjV)E)@*K>=g1NzfnWQkUX-tZPxn3~E223x7 zDc6`USH*bHSui&mFzprQN{yM}U=BXd^4w&=Y=X7~4?1X!-@$w!m|+IYD+=@DQHlp1 z2Xnt*CK@o~6lST$v~n=l91_!0VP4dj)hlB>I8!i_4Bt6cVahb-X$SM;4Dz7NfLRZ1 z2_E#-m{AU9p+>p)nUYn7aiNGGN9k%)uiS-;y27Ai>;iz~m~-ry8?jMT`fT zg1N_laVyM|8Z+I&{O}xkaIXRL1+*o2Fj`}VJD7QbxzB)kPGRyjrmKSq3FdwSX0*Z_ zr!h$mroUhwFkreX%(i63wC$Cko~X1E#scw9}aT98CCW^5A^~=2K``@L(&}gVRnN;$Yqo%nJt0 zBMLKLV>&vR$%1*&fVn|o?$?-oOJY1I5X?&k%-ISvLSq& zSqgK%##B3)c7l1$fY}di2_6j9m^&QI#($FsvkaIzg*i`SiX6;;1oOH9bFacAYfQR> zxlJ%{7%+nsW=)df+m26SJjfT!n+D7o3iE=-yysxr2<9yVW-qiQcrZ?5ra73kPm%|- z4VW5*@o7vS2lKpO-Zo(FQkYb%;b!|ub1)@>nPb2VP?)XF6z1E-F&^XyX08F#L1Et0 znAr}dwP30ZnBCBp;K7|5Q{iCNOeYWK88CAdra+gc(7`+-nE3`wP+?Bcm=he#ErO{r zVEQRcMCZ-^IL3nu1+&0_`K!XbqcN{Lm?H(V(16(vZ3!L(G^WhKtbBqzs5M~TRhS}; z@i~|$1yg6hOjVc+jY)MdHw$Kw0n=My_Fn|dm=6TA(tvqIVWw$}$HCk$m{kVMIE5+Fm{tzv8o_*K!1Pp@42@a6D8_>`1+&_K zIaXoz{j7NKw1fHa5%OS-0ka<35F{2#JLcx4)z`Uq14{6K=4(4vbd||+hRhVLp zNp>)U1oNcAgFOcn4~iYk`-1t}fO$$`KGv9X985qkn+=$e3iEG`L4Sj#`B;O$ z-tH@yZw#1j3Uiyre7rD*IYlsA444)Q$MYH-?wzH$zxy&fOW3lyhuE-%d&D(=d)hLor}50`?$kSNZm^>medq}ta6 zQM$@y@&yF0^ydl83e?(rAxZL>n{q-thkoTf+%>Y-o1UOo0K;C!g) zMwy(!*k5oP_G2C784F0$4naRlSWNEMF2haa1s&gGG%486GmgGGS@!`RGVqZEvFR%~ zd>QeN?Bv_|${SoKr&pBQZ`>)5xVla+I<^0;9u=ua7Jlrz)T0dbh&5op!~z80;2J`< zvqAEmH@M^w>CDEDeU$<|q#jM=z?;3X(uD>y;#8F*aX$({j3 ze0KH>Gzfy#^<}jMr;IMThDCQ*908u%S0bJ8fuGerpDf1qQJisCY{5hOJd)R%$cztW zr;gaU{<*kr_GB{^nMFv%_xdB=|+dr1BUS53rWDaoghTxTM`MshQfXPC(MlDz4D zkOL;NpX3E3-(({9CHWbWdzr}Rl01dvjwW(@l5ZfnwTZlMAIKKT-{GoBxz~`KN%E&A z@;f9SMe@%)e@O0aB40%Eog|-QBA-n1NRr!`$O$AD zlDucHq1+qs(C$p~XD0G|l8+&Iwu$@{$-D0b`C${eg5(t>|HDMSp5!-39$+H(Ao&53 zFEEiikUW;;6HVk~l8Z?Gd5@voVLY_6NnURve@OD5Nv<}LUnF@yEV=NLCh{F5e@XH` zP2`(NexKxPP2@{Sew^ey6ZtHXCy{)riJU_65R#8Dk$3(8at_H`aMh$4EF<|ZBrh_N zXOY~TM^0!qW-(wQ;eVURA(GdUTy7$dAbAeS*O|zdk^BV7`6hA}$z>#;W+JyC`5Ka2n8>?!f_yQ_ zHm;g9gXJXumE;dhUR$YV&ZC3(1s+>hkvNG>puyOKPOv(UlZ9wauvzvn#iY+d<)6#P2^@IUqSM|?S^u1!bAIPlGm8X3rKED@;fH-GbH~2 z-$(cn6L|{Bt4JPiBHuvrTOBELbhi{uwgqx%YL@pwE z2FaJ2$k`+ZNIuI%{xiupk(^>8@BbF$UL^0tRg-dmNpeS$mzl`#liZr*Stj!1B!4#z z+!0 zBqy54-);r@0+PSNRTFVoO!A2&*O?APV$o^ z_cW3JM)E&N&M=XWCHY#Ck2I0L4}+XX@>X0mDfdc}PbK*y6ZuV&k0ALa6Zt`sw^V{0 zGLcJ3UPST;6S+Uh&y#$aiF`iEx09S@A|FrkFp}Gt$OmkYeI)O~Rg-eBCHYK}m*Wcl z;qXWDyCA#-ztMOeDz?E231lLZ1YQ+a)Sd+-f*E*&N$H5a<_lem$%5W#@W=--O>k`n zq87-ML2Yi=gg|bZea>jS&dGv>{u3BWgduJN+m+)VQwHG$lNqDhgKb3P;Qv2>utWD$ z@B{1Z+xZKGFJPDn*<2g7wP!zGFE(hp?F5%K2Z#a6!18?r+mkxLL(FfaH{3f|0P#AJI8 zd?R$~OH`A`(l|lzA|D0smpKD|;axn$2{$;?e0Ah##Cr=YK`NM!S>``F`;xQ?2uF7X zrel_s>_WsBzpI;-HsKV;`SOeOBJKb*k~ zB60^J4I)mDKixunUMnh3u{b^F#^Us(qLxmKoR;9xkGWq{9xGWdQ_4_V4drnVo@;r$0+$Ws zkyA;OM+#eGLF@vjjTS`v;W6Aw(3S{_KY48l^Os%qDhoy}gl= z!gPW?ipuw;xhojQam>vZGN6ajSMDiy;L(K%9zI}v(+d+Yb6oNd3kT8$)~l$Wocg^H zk%w>Jdm03x%cc#dA@VSytJ-ZaPeG!O0)?5>d1EoX+Fi$olBn5vh@85wnY*GVJ~B4H zd|zS-6ui89e+gOpE_G~zzomXyJzn@dO2xrcaiUavy9gXq{4L*??01##ODVxAbdu6X z7+6PBDtR+9HyWQRm^%b9rkKB$Dh6v3;>j0VflX|4N5D7BkdFv`GtRP0{YWCn1B%w! zKDNrB>);+177=+>5S}C)yXs1WOsU&EL^%xQ7O8+Hr%x2b8KlZNq@i)iQIvgf9Ec1; ziPNlbf?6ue%M0n-WICRIGVJT=9ZWze%lCQQm3yf$RPj1O2E&|mjh0LEkG+KEpS$us z(8Kfbhy8=%FTGDQon)T50r%78UQV}ohN=#AHUZwb2JzY?eiS2>OCP8uY2^CT5=w5S z6jhh`3(DRtW5kz|w&+z^umRyML)rP3N#S^G7pCp)-Kdw^a(R<%0Za7D@8D%e-qkCN zb*z$lRFd*QpCCRyU^oYs=tw0Z3o~vQ^`jM=Gc z?Cl8c`WbuNHau+>3mW#=T}Dbc*3^Q`?cT|#wt9*6iscvx75iRZU>{<=zTpdOVru+S z$!k{j3F-bGK3FFO*#~`rpOEBACJ9E5Mv8mwO(P`5lW}@tLFPX1WK2NRPjcT?i6n6& z3Ae}#R99BtR-)~wwf0Cf7@Qf9|ePjBatRTU^~J}**{WoaSaAm zQn)K$q)?Sd4;0b|bEE!(d>p^Ci_DiK)+d_Q{O&nu=3^d*d}KqSeEZ6k7FkBxw(WsSRG(XTuS} zhmSxG9dWB_d|u7}^!@Gz$KikvAy=DMnlXf`E?>x%*yw)e%MIz7%NyPw*XaJp`1{7+ z3r;Nq7i%1ThFn{gHB9fbM)!4%?%!&3KeN&O^hWnpjqc0h?;Gb2{OA`?$9>O6_vbab z@6hP}#76h68{HpV+OWLa;_n;Rx5YEvaJtj<8DJai826h!Q{$?z$}??jgL}}AYea8w zkLZkP@pP2mkv^o~m>=N?dQInzDhAs;8#)ati{~#b{G7c?mzTHTr*0nPz25#8n^OEC zOsw#PXn)%XU#ajT;_z4f7JR2nR_$fHbf`3`Z*?q<0$l^q;Llp5lCmz1v8BDli|`j9S)MUzjz3 ztGE&viB|U~h+>T|a(ucHpYw%A?i22#8uXWsQC~hoeffmOUp`xXxmCk2|A3Vn^5xup z_%wz&_%yVnIwnL9Lsfr9`wb-xwr9D6SIxE(_p=U9!cj6P*Zr`zSpS=&M%SZAxIxKh zh2@Pq@P_6vOI{NFzOm%7Xt1ys8p_++)sospPHOh)OzM#J)d>HX!vBmxO0>SWmi`9( zAcdb3hkxO>;7?TeiE;Rwehc2ExOq_={`B91UuX;ee%=&Uel+mI=3k}4&xymo@QZky zr&SDrrp($yXvc=I{1UO1Ap>`_pAO|(aHV+g3XaRN5GIn5no&2oL+}HO31>G2T`e$r z#_+ok(bW-raugKe6*ksS9*c{@WW1})*5D;J2pg=xIW6&Gs*KqKt&YVzXn~$AD@OOX zg!ali7Hdjf`4psBz{##?dx$Lww?tJ}WW#bzS9!qe_#V7JXdwv3s#j<(y%qUKIo6;@ zkM(Eqcv$s&p0uL>jq;X!_4~`4sLOj~qw)@6 zBVhZT&KE+(u#u(xE@ej>LLApR_(1Wm7R|UWml4?6ev9}B?HBFNb=OklDp-gn=|NLu z+f}Xa!IgMkmzyH5#%gIcfiCugfa7CqdK{j`HN7h_ykXP38bkbs_DlTveLMJ;liyPg zJHP9fnDe`3#qZ4TvmDPLzb|80d+7Xn8s_&FS_g;4-?I*p-}8QNe)rt0^7}Kq4UX|g z|EhA7$5eVq3MNM+UO{(@oV;bXpr%8GH8`#D-#X0~8l{t3_FPF8i{uSwXM8qdf1Z z6dVbNZbSN!-_d0p182iws1#oSJyEpFkhtQy+xVA^2DjV)hUa8xl~aD&)UqOe2^?n9 zY1(HA%MQVYW#l*65Nx-FT28oeaUr_7BD5Q@!Gnh5YmSS2u%Vi5iEO|}gbm4L!^OC} z6>nHJUPpe}b6$dGdTWLiXw@8aHrFhNE4n>|FS&n|KhhWL8J2lVnYyCgQIc~FMsY3 z_6O{L(#R=CpI=TN?P2Lh_eUZSP5PhqpW^xN>3>!gtIV!Lmmep*7(d77cNB}{9Q>g zdEx&>@(ZoZAFS*hIF~cbfW=8uAwE=7+6Z5|sO{X+kT*G8c|H0b}J>_=rm@pH(O;n1k`amXNu9uB&2 z!`{ zXePWybKGH5u8h13|G!|?Mn5{)9DBp&Fy{XgR;^&y zaoDVCY>WJSjbhXhP+qG2#rrd+{~c6kyt|av>0ym`>o^XHGD!4JOhw@&J+uGjk1L}O z*em@yD=d?5=Z7JR5eLy{$4Ly&&vE=&Rpge#k9jmv4~rjfE&spZ$J>j3KR-4PR{Yoo zo8XZAC?nGxe!NO+^|1Ky+_L`*emr0I`}wi*YQ>MWaCse)AEU@LhaXRh`Fc41&Igsh zMCsoDT6=l8_V@E+;ULA2#c+wmD_HRt;IzYG8LIzwji<>ijk3KJJ>jPxmN_&y;io6; z3)e9eia@^%D>N$Ee&bT4k11PB$6azUpTjZak~#HC^n|$?FuP>zi~;`0lth0U<$b{V zyKn?Kf?e*MIcKk-n?<}6q<_R5J6U!*&S237j z2jla53!OMIK3@x}jE`W6Tjkra0C5=n>GXNHieu)`ugS#El%A+eJn0k8LU>%~s+^|8 z%S2iunP}(a)KcOLt*Sbk^8JCt8-cq(~#?_=bE^7|X)!IE5Sd5H9i$wOK9 zU+3@1wDUT|YM!Us_rD4f8=bF@%YP#B-{`ne@z=%jPx&|yHKl$-{-;rXJl_wtJqdN7 zmRaFg(*POy94#pxavJFA!GZ(}y}Djpwzwbj>H0(*0He8FO|LC$ZvVS4NYSNbdWudj znuf+krQ~MVM~hbvE3_(+j^qc4ozmp{9S-^Z0`>h%4d4Gu^!ri!GWPNH(eDokhfs&{ z9KqsItZ&Ha;|&}@%g3U{;OJC}!Szxf!@z;{_L?hEu*z*#AX2hH2KDqyfR8Hw!1rp3 zZzuU=|HTOrq$4Lh-^G-;;3#5Os6Y285GPEd>7V7KpMIF> zbNw3pt;#L^J$b+-=kOF<22BlRw8)#e&dOX3cS&;+|5C zXTAVR);8T9&hG{X!Tc{sE`Uos*ft$&hz-SVHpIjEob0rsKe&fsD=x^f-)X93WZ|ojdaMeL|L1HZr z5QT4My?r*S-xs(U87V zTiLblsb}H}qEWK4Ah099bA5j2ZQ+aX2>u)J%NH7(tQaOj^MmR!24fNY7w(EjkZxY^ zh{(w*-Lc8R-1O}Hr19;oU~XzYoKxa(3e>>3$;sX~dOaSe;w<<$bIZexX1&(lw$!W7chb?t3`dq zv7yQr*zL{6NwxkSU>d$;_d;@ca03LfRxeP4&yEe;dTcO1DLXfPLdyaiWM4T31@HWY zPO$T`xYVF;kc7%2^6IX*3a{n_^V72P6WsqS;LTiQIl(uXk1M!WZgT=AE~>8D!kPqWAv#0yq$p3wYLg zV4gQ|AsT=$^Cxd83Hm&&%-^c zj}`bF4FNJ7_VO-t;YCi}1>i!2}7wX3uGk@pc z(UFt2oZNa;aAHz+Y5MqMCt~p_mTak*V@G2{$r$8Ug&c!GF4?X8(R8o+0$4SPWlk{8#z1Hxz_MCc7&p zKqytYp)#xcP?N030$jMW?XOUes4jL+TP{Nq!JZhy*@@olZ@qz@86}^1GqHh%+m?33 zX@Dv(c<0StQSz7<$J#^s>@)cJx}M@^F9_U_ivMZ2r|L?G%&E%nya&=1Tks|NRO!-# zeS6bmFV?HprBAR41t+2>>J(|O+6UETR9pIcp>V$7Xe?pgi;f|>DmsNrm}wxTAuHhS zpL~IRY`GUgXeUi-WnG9=%f`QnCDE@@CyPohd7}b*2-cRI1B(Xz(l_>fU2(wtGESqe zw%pcy{9nn^#}!@YCo~vy65i}Vsc0SkFQs>1YwrOAk+;aJRa_n3Q+f+bbFR?cE6jmf zcg5W-U1$Wdx*IKm%b-ujN0F^F)Dk^tA-lEChI^XYXR!c0j`1Io2lkYtdb81q?(%PB zH#nYO4wbSD=y&bK=P||GF7=jANKHTvbLQZq2|joJZm&C!B}y591a&vb^sMqp83|}i z!NJJaD%2JkVo#A|fOk(TWzz=^9{`V|{0Oher9tOGzn`CmldSzcg%f?CiKri7jw44~ zn4@kgNAFqX~x)@i}k9$KWd>r_4cMez;lm{t*2y+TJ8&2`lrV zz}yuNppe)x;0umGCzzBTIVRQ~3xbodoW9=Q%Nrb=!L^(AlkvhiL2>E6&7@NB!?|6HlX zKZ8rD2y5tx@(9rYhgSKxdq5V zq`NCgM?o;xi`^7;`7)PPo1c>4h4kdq_3$8LuzSGXE79Dy+QpZH<6H<);~!#WgTsCo z)!R9GHNDtcd+cK%TFO=kUm@HrV=}wlBlA;o+--VfMQ)e+#CmrWN^HBbE_%6p+jOY) zH>G~O!HHN`e-Qf{U&BBVEBz_8&*3tB5DW1|Upp<@e>p9qKPfqhGkg5)k=I}^7(|Q4 zf8*FmC1J6KJ})^53u^(F(@ERp1SLE_RKD z{MSU@*Lpn%>kQBysVoBr(IQ3PWY_v9n4qHLN_d$PK9L)!SnwW%YE$*NRGiK z@nB*xcJHJnaLrPJ<<76c|K%z-GPzwf@oE?|X`QRBY}jQV`oAW8T3!r3AyXth3Wr|F zTh2W~y4_(p#^AJIv+Ufo@uxA>_(m4K1!IybKD7cnqGni)y8m2lQNm&Nj$QLVuTPg; zAkE@;>C?Qk|A;<)mLvJ!u1`Pxo3z9@efmD0P^}-fKJCaaJNk5jr1*#R>A8~3FX__- z5IM6xJs-VVoIZ_oW*Kk$z50~<1FRsLeTpZerV94BbKkMieOBE4F1()>cTf8W%@O(^ zt=(=x1tfx67ybgew94u5(d?k)_jg`qUo0;5)dP@X~ws|UKGf!yy=Xki$i#_a=Lu=Nikh-@YxtUs zg<GvF?+6*!oUwL2rq^39M2k+~TPJAOmil zuUrG1& z>dL3#N-a4pui{hu!_c=FAN=4weh`bw`6xCINL3qKU5cc8d+cIPE?}RQhoc3A^F`MI z=IM1oj`t`{5~|D1;IBB7%DUsNuDrF|LZ_<@WK>eizpWpAu35q^_tl={q3%xeMrY&2j@9@qY}Mx8zzL{o&jzejY@U+n3tXR;7bt;k zax-^mWW-qyY+t+F1Lrwl=|}MGGOKfLN@N!Mk-&Upq}p1#wR}UOb>w{JX#OsDQ8jXf ztc0(J6u=CF5B(qXGX}?5R-ifV?(2p-?52zNs2BQm%w9Fi(jaCp{a37{@emw{h7Y5L zSJ6o5J9}Ol%LIsHJpsZgOs9XBPayoTfh-0CH|Ck z8Rdl<|8)K$g5hu+S6KaSyrfB22+EtrgD<=4m-ds2qbjDcldf<`Vf1m$g%4yYH?WYaCSqcMR~zd`T9l3 z8%=fO_m?(OpFnS2`GQhW$<(jd#=ZoF64#@&SKLRYIQ>zS-V4ouq84=Re2PtTd+gK4 zku8wB%Q1Y%`UKVAG~^#SZNG|fh+$#lCl(LdUc3Y`hc4zSo_%8nZ9VK%Hb? zne&c;efLm8gRZC84K!h2iKyORXWv>l%{2Rzyv6vJ5B|jXSJ{+*m&Ew@>c1QEZw-bq z&>KXg|z-UxIFMrEzPl0cltprn6C_f|+Dz7D}F z_||Fi78ZYpT7MjS>!yx)D+_PY?Z&tM5`8P^@mN77bStIt1t9R2KfSFm^(1*KPP!2{ zB~2;@qPg9E2|X~yRC<8!1T6A%$Ht_zkSk6@%Pd6X{aZpP?64d zZT|!%i+X7}6I`K0qi(t?*+MXW`^#>iI&v+Y9R<7)P)K23x`%%(JMRj-H+cd11<`i& zb^S8*XyC)^2;Yg1GrR{E7oz+XpUZat_0c!}9eo4p7n>3J#<~V?w5y7~(H0^I;a%dc z_)5RAB>c5pv3)F^9#_9C!#<2PSixB^AYeZtH-AD(Vna^;b~?)e!zxaq0(46CMQfPKfp1ZR!c0t)>`D#)gEhPe2=HQj`Uz6QZ^>J5 zlZgH*X5|it(HR<;p2l2XLVrnc0&5r}b*b34823xvvcj)RKSAo2H9Syi_~~d3-=S(a z6(+YYcxvX$tYJ*hv4*`N*&t8${Fu!uhUtNsDAepBtN5D2SVqu++V`BHxOzK$7Jn>% zrPQ5HrkF*@RGK~HFf+D@KCa0NSd(JRvmc>U!9Nme-3=i_MerarTJUm3RJO-nVbD=| z1=Czw@_ICUrCqz|E9m^R=y~-kwC`w1^^*IA5WvF6DS+#pMl=>v<^h0^z68x$;+amrHh(=4C10>VQBk9OTcB_c2@E!dc_ z3t?xT^H?*`JI!;KQ{B)~v=L{7F(3SA`+{d~dlp&!f6ToJc$C%I{~v_WsMv`LidAc> zqYV`mtf}P1C6NRs8fsLmL8*-`TKcM$VxlOb!3o0jVQds^wQ5V>YKs*sZLOtl1X+SR z;D#%>pK;XS3Tid~&-XshYys4_?{)pIe=eBkdCtDv=ibjb!N4nT(*9kTHEA865iXXd zvn$%Zlffpvd8entUlSqhMOP*aC6UqMPwZsQV>~gbwDbko%G2W4Nn^u=*%*qgb0`o{ z1o2s7(j3y_8&sNziP=qj8i2f*7Ef|@s2&*U@87EC%l|q@iver*Em6cg(yE|3WA>`; z1=t!Y02}UpDbSt1Oylm^>ZKhTxA-EZoHc zy*mj!BjBzVoP~^l`W-!l#(*+Lo3g;_MQdMxjZK~(S`Z+5XTm86(EOd|(mDCINM3>+ z_s&ilj{=!VE>|a2w`}Kqt^LP1=8(cR4$n(Lix5Jd}oDUUcl^z{9~>^3xSYjLVEw}{`_oc@BXwO{1y8% z6byc@gv=F7|PHO990JggRBwGJx9QcF?TzrPayrSLUj!GF@9uWiAA6`DS@@FwzO?rZ>|?A6Mh&PMJt*3~yGUJ4v}{y)((In%<&z&a1m{5( zcOG5tE)>#+x*l&V%*axAmXVW_q?xHMZK!%PdWGbjhQV(}XUWO~CVoH&_`&z02e4C_=M} z9+VwbpSSGakUW3*hML4E_G7YkcQd3~q*@sai?3rSMOuPJCw@AZ;u`wA9Pb0l^d2qg z3FUr$)(?Ji%7ND2`slYGIV*a~PG6_)^hlGAkT#Xn$lBbiR<~?lHMu<25vpdJ4Y^~EQcD7Hm?@gENY;Cktc*Ni}4eB-yJ70GwML*}S5li|$)1+uuEOh$G4 zg=-=;Ho{oKV~ASrBX%O6S@Tt7?}4;exE;h4uw`pl&sSA|O+f;qR<8i-=~yW+L8W7+ zN=)l5KOPgDi7D#S%#QFAiKW>4Uu-!(9vo;KxAqeENjFrTQQrEBxJ=mYiw4yPtw7q# z?zj7z#ppp^jZC_Pv-p{D%{r( z{!jZmY)wzceCzCCbQT#5AEuVm#{@s2sqbgL=J_`3?+e(og996?&Ma?zN1bHv+cY|P zxcYe4H?5CPjlsQxj2qo8YS0$?*hW?A=Tk-foT}9Da0%2UrZ0=^ag8wQg{57i2Pp?S z^z!gIJbYH$)9cZJ9~1-lY9vR)=)vC^996i!27(3#McPh3*;&=7?!v3>r5!aA;z!0> zDlejV)nhH+j3+YkBP|Cs9CZne_EGZQDdfJ1jg-vn#SR_BHej_w+RE%{~M1Eacr|QNk>FZ{Ed#g zY$s;1jwf`Jzd_^9_9aOH4;29C=|7%8}UG9JIm_4ha_iacYCM=fKmp24E_G(&9&s72|t17)WX>A=^ zXVYKf(`}E8oYS}G;C)vxYl!y#Gk6!;D}whS1@JEK&2r5xQ%TP@1O2sG&|jctY#H>g zQWSG|9qNx<`wiMJ+>00p;4X0qlwG*PO%i1GyexdXtP~2Dqn954h4!}4Uw8Ujn;0;+ z^I$&$tcYm)!#dB%9|XNbuR)V{PrbuF2BzkUkE?v~SN5d~{<^zFSOVM% zpagAN2Q|rU-Ase+zJ&F3XqC2i)}XAJF^PN)*smwuS4N;n&!wOR`h0kxi+VS@$0|60 z@?w6ZTr9&ssg!XR2!7ubCg)%gNmc&&mqJL)4{H5})C6=TsmkwK0dKg|39C;&Q?tkx zM=}k)^A6Mu$a|*6yMzt#7}fnPrMG`ejlYCq6U)(gcVqs$Aq*;maUf_NK}mwtx*Fj! z&i34p7~F?JpbL57MGmvy{4cD5FA;2fDd%4ES`yvS#GYGTJ%aa!e-NMd)D4iKSE$IB;4)8$* zo&Q}JRM7d^1gUkkz=wHPU(X!l8J)gHox^_XPde6qe4FpaazEMabJPgJAlH+41z?zX zeNC~iuJ%})Uih<7G*}UHBXFJ+4KW8xyM^lP=`e)FR`_KS02ZVO!@9M*p*w4fM zDL)TyqbkqN!(S;yDz|3{vw65#?JAsyZg;K;az*p-ZB>HaIhT4+Pl7ojI1EhUD7{E$Gi-7P`^BwKExL z<6(IBDTx6ntKKiruaQbOEEku!Nz7Jpajy}?dBGZ?-%z4@eGGiAaL2RY4!kuocj;#( ztW4$^{XEZSuX5*YUT!L1?lF|h3TXX9=9bMHdM4>;Xy!H*z1r;t0t5;3;f^CFeGU_* zn8i?^^z+Pw+Axhh`h*(uF_HyvJ+SV6HHf}S z%WHNY^zr{t=XDN-XzL=up{K34={10-Ru%K?W8g55I+XA7UyAa%slovvne_JN$oknz zFts!o>h3j~eKP32EBKq%qYHMII8mePq}3Eg9FEPMEOH|94Dn1W7)^R|-LQ{(8k?AH z!^v*CfYA2SxKX?EI(?Z6$S&HD|J7{>%^|($cHe{KvR;qAg7ta`t=Bw%!pd-UfOviK z)%sK`Bm=+HH{5>ET47Rnf`OBhtX5f&Qj_IwDW;*?U9Ov}WUM5?gc(Xurvz8iK5yPR zg9KxeFV!r1L*u0TGTsb{$wqf`2(IOM%JCx`@=K^NM>&qSAa+mWD9(|DsL>yOZSxM> z`YrD7>7EDwd?x)J5cYQm_4j1TDemug#FvNty&O!mS%0tAl~iGWTiUnK-=CAf`uoD> z{rv}vD7~Yg7&u6-aIMz=sin0XeU;?hE`1i=D{lX9_qO?3Om%mCBW%C$0U)AL_}w0K zXg+u)6xH@Ke~e5x%joU^)J`%aWeIS<3A zW!TVQQeJjmUUWADSed5*9WCvG8B7r_;d-^gZL*aHPT^@cSy@(PewX=MrYo~P^I~R6 zX1;j24t>z?f9tg{QR*@{edei$T1e2=>?z2iCB=~tuhqRjheGTH{9P5 z({YSuc^l-uNnz9_-$pYOVrV8C{5*7**MV1!6MgOR<#tf+SRClQIF4SSO8_yIGtOe!ZN;R%>29@91NY{r;QH^KG);qdg8!^$1oU}~ zK6!qf>}S=XpgpTLdT?!Q;>816chRfw+r`^P+vkgqmPFtEUajV%+V=}#6WO$y(r<`uQczvA=}}5|{C|f3?OBLudQt`45UW-#BzlA_ zH^s{I6>Z8`{^9mfc28`my`26Yov(P(8eZaao&K>kJUVW6Y(usogA_%3U$%r2dns^< z+Wjyu1{|x@#wYaikbWNLXWV0y^c0Hn2l&4RU9oj{4LP1vtW&x-`FfoH89-pILZ9a2 zdA+PB^E=8&z%u@?c@W@7gva8ofuE6m*=sP5LuggH; z`vB|;n+aL+_hh`l+Hott4&bxuwdUek3f%2}FJ2+#8wrhletM25u|)bi0Yz2Ohm-k$S|fg1jhH zI3`b&@5+W!O#beon-ogd#&5?{3=@BCM7QQzXXcwtXN=G2N|VW;;cwj-Wu z;8K+o*j@rvbps>C{V`~&(*3!29sNt#j@lyRgPy^bMx1Q@Z{%jZ^Q{#O5e9I ze=nIVnw`JOUD`Y){^X6q`Kr8os+W3RA=suTy7}~62tiMeXWRhM39$-(@g3s#oEYFO zg2=C2kdH>!0lZrhJi|y*W=TNSBmsAqrX7PI>djRBHKHk7=RTH|tYGrR09L($FtSRZ zyZQVR3Q4z!0uZ>({ho--A1OTZ3Pog=Xa1bonAwoIs>uG4KqZAy}dhr1z@hTUcQA@DbyM9tiVX4aF zv<{NX?mF0DugmR`}v=M$@GgD6-pE}niT z+tlylG&H$>PrE4W_xM~>w((6liKZ0xdrz9O#eN@5PV0Be*||O+6}IFowWO%e?fqe1 z?;{KSl&8yBK8;@mkX8c!9G6z42kxiIYQF=Rg*JOR_)mOvh*Dp>h4fFTlkM7Um`g7g z@eTp%MB$cR<=c~Rh}QHI}_7kzQ#f@QI&+whqkqcjy-Y%biRr(!1++_yV#f*H!-2x5k)%sr< zO9+lA?7(yje8W|#1K^$M;71_}kkQi26Z&~6&;NVBnB+$79(n{k;TTAFv@n+N#5)>R z4jYFKjDb-pYc1vHTrBow9ilfp+n5%f@Mp$9lwIo?<+6Ek9}ZX5glAt_+qM4tCDP$v zH*S{LNx~PY!fcvJJ`H?GQ^z8EZ(6Io9X_0V{(E9B-MEF#KHaqo{d2w2BUY+Ss%Jjb zK;^^bl`UNB>mrRYbn`d(?|JimnpyLFzPHHtZ@4HN|Hi#bzFE@K@h%R{z6beq4`siH z`)}MDe7yJo(!;mc7RYiLso&(x-eGCh{jTueZQ{yd z_m5)|#?6x=g6Fj*KJpXZJId|d7(EJVT1ufXe@#drr!%lSpUo8R+!w&sz-#kG;aMKl zEU~N}Lm1%-iT|m}eJ)^KA89zL+a1b6cGFrt^87scrz8{KJ$$I>uX!$N7TW_cqd z3gio|=6|gdLH3G_>syq`rY4|MDGyP*>+H5~rtNsqjzZjh;>gx3tRM^#|LYTCg&qU_dxg<(Ct#)Y< z{JOsw=IdRHn2r#Rk7T)&wUsavnpS;*dnAN+6 zs#}EZAeQ@N+62~*r_RqJ{qLBn=$x3~NNT!UYC|jqVPF^KksK){~zLh&|TNT2D^5phBeCU?Gvcr!rSthm)gb65R_< zMuu>*gD>F^7my@1wE#|*Na-0w9#qk(sauDWzfK}SA)Hiv&P4X2K)Jr_DVh7QT4*(2F3e z^bznqEDbgHQgPsn&G!lS_6e#;vu@3UD0B!3E~}RHCiDu$1((w>Qd7%LOP9gv7(F)& zky|1N&qcn^?Bjo;g50k+*~&aE{o;;A&Nqx(!G2GX4OJ1K6 z0`a6-!eH%?)mrH8$6Xy=^V`k{Kp{jU9|f`23HT+#%%h#=(C-qwwH5fOuX?m) zhnlL>%cEDcGboFP^HVzubuNdm>%vcPhuh71VORt|{nWIwB+Bfr>KI8`YAbjhqSqDG zhn2XCS+hU{&7q8F`=@F%E?n%v!f(X9zQ>KU2N+P|x^K{zi8h=AU!~$t%wvNq;q5`YTQ@YKd|4 zDgdj-uSzd6{T11aY4!8`wQV&6@Fsqq0iARijGWQKr|pcF{#vuafLLhA<_HBdWY_(i zF>n8~4B5%2z4(5k%-AN6uQli_miGr(hQq`qX65~F@nPxbZz27wT2t+l3)7#e^uy5m z(;H!EU2+~$k7)awe5|ORRFZy)7ur8;&9IN^lCD1tEn1QULC!7UVzMwu+VPz!Mj>5-R=nRYi0pOW$qQfv^w*Fdqz{r``XOgnT=V0Vf-0G z=SJKd;hEyB3Vg9k@!UEA1`ye+UyL6qwo?n+G;TrLEFQrwhC+^%)hzjLhP|gta(Hb- zWBCPze%g;hl}I<@g!1U+{golOs6v)X%v2&P zV7+L{Uxbu3q@-X7d>%&Bjnh&M`eqF?ob~afcWT5OphjbtDeY;*aPt(nYOz?qv!tPC z*JN2_XOIL>|20$*`jz)el?(r*8@lwc~ z7GE_m1kS-5!954tItC1li~n|g1YD?=Ho7yVNDCsDp6R=~0zEij(I>ee)}JSi0C#9j zfVCEw@&w_GJ!Mmb0RoP-LTAILsE^cYjCVB*!{2@;GQ^)OY zIc1PFe2peDn8<=z7o?o`Q4;B$0cnm8Mjm^%KKXon$tRo_x~64Fd=Ugzf1Im%e{|-R zDi=1O&Uhi}_f?>vtRMVAyw5`%j3%;&KSTpwOPuU7#V%NppY`Rk<_g;CsvG*?!K(!F zh-ii} zrs~jKgZ)%pA2#?mV#RycSkUGTYO5;L(=aS;RzWOF7a9<8eZr7gR(?;*UVbaiz`Pft`zrpny4iT4o?5ls7kHqKpKn4k^nu^AprCLQ#L~ z{-g(_bqKzgKV`kfu1xI?pCuBGxOYkQ%-)oy?^ziayh9>E|<&66SZF93=>v2gF_-w z5X521%UVav7~8B>k{X!8dJ^|$fsbjSFoj~=xeti}TIVWFe{hdajz1Hp-k2}!G^9Ku zQSLixB8mdgJ>K@_s@(D6Cq4CS4-x}cA-8JC35H!U6!L;b_y0AqzAPV+?QNh3&=nDl zKDEgOu_3%bDoUZ)MHF1CrTsH`#C!$%{Uqs(em|@X&~H&Yc0ag&Z+!xVX1l;X(e|e8 z6oFM77{k4+?=rG zLyeq)@}VL|uv9|;BLMi#^Y2hnh!*c5(XvoadKiL5eCkib(OK}mGW(vV6B>mr61HbG z(u~4nTb%U7mu`fucpy}pdZ?O=u<^_d#2<_SQuZRkW<#P3Az|Y!+u*eY@9VSg#SPvf zVY^M>N`seZ@oY}mirc)3f{n1*6T-$b*XC}SSap)~Bk|w{gRS_88*H9Et!rQzs+A&i zJUEvWBoaqNYc`oIeUk$HzD)SHxB_w02pJD~>a()lsgNmn-5z{z4xZM0@lmZu=;qRJ71HTrutkl#AvVv)EF%V8p4Am5yVifef1bLD zSPCHk_lHYjQ#5Dc0Ls^!rLl9k<4Iu*0ujsgH25)U{M zwSW_Q0dn)5Cga2=oRa0luGVsbO#_~$43dn{OinNhd|mcsQubwvUcfnRdh+MaL}}81 zepYbEYH26Tc1OGhzl6NzL6ND$?a@93jP`kneG2^e^aV1Gb7LMZ0A>#@Az-ARK*%>f z4gPBw$AEPhpGfX_mQTz`6(+vQ0>vjj6Nad5;jPC{}S_nkWAw&truCN9)}667*A*N1Te@X#~S0Og0)p+FeZ3tCKmy=SKI6DUQTi<#ey}qR3gPJNgxMC^G!i1278T6YJFQ%San3QwCD`=UijaTn#d=l4+f~!@>_O zaQ7|y07bdIB?pTI7PAH@Y~eV7ujAyPrO`|h8LJ!XtCqKn(Z&Sr7pf1YaV_Z&Ec1RQ zYjeiu=&~x;S}4ang_g*}C)}`ZeTcj#){?^FRZCm%rcben2f$RmVfW^&1;o_w66$c* zo5~RVv9@Wo4A-{IeGpk3l&ru)P(WYIBY30Rm1d{^nv)aqB7symqi9d&4(~67zD;ao zdIz>!0qH5OU_XWmQX*MtM<6lR2QPdvwpnXapCt|94#K^|C8wsezl3w9Xxj#kk%m}zxq{?=(o@=#A z_HviMpf>5`0{4a_?Zh&0jqL}wL2{RyNZ9Ru0glQykoy*aEMHjlOJqw`UUf3asKA+S zoGtL)W`ve8QtG$tlQkbC)@JL}`L;K^PeQ!QC{S*KvU`BFw7FTMcYEG{npC9Tla^>Kv`L%&`kJ+Ct$^b8JTb0Udv@Kt zJ>|YV>9Kx%MuqLE`bzEjaoC>Vjm_Fqx`p=C_HIuCa%1o#JCH0Xs3bQwO14YVj>2KP zXdN}ADjz(lcp9&^^}E?Lo?_Ejo}I>fp7PCO=$OVAUl+@2=M*z;%~nG3xZMC-(t-{# zoX2|-AN8q@-uY3_dbfsI$Db@bKgMr|3@u83V)COibRUDaUv;r~X>mMkadx8D3%Ivn zzmn?7TD@v+|J>SYHZuhJ3Q7y}I?Y=ALzmohk`60@BwDg=pAR|P} z>3+-pDRIALUzl#N88qJYmWQOyHptb^=40;4&LIHWpSJ`1V@3RlGR&eB3q9+zIhVS5 z1_zM`(76@)7er?MAWIlWR~O$8c3Vb66#0u1aFrHBHas%5ue&_0K@E=`+{*o6?+8)o zpy@LyC*+eN^_$hd-B#;A$k%`H7V6(7TYvt9=b=m-OL$#8IkKGp6{n@om9Ui?EWtO7 z^A_$0TfR~Kio ztucK*Y}peP0Y*G*PSKs~;E~Teh6^R?>P zJL@Uy*i`LOF1Ts4(GCmSHXeMx+!u%xl01ob3Qa7fuoV=xwDl=Z!N)UeW0Hq)VbXXp zp0?+;*R4fXuH6aKkUAn+zvPX+w)->06N}FBf7{Z+=*(sC|FHV4Pu^WYYwTvPk3yk9 zGKbMKJ5SDTp!o{-RZM=J-TL9ZUR%1aVl?+vjQ-O5Dpt_T|MVfjFww=)yKfDzm+};) zDfYvzwq-zJIsfsWf?1CT*De%V?r7t8*hgF#25Eb|2KDF^NY?k@YiruPPQ9d6=id#_ zqHo)PRE>OqAYKns%|7AK<`b$jqwQtV=@#4P4pI;}?PdrTK3tpS=BAV#?OFuRe}Exb z+)P8=6cR(_KsxR=NOFB@R7HHrr+w?YMyVeqH7iC{lyFVWa2kuZ$|yXuA_tv-2o>I3 zLsUFWH?|Lnb!rbn*No?Q|9&4X3yd#%DH%>pNl3)}&cJ_)z+lNMk zEV0zq4SUseXN>o8!4YrdbQg=8D8t)@y-C>J3yjiq@vHBNDyK$P;Obhg=ByZ5!Kwe& zXo9L0wAlC@-9;Qk`i?$;=&`@K?z*GAj0h)#2^lh?=U&N?jjox(b*TG`R>N}FhV;33 z5aqa0`D&*cGZ2|Q<^YaZ__0pI|;syd@(W#WHJ?dnI8waOr zHe&dHcpNhk%j(>X=?tK$Pb}-xFd`O<&d>>N5)DdUHDE0Sm7M&RpK;NU!MHHImxGtm zew)F|XE5tB9<@?r5xn@^m~&fpv^yJn-2Jp|@hTeR;;LVR-Y@26uO{?b`oe{Keci#t zggXw1Uhe)PCLUT+3u)@Avp%n=V_NF`v?S{^6H97gHoEGnDMU|$C7zApx8~d+s;jP9 zuU&N$_ELzDz#_>S+p-h9t8S8v)C5kX#5Z6fSJbuezm*baw2?@Eyh_l~pG{EL49RZ# zBj1#Gs^4kxCF{|VBi_~O6rD~o2cS5yoe9whZV}S=q}C zyQ)j|MNR#&YxZeH=@$9f_vvc#8s)}tn8M5wnaGH8^q94P1Fu>R^K=iMU|kOGGN5ie~8MmcJ52>YDbpZIV%A@27`zWK>m>b@z7;Y$`snX2&% zE-jeCvAA~$KHP2SBs5atxUj!*4Z}5s3~n+N77o{YPk!le*`DEy_44=i9eAbs+ z#biDDL>>u$HPzD+yBN#! zp&8UPTWVdj{ZX@T3OGXXkjZM^R%+t?MN%fRK0cn1;+-Lyhc5t z835$b9@8{{L1u?G{kP?5(d}-L;wPAEv6vTZHAz<4(w1qpy?|rkJkPi3H+)cZ#wCoX z*MF;;y#D)HN>5e(F^>LQM|cRJMzi$Tj{zCP2NID)n>cK<&(AP%X^%!TI_>M(^evUA zwBKA8`G$~mv%7>d|3j_$z%xeYHv9ZqtQQHY-DxDS%|4e>S+C7L-2&`F{a(Z^c-{vU zI3`~g29@V``&?l`kyGk{Z}fSq)Q^JQJ{$BMM5ajpjIO&)pSA|V(ah<(kMiX_Eecqm z>(-FF_r#S2kxx}eFI~4480xzHd*pdtkRH~d>fK4u0hxsruRmV1=r+AGjD$P%5t005 zNWOmB|Mr~NkT=|2==BuNy!`M1*6WLWWWckb8dNi58qLc|Z+cD`lrr!5cpgFF@kF`7 z`llO5Xl9{G;Y!P{%tM77b;13i_%lkRwrf0W&)8O$L`zGr<)B?$?hYye?0PSU&&8H# z(P}vW6DDsrRDF2<(e=S4ZvzjAf2@cKicsud1e|`$S^-pRJ#%rc0rrYke{W*(zN8gK zS}RxA6#(^Q7O1T?}{ zpIH&l0AAA*1hms0q^#s}LUmSaxBE;CCeMiIx~EQmULm06!vn1igaNI#z(1n&#ba@o zvEQHhO-z0}-y(N2fm{|xA#Vs~AMSnL)JfrPws^2xJQ!6PAG|7_*i?pJ4EPYyFdqDu zZiN+Sb%;#_OztiNVQg31~2LDo1wHiiY<%z%u4?du-?z?v;-Ch1qY6pBQn0~hDsva^Z>>D~7{8}rbirXyyHbWA z{yT)(J_B96;g7^M?p4yF>#E`-PCNso|!vGpQLE96w5Q5`Vh7QiPD?G>a7;< z2%pDN-?4J?t?6*zBqWp68e}v1^32Pu!RnHn{@))pQMCRzNq!oLycjhf2!qeiw;#>W z4`--E*Pdo|yL~CXc*|&s5LJkpJ2lK6HKU6NQFHX|JZk=cvn}dFb|jCQ-+n9HGWxnz zRkUSvy6LuyQ1ekwP-8JVI?#d&w~X##A(1!5A8#Es?}!3oYgAnr)x%;O47cSJGT6B)>R zU6nes-x-AJgv9MdgOf;%=^g}054lKsh7Tv3Ai2(6EZvwEz1B91-m`{d6@%BE#QVWx=k}S#}6xdl z<;w-$ttII@St?{ewqEXTWKcz+>jZ^RqR;Nuv)k2~mx^guzHL#Qe-Q>1oVoId+lj~w zHooN<^b@_;*an!rUTf?Hg5-AcFD;)}*dOjKn4#_=@m7;yx*QZ+VNK^{X!a#;FR41( z4IY+vxXIJU8N9GnQO*9@LmJMJQyP*#t`2Y3m8y_M2czm$g(QokQ)lSj1(F(4f0*SX zn^k<*$cd)Q>k74DT_dL`IN+XOA!q%e8=Pk^_PQwdiXuSovK)kZ!Ib4eOE}-c6ASeS zB7ZZ;ma27wkU`S4jtZB=oaA=WfmLXu)j6y`lRt{vwtmQf`{rxnuwJA4pnlE>ar4Bi zY1A!^`N2(-lpRFg`7bS!f!kR@rr*ysjxw?5TjBWQ@lx(qzA7yqp(@xNyLqYK@}&+P zVWqA-+&DfF!Y?Xya#5)t7&}$e*43J-WRoXucA_an=3WPSWZ=` ziDgY*UPkL@pkb=OM&vgE`9$GP8#i)6>OC8HjBn1I!)Z?N_j#JE)ZHC=7&5VGa$__S z6fqFqTZ6SXMP>e;`D^BO=@UA2UxqNs^e&&#uI*kTW+k`~YqU_=OzEZR_JOL$LPl?L zANjhEuT;t(G+DUR{&giSM}>ChV5$xUZrN6BgbrNU6T3ibnsfA<6g(*B-@z5bQzVos z`?}T*xbHWTD9$-esR7IBO^Lh34v-zeL009AA*T9Ivj# z?YNRS!DLt6Aj{EJH`Jb5SM2Ib)?sqjB^l|T!_0NWr*~_C+4Y*@m*x23{^>`N`@fly zg3DNBxA5sRPxsPKGOirbBzd$@!reW3#Z=ogu{jbiV)EwE1dzI6V)%*TY-Twc?(H@mqzoZA1K(hdlDym#o8UukiuouG$wLQ;XvRIM9Gf@DZBVzg8|E>! zDU_Rq(1zx@N4S$hq&D1!j*x1-xOXIc!$3Bg=qv_uHiIY@DBO3-MUBRT!2(_q6Q}f% z@ra&()Ij4=D7Nr1f?Hxkc;ot|3Y|k*cI4{U;1YR(+UUV;uJB-9U>1hbftat8;VDJ> zn?Lo&NwRv}6w1#WI2x_cNuA?9)6W{k`Q49s&W<2F_*GMdK#!FRXYy;;`ndNm2qBwcjqZF?Ox9_afn7n7sf}Vv6;Juypzxr! zu?*U;Gk`1MvFbxgRTge7^W^02`-MyTn%ZbxPe-p!$47$vqci>#fo=KXO~*4aNGS+QL~cBh7$eLiv9h<2G-hn-q%@(Yvsomv~nk=v;Sx8g%L(%zYf0G5Z|0g=P)|WiZOT-QTB<74QWc+T>G8g$f#>LuZ!}F|OO=6P zZc;u;`c?<#ycm014mnJ8y>eD8ySL>|7M0B@cBwZl$2~Et*(BFRwq)+{qh=w03_}C} zBKLdv9mBiiz2MzQz)AEoY?V@NVZX@Uma0~5yeHgrr7bC=R6cCY=UVKxwHP5fyNzG` zS3=t$mqusYhKUwWfgsX8cx!tWnnk3wqk?|96ykGk&q7=Hq4{;^+lTfn{8S<~%~_>^ zpxHZG=c4Tw@!df9LY~rWu~DI`Wo(UU6?5yG3x3$IaES87^4k?^t2PwvS2zHH+VfFZ zt69zNN^v&P2FUPy6rCb%b-or;LN@E$*bLI)la&J07s zAqF;HL4hQR;d%-X=!~=!InY^V`X%l^V6ep}yZwAcnTLG+ZdZL%s}Q#uAobS;&_MSK za^@~DxtS={Qc3GISkt7OP;)uX+6`qI(o@J|AzK`hBh?HN=Z55O?%M=qZY4_w+a#>1 zhE|qM+bFUVkqyaAW+CzEgD9G=@#;PV3hc7AI4NnzYl4boCVf6hiuGl9Fq==r;u3XC z7fxQJHfUumckc)_nB_<}L%Z8;p+w5|1)WMsf@Iq-#+XCJKvLNktuXi$N!asjutuUP z*ww8ur3?yvTdHGeP($kMNjg-g+dXxgzW&fgMg_d#mJ5;%2pBg2=NK z!W3cHy*_NkK?-A^z0%#Hu+-GyZqnbZBW^w`YuK9m8h6ypb-7!FY!k~WvJxuOLlc$? z9vG>IR)Lvh?uNg5&E4oFCD$r~L8{w`_0A>ctn#XxO}5MndHoQLewRj@e|_pQys`7c zFxqj+^Fnv5FY>hXHz~6tp6DK)c`%>fB;kE9 zd|$_R)zIkNPU+u+nHp3@w)12FXdh(IOTOEs&t+2bg&F;dtR~*tZ_@F0uHNW2PW7Weevn7e-hf-~O;ew2EORg1tg)`sK`tgRul2HNzC8`W=*D4d zk{jwbZeZ(Dydmhnsy?}947)dvtPi#iE-KCJ7vjsEwP~p$I0j!3e2Z4ghpCHP^;K(H zcd6Rg`eJ>eN+;xm{ebwX98Fvv=TeYI~Nkbfow;=zzLX>^!M4)_W2!33~CX#BMEK%xi zK(peHC&%lRmEF@Zi2(~nqCsh;VGY5UczokWV^RZF*C$ui2iw4iX0{a^Cb?2(=XllQ ztsk;Uf(^?pKM>*=z>!wW{Kk*!t5&saSD)-psuA&Il~!(_e}z>g&Ta0as!-D;mX+BA zX{`eg_+f=`p%`ze@^GTUcPlLX&nlb-W%|aGE90q?IRZa@ub1BN<@H^*BqJTd%fS!x>Z|Qq5R1N0Z^caQ z<5vEYMY?r;)yIa5zery-Qw0Q(S@5JxYq7rSw0{uymGo6h0F_XG=lj$7&Ht=Fo9_I= z{tW)o{`^w~1d&Bhn$7wX+!6Li)UUS+&gi0xEfPMa`^+~#l zeiW2G1}765R#nncMV8}|{g<&e$=SL>ah4kS2-gGKRFsCa>^!DyUunCnWoz931h*gy1n9@EH4Zs%rNus8aOA!A-^kn z%pRuxuc=MP2L09xoqx-QsE+yWYeC71cw*$BK6GqQ?rv)^1@YSPM!F=M#q995?tyKaYH0W(8~`zQFY@{=jKsJ{(O8+J~l7`O8j-O z2(@hKn<$2AL}b)Aq_#oJRpM@aME#AnClr$!A6_1+Uf2AUs#2BrFX>Zq*MW3ZVQ;fi z-EbNrA4xnXbH`&35Nk&m9LvCOmBZ<4$)+a5-J3nL(e3xJ_jMRbf*tPflk;`B2287w zAL{y$!j2N?w#tfp9j-BrHhgV8c-PxAPh?U;hITmufi4$4It(hypCT~Cf+C;oqor7| zML*G5E&a-RRTV_O0m~zU<|NP8aH<4T5c;9LDK0RGB=#f;&JJ}fA7gAttiO&21lNsnRWoz;Qx_$c6@? zfx8!wvhdVxG8+bhJUl(GAX+!~w+Kl8g+v(&NbP*9ArCW#c5=O1aC?~epIWTh+7OOC z0ACfBjzpHN@KS=zg`uF%-@A!~W_}}!D_C@S<|PbP?`1;1+0%mQZ(VDn_KKQzov4p( z8*;zZm=iQ=9?$8^d?LA&hpj$X;k0@;8tC~>?f*vwKB^x-unuj_DBm!T#N+%_H!KBz zb3Q;YOTj@+1N&RbTPv?o<&EuC-q>7ujsM&7npEES zUgeF?mDlt|<%QimEBdqeMA~27TyP|U#@F`c`i@_#j=MudTB1*llvBWQ6Ag_gN1hYZ zl_p2F2;-a2epX)6c-b(j{1%me&X<+Hj|`o5=={iLN>x?osHzriekm^hr0QA!l=Ub1 zKIgG0S9k})X`r7eJui2_Eew0$q#b8jI;itr6t5*306_#~TK}5>I>@)hVE*7akrD zv@h_}KJnzL)>Aq2wI2t6SeQ1b#FKTUEBb*NpcYnB4qwSxLzI@T{9X*hR`!41qNrZ` zKM@4n+tA`7{m0h!fBudF#KC>({?BZGKc&AzxrJa0nh@_YK}3a3m^5ozYvnGg$pA~k zEa2bqXFl+q2>mAHLb18;ggH)3+5>9THL_WyZPjBUbb<&X#|+5QuD+-}czgMrnNS-)c1z`W)TlM#nCw5eGzmh!h zb2=2>e;}S+#}K^8825r#?=J?DFqOyjE-_WGTpOS{Zk^C?03*a=Itn|&uNlgQ)S0ln zF9o|~%8U-OD6;nm6rYz|U-fXy_Bv}ZVM<5{p1;>!bNxpcU+CpOzmAf2e`Zl(Cjt!a zMgxNJV$JNPUQNtJ$hGnShBd3a5qc@gR0jtSBJ^3NSC`GPTPxiwrq3* zZLJu+%-%P(#?}Z5#XJdJ90rx;)wc@_I=bD2U(@30%QP%mZpY+lJ3~_TmRagXFt8m? zDcFUhf!o*kfCG2-0j-RaAIZaLTV~hn`2k;H{MZ@-bVoqwb`cjNrcJ8=;_d$tod?itQM4bFDrxs4Wy$ z!)Lf%m!qeI%kX#F$tSC}WF&~|MHw5jFHL$8|5%@7oA7d5;ls_D1_rxw#@7yDR|NSq zo%0JKn`BkR%+E=2jqzYnBjmfj>fbHgaX(M*9B^BU!ByIuh?{g1eSn0usV2%V$5~u+;7_w_`~|lXXv{n%qmS6dx1R-@c>_K`<__wOD_#T%>itultXner`P;jd9klk2+F@qN9A1lD^ zt*)?CK_Vs^Yxq89J!IG4PPW#tPi)MuzdbmhQ~39R@Me;b0zC$x~NxCHq?H6o~dbqD)yU210~ zxErlFv`5R`n%f2DbrtpDM*JG>#INb{Tk#33W?bMiZA<=Hy9&PRY*mw_0J^0y@e@>8 zBUMv6cfU@aE^cjJ?$&GtDll@5N1;{bMqWGK{;I>X&+bLTGtqol4b?F` zi!_deEM_bl;}OO2*2Mqj?9d$=4qY#LvbAw5+icvv|2rGEAwZ(W?N5NWJJDdg7?ck- zaon>K#~9dh-{c4Rar@pbe%xLs%*O5f&ByIQXliocm6yBSd&P4)hvDqHWGf=? zJLNUWbH@u?WA~~_)=f~5N8CPeg>~LSb!ro$u8_LL`R)s`*GX(A*xn~H6w&rl!|}z# z5p91@D1HWv$SHwBkUn|Uu}*j-CW2*Qx#o~y+>jS0@0SRc%_3(xC=cDsyS_MyQ` z;!8g6JL7@qm8(c4wUO`%x~rVR7_Mk9#v#<$Xugpp z%jD{Hj0d-Gm>S*=-K?$J)EX^t#Aud=De*QU>)O_Tsv)|89Y5AhSa~srd?Mn|Paf8T5E$7Bl>`GE4QUEWoS9i1q z00Z4l`S~L4N03~eXcxXTYa`vN{FR|Znx<-nwO=e^;L}4jAykfrY{pXWhE6mJE@(* ztUE4lRdBb`P1Y@OF`g6FIJt{$2|)w8-0iRg^(oF%3o7sED-=JvTxHa(7%fUU+PGkH z*C$60f(h=^-;z{^N#cD--=GhkWA!wCuxs>q3rlY2Iz{b5K5!m^^}(o#<_W!lkA|ez zcAGEsCIW;oM>hyl9zPcBI9fLKg$8jW77hmxqwO8?ie&EginCZc$zs60TT6cr++pg( z3TE7A%qr9k%N}~2T7%Cmqbz#*KYXXJ&C*AWbD6c5ar1|q%J~yMoJ=N0bWou?@&-W& zgSX60mT@QL#fZPaxYYxH<)rB?MwmyK7bEs5@yV*Q$ux#rlpzRhRw6|kbW5txhe5br zrugXgSesrTx-|u0@9GQ_8k99QGre`6?O!6y>yN6|kt+N3O7T9DfKMT)REj>90tx(* zShbBobpu$mx?u$ONk-crH=)&UvBMS=%ZxJnFl%<)zxOX0u}!qS%CN^Bb}X;(Z)ts^ ztJEE6JTH1UYLTaj`#J#)RaWL@lvy93I>U>`2A!7o?I#RCy2(Z*3l|QlQaGWr(1y6N z7E5E>&1sT3(gFk(YVK&%C7g*PL~plF2XBZS zMnq#65uJn2JwDRqTK$BN4a1Z7tGvX6+e9nYM-P_Q_%p+d(UJEn@i}1}uPxzg(jtU)^p|)Lo%*S3m9{MmiXPl$MGfU!MG-YCjN)}RudsV1 zR6xe(u~tK5?s`!-1kQIGO;`dnt?N}s_v}@3HQW!^b1jnMOFWc$u_8ojwtc5BsNZR6}w?Y-m>U?uCQcp>8;64{2sSb^Rg) zBu_WPK6lI&_R&hR&q}GAgpAZIf(N->uK^uxpYwYJKKB4yc=){VdZqTD?{if4w`IYi zGK4DFF+{3fxp+Rg7QY_=8)pxlHa{8|(Lep!fN;`*!Jmdse=ndAJ~WRX%uaLGbhW;8zQRT|Rh2{&iFS_20Zg4Fp`BymEG#TAT$g^~4|xs2F~f7fl;UIuiqp47CJRF~7#jCMAr&Xy>P{`H z0N=R=sz@g|pGu^mQL&nvxLvpAeu!Exy@x~#1I;kY9?G(s&|DT@;pa5S4N;bnhOk2G zu=!@94f@g5AqY{v=-C?k4q1lf`hdZG!PH*(XBL9md?GVXh%G?5aVvnCS;t!rI@h>g zE9@Z)D?rpgSGH$VREfF-)Iw;Nx>FVW6mOa7{MZ3iBAUcBQjDEirL-_cwsHDecgs~| zxGLO#g?-|bQnO)U`;pf}SJupP3Pyxe%HzSEf|stG5vYQRwiVc*t0ZXw&2U$kc58{9 z|BA;{j$b>DG79{yPVjsh$IA(->^Rt@JQ+^H8A5&#xKuAKw4Q(uzC!z?zWtK+y)Jz& zE$P=$%ujB$ecs8P<7&UGecAK1WC#3ovD4U0e`_r*a#zn$oshxh?w^8t9bfT|d)UZt zr0#?LOT0&Hfdi-aV?8yW?=frk*^L_{t1g};_&y>ZyLzTdJ-f-rPDH46-^j;~yv$;o zeQdSzmgHkkHa*SR6D=0ra>ho{;+?J(R!dd>;SN?~FmNI)vzW1Ybf@t2yyR)@D@@E2 zAn+$VC6*h8r*&!xMLBLsM}zjuR%VFy20I zZL-g9cke9AF)5#;(cPl3;GknZ*AztNKy?~Ye-~C|3ZDFkK*pLc{n@pV*Bg53N-W9+ zZsZDK#=hMSUSJLu62oY*IOklea+252w?{Bb4<Baw@~pd#hr`Ah31tt=zG{?s8`goJJILH|*QZq~}ncPO5^ zwM{GNo!JT=_}C^o6znvd$pLzT$VSPQ)YzD71-^TT@7Yfdp`^|FQ~LxO`At*76yLcH zJ<#bMgN2rGj^>6o{`*6fHE@3c zSMvH?+nXYmCFyXWZ#pCwTe#8(Ls}p z(2b@?82DX1l7UlPu+vJxMOR`&u1x0LawQ~h+El9YATk<>oU+QTtbz3^#E{MP>y^AK zQA&hw_w}1B1c1mEDnQ7!DkxJCT?w%YVTM6ILq^YeC%@Jg(3uMX z->MnO#3IF{5-atv0hu#TugU8d+9T+&2S?g4;3alFgnUmZGiCJc5h}6)N+(wEPAGVY6)MMeyY%9g-K6IuaJvGPh zfQ66p;cp-{$5SUkM6~Z>m=Bz6i;uf_edwM(w55lnhy>+6G~z>l_O=fl?nAq!eh(t0 zpZL%UANq_B{e`W%v9W3&y3~h0{61+@bNm`pD{l4SuNuMRW?!HB8XtO}AevTyjFt8> zA39&%Aatk?{izQMAo8nsE!=~w!e8*=M@bY<&GGP}@a3l5uWb6PPsxge5GfAt zJ?@Yf#5&)-h;M+^m9*udAy1s2h2l}wL)&00V3$l+VkpaRho|>D0)RDMe33p%O6JuN zP)(ex5UUbQZA7bM2cXK_B#P(#`p<8Mj`nmk5wKWP+*N7ic*g4U4#^n(VsKWuMCKS} z=csa^wQ|LSlbYkf$fkI3*Lw2Dt2VW;SEMtZyj-8zUAQI|UU^0KblxY_3t!3hNQQWX zRLFjX8+0|9^o)nkCVP52*5^V^U3JZ2RJop^#f#vH7Azd!RX54r?M!LCJr{idxU0hi zJ(9LAYKEE9Z3`H@=Ih(Yg9L2^NmY-=b2rU=eIu3 zFF|^_Ja10zou{cN&wu+opR$N@dF~|7|7j3Dgm?CXpsxHgGyn-pLXKM|<;9jTvdBOV%&9@X^`dOzZ<5%Uc_lS}+aPkX zL0Xu!Etm8oCb%Iu@^G64&2CL_xO?|<>*+4teu9H@Vx_@Q8Q$aMV+fXbNcVGl7-3|x zIqY@^_!Ng2Q8;NLF4P{^aQKf+~X{f@%Z4CtiFs|i(JrS23EtfZ;q4bet68Bb_v+&E4I29~)P2|aA<>_97JYIrmC zg{m`{+U!aGPyH7g^yCzCn*VC_Ut{!z-s5Ho01Vv=EZ+1Fr9RQx$iv^wq)VS1s#QE$ zTON{-X#0_byEyn`au6==rgZpKFWOHyX(#)4ZA2aH)rOhKf#i~qLjGZL~!P+ z%<8QLei*F%K5-4(xtHxj4+rDwkB%Krw0 zFMaFg;g2c&`Y_)diw~veWUhBJ<`JIOj|!LlBkauo0Dg2PZTW}_@=-Ixs4K!;m*%6+ z38O9wqkf)`Iw6cYCydg8wo(EyE#D7~UC6mJM9xBrCA&4K&pc4RgX}t%LtHn75UkGKld)P533vU{~Fbikl_hoz=q=nx{ z^KGyee&g z00$Br>Q;IpHIzr*5mMCXz}BBpz7O zo|pajd4G1(1(v!WUg%qN;rZ604KHU~^j)<`H3g%lWEJCv(Sq|a_GH7d`-$*#KJ5oR z>-~AE+;5fLqo%{?D}b1`#o{n&{pjX~;3rMd_HPkbaIsDDwHhuem&%zme+QYC)JE_8 zdkNoh9CdlWb-hK+>C_|HT^rn8rbw(}@jmal2Uhp=)Fn67Cf}`1LJ8~;v=4u-4#53#2&u@n=mjET|qe~YsV21cMfRoLkE_O*QfRsXpy_8em0c+G#V^NBaS?muPi zf!R%eKsU4S?1zZ}xaGNaI!XP#Rad?;T>t7Z9W+w`fRY`+J~}yi$)-qs^!DX5Ixjtg zn{S4_jT_gQG$1n+_&jDs?Y@mzet+%ZXQuKemiMWjzN}nL&F8LKK5ak0XKbyiz?Xkn z@|~VlTCSXvmf!E2d`&c&^MhGEww86qX;~z8y;O`a`cB0X|H^p)cktt;^d2mxe0~l9 zAVJ9@{V=KtS?4s?B9%6>xG*x}9MM&F{S+UUX!p-KmxO8C{PXV<{PR{pD(U|qlN`^x z)yH^nnzo44#)k5HNo)YWEpk1*y9xBh$2qaR_?-|d=XZQ8#_!lz1;3m$hFC+IIMz)J zc<0%jK8aWu(m%R$;xN4@6GOtF;g%={oh6R*)=NTZB%zv$q>&Qi3-4|YGggZO<$$LAGY9~O)EuryxCkmT2D3$ zSVjs3yqXO#W+<6>%a^OYvWj*VeV#vMDw+7e#|nQDxhb31g{e#7{;c%32uLO*kJA{f zUzOEA8~bmI9pGa(g|T~OV@nK7cTSWOkW38nsrnI^OvL<0sR8ia!}+ql3;QKa$)&yz z;!ATplxTs)ekS~yj;#d)Ky}s)?kZvXFg;0hOGB5t!~*dS@ciAm;b&+@Jw5y!?qiSF z=k#U5=>@#0_e+@3(|Tj(A06R=9>Y4*2g5_0rEi*5B289FdQXBvdQ3QjSt0-^N%t)Z z2Pu}=oj>V}41mJoiREZqmikSer)nj@+x*D0poBZoFWYn{L~}6+Uh&5ee^$pLa4N?u z9(%A9Ju`zmM1`7K!(r*+kD)R5$j?@0X9KA`PH0_9_Ur8Q@gp#9rS+dVN>) z`tINBd!NE@peHi-k5)ljSpM@|Kv7uVn?>KjXjD?8rf@7p@(SfB=$rT%Hklod#s1RK zaf+z5_RcQKpNcH#^?gpS?<;zJH}v|xgA=dv?F+8Zpv8k<8J7K5mNvx)-_Mb2k$Cj> z)f^Xb-EC%NkwW4ziHlRu@A>LzaJex zdMrQ3kAFWp4lbhXcs3u7KOQ_hZb=^gwlJUfyjEQPJB8nzZ#Wtc+3pA4iw^00FZ%73 z??uNiVSIL)Ge>8PH;u-NhH>0Z!HLd3Rion!{OG3W7z3DU!T0#W^7#Ir!fzE#TTh|U zr+#lDwOPxXIij(XhOgxRD*mgBO;-y4^ZeB;|NQ^hdlUF7imZJ&5iZ0L=LRJjN0g{R zgWDtyQ8Ks$l90ZTI8i`BP@|(5#|<&jII;w9BJ{LZh9Zj0m1j3@%Q`wuQTL!pRPJpb?VfqQ>RXyx`iVMeP+YE+VHLd z2LbEwnF|xfHGrOrTkoyXT%$v2*0yx_v}XM#KVYd zP$iJQi5L1LQ?t@okqiy!u8K8Q@{(XkAAzxOEchq=3Ij<-3f3|S%?cNE;NJgijTK-jKH{-h&p(qH24X02Y?%Mzfk1EVn z4_+dRr9r4mdJ%;cdltCySCFH@=>4u&3TAkVX#7=i_;KEGLk#{&4*t_^{OHg0BCwU< z*VP^?{Uv>mI|YDP_cfSbrP=tANq|ywd|=g&w^1VllYV@mG?gxIgRAgoP&F#@JqjWl zjUe-1SBXE884W{YhOfuFW;s##hi?Ro3j)UE9lrltVIhrh;b`Ci*C0Tve|W|W{Q>Xk zBd)}Ub*RBJw#56VmVjLwv_$NB*VCE-TahM2jTQ(F8>100-vgXdG!HTap{L6m>7RQX zL`4=k5zqwWNx6%%< zSNSj1`JdJKAKL5uFC!!Bf3?nk;a=yzbc1fc&fjCN^B?xHZa>IK|95Ty>{a{UUL*OR z)%hRV>-^(%`B&@w7w&cbOYQ#G`Frej{*0Bn{ip`pPpir9+waa-JN1FETd$^76Wc>_ zw+eLezA(LGi_X9}D1q3Z*wW$pA6bQ>xH*O^D(MM^X^Dm|XzG*oWTzToE{w;2d_4XS z#d3|4KfsFE=(txGDq1I!F)8ljZQQ+qTjZs4-hQXPrSmO(kE#Dng5TE-HW@7BODY|- zXc8JzsT+fhJSn(j7=E$wSTY*F_!rZx7p?>)FqgkZBcZc?@U(9<2DvJWFaHPFrb#~* zn~i*!OT?$SlIYn8JJ8g`dj8U5yv#C8O=HWchC)U2OZMeBa0w zJ)th53o+Mm=4s|k#^!cF-3S}TUX3lYSyo<%Ck#_tlJ-`yypi$c?T7OGub{mxF;~G( zmPiGg*LvHHYn_YAtdb#YeQe1C?2^w!$ z4QarZBf?w$!mjYmrCHR@|3H%b569)d(aHb3&cDM`{`pDruW{`0x(rp|uL#wBO0U<#K8N^7o_pA4rn_1$_7BztPG6 zJn|16+(bU(jHN1BAMUx&S9jImF|^yuwb9wI&-vbawcbNPN!5EbS zvmvj$?d22@ZlNgURB5qK2{YKhFY|-NpYz`zS}HeJRoQ z;bBlA|7)H4RSHQo z|8u6^qxxCYkXni=frP*8O#ZUbXtkbB!I0u&a=I|2^HwO;##>fD{*$W5v&{Z>wKGs{ z`+U*4SbO6I(-wMWn6p7Y>D_O3z&^FjC25`lK1u7nK3p0)*?gKcCW9Scv$H*B|hAI1i7(1%0$SK>bhV8x*uV4wC|mR^hBlPSR{FLDb7VSJpFUnQgm3%1@*v7|sAk8?f4ykHz6j>audGmR$I5)sC z2)82Ss86xd$ZJN9^p2fqz>3MH>SifqPpLj8uX*?Q7X>BZqM%d}*UzLsnudCzK9A<$ z7cB50&KTz`z~ww|@#|DWz7DtVh)kE=S$;Snb)4LKDciHKOwVODq=Er59awN_B=e-t z;5Gmb&f>l#u0^Wl=1p7+gqw5xyih28N}-*gI(rE5P9e4MeIZ_kuS1q0ylyys3OCL8 z-RdJ1O1HjeI^1x?%Yh*GGm$9BZD&c8D~Z5gIj9S77)qa&Vt<>Fg$LFMv2^%B&XeF_ z_<9g`*yjXYlAXin&qfvFiXvR(gL{4OotJ2Sfl^NBjGb#-TD%c7LJNj}ihu99>DM9Y zuocX-hMAVi2fX5XB4B1cr4#_(CwdmDZx+HmOvArmK3(bw_^6 zoWGYgCW z(I(b@6Kl^uFf>+T|B*w)*?;s*Cc?KeKUqzg=pyb}+FnE#VS17sPW%0Gyvr7+{oV`j zvd3w^@9XXljEFi2g{Q%VA^NKBz-wetqJPnigx{73zliW#qROGvm-cvuI)pszgo~T0 zKJh#?yjHAnP{PK=PNn8LdSFPvKg8#?h22cF74*OXL-`;km7e?tDRde{l()nbtpBNj z=Rz7mD&7F`dxI^0A)vT(pzE+q+>h0>BZ+36EZP>T(NwCP(&rDyOK?H19o<;gUe342 z`3`WW8U+1-1tG;lUGba^90P#;Uh>IbU?K@{Z>?!3W{>7yGNdI)>HO3beH~Cb0X)RTP~Ca8(7)ighyb3X{+Wv9a2P&Y&!W- zTl>f+YKHWzTi8rirVww?`F(=^{NkF;s3cC6EJr&Bn^C6;TI*LW6Lc>@U+e-Gv@|+{b=;s zfv7Vbu`#~bKLC$8p)?%DiHF^nH3xHZrkSV;gkVft5DXJ4tytm=oR zUl}O)$zOj0C3)!F(TJI3yk^sR|1y)8`86B8a4veQG50HybGh*v=*R#3#u0BCL2Md_ zdXqNrYD2Pr8*{(xSeE)zBu(V5VJ-zr`RiZN#QR+y6jzYQ-}O+?>+CeprJo6Mb{(A7 zFSta=BXk60PK<&zbyS4kDq@9U2RAmmj(g@-7ZE)Ubqu?EX z1F!CZ&%=7OrW~RF>#6LNnezg{MWX`_ckW--YpYNV^n!ojvVe18fWPbrY;%)dU2J+S zH|BoQ(MVl`^%;ruf+o`WDS4RO(}%)KgQQ9?r%m`$=uM!Be+sU1?0TsA0san714ju# zG+TXOeh_7=a@`t#(Ff+>tl-wp=3r22D0Jw-Io8lzb1*11v^U;*TSHGZ2ZK^WAtnbG zT5zKs3`z}!4n4Tc8al)r3`*fv4Ri1?YiOl8n3O87vWD998GI!o`hY$QL7z4LhJ4Zo z`T*RCi!r7S8cLCYr*e}6>wEF2$dwBN0LB(u&D*m^BYj>o#r?T}#mI|*x!n~M;s*1rUS;_)_oW%V76*F0 zYlmR=*N+tT?*fz0{O{R@g2nz@DhYGM!+z2fjA$OO7O`*vtf3vV%Tu>kr_(CKcut*d z|G)rlBR2{*`|HbvKMzWdMNfcz=r_Q#M2M{XMzWTvkK-B&%(5F>ryoID~#L@2;jFW zEnr;*U!5)hxw$8Gzm>Ewl#U zFUHFNt~txB0a$ZlybQp2!3uOhC03vqF9SFhODS0fR9OQ!a!RYrQg3+jsJ%8FlA!vm zVyjc+Aib|rl-^Gh4~yG_F(j-(S^WwYkHIBlMVTeI^Rc11CR|d#Bw((sIh+BvSL3VU zFP#_gm(rpJmvPzyjL?N?dCf+_g_*bqu6hG!OlU%j&ZgqHwiq$cEh7uaBeU)P>c@cF zX`;oNJ9!lc?MDTRswWg%#}@a!8fm||t}n(>rd;7U56+M{7jpy975A;e$9dNyfO>6a zir7dEf609Odr#L!cG?@Szre8ml*JlhaJ*UlIkT@G=w`pJml3=vnth((FMco5#C8NH zn4^hRZcT;GK-}T8iiKYnU=-mtDGi*@RA{-rN(fv1v@5Z|;29y0oZMCnIL00>kyOSCaOvDa2M=Cxb>sZAI9|K1XLc~m1B5Wa+SwCzvn ziRUL3rTz=$d1b(SmtCulN45Fs%=2Zyb zHjy8!D?pn~)n(=8MooavP%m!ilA8nx$k0+GSg;}8Qj|%20mPP1N96Q0QF|fBvkdDh zM6LY@xN2V2J*u2$^Ik}_2XPG7^6=HgFxSDxo*8+I;{$LxMYvrJq!|y#N5fT=-*CBI zQplwcjwx(cCD=qZa)L0gjhFt-;b>Cu;BXYe12?IXVdR$@9+CL4)bUHeLt@P<*#?&&lA$x zHgzqT<5XE2&Q~4nR$dA7Vsr_;r}zEbJ-a9F`n$@_l30lRZet%J&Q8G2R# zgbd}c7;fM9L)cD?8fBm&bSX;@=%DhPVY9KGXY5^sV9GcJVgm92GJ*H~v{DXKs6RXi zZU_EcpnMJ}X%Bc8uyXU0elztAKWm^f*jImUS2H+#B#sfCz2!Qe(StOo!U;9)Q|H?t z+{ohG12hmIR26fvYVU&#$!^t&Qmjc~ZKXaS8XacvDOnBwSMJwY25ZW$@7G}vD!E_h z0%#DfzNn8WAI6nm`XLQA1oizov0Zz8Df8#^(2v}&!>&CN(m`E?sm;^1xL;?3 z3UIZoyEeakHhZpBWjqk=%}>tNy_pJ_^rpUF$J3kb>I+)IV|()vvKK&}-n`ugd3tj! zK&)NwQ*anB7nFdw=6g2YS&=I-4&dtVpr+C*yi%NqJx@@5!?bPzFR4QTjXWb*H>lq- z7qA`#tc*`P8}P_Gk!jKUb+n@X9ar=}VnV9L4IQLSE+Rxy69nHw1;*wB-t~+G{>QUS ztsDqYYl^e8RKCzd>~n2u@&L9`HY|4LQKBI)!^dR?Iw07VcQeF56meL)P{ZmX)HJxD z)=?X@sSQ@QHdO$0OmdbO>%{ywfT{86bbz9~&v{Awe-JA@xN$VLaC4v%!UQ-#yI3#s z?tG$+Y%8p7(A}i2*K&T+<+iB>B`kp^IA#7pm%qF}euE3JQeV$nI`&AZ<6V-xRXszo zp}oEyVRF>*9{@$`sO?|4vP?`MpRry0%ESTHrA@ulTNm{T^J1V&B236AL)!hIjdK8T zYCRseUr|L2O@PU+un!JYT6GK9Z_vBuDqnDYYD`43M#D}YY?1VZ^@#sdm|m0FzD%FQ zE41@E`!^1}(t*dtH;ejPp&C$0{)6|~ETT-h5h}Od5}lwPpPzl734wmI7QIuG&PfA7K{L@cIyN}B0apN4iNbT zv*pA$Y=0mLeRi)bR!jRBCS22-xOL*O%jY5az*l=hUBe+@ab|#{MF^K1$szU8nrTLa zPr)pdXix8osWCDq=J;(P`W5GOZ$MSN=XFad<5|bUfiWh7r1##3t5+6u#>Xo5Ioav) zr$5vi)%NGW+dI99n_T$a|C%~F0*{0X?=Uzwr{B{@!zZ1pf1l$965y{MFTcarG>z5| zpJ0`BK3u80UTTOt`N$7|;Y&CGFULQA913UXu9w2sd_B-F#K$l20e;u=u>?-iT`#Rr z8E6O>RT!8OEH|I(!OXYcDmxwj&cNl$7?`vIXqY&)Kn|s;)1>PVhz^lkc(|Bh2`S(W zYx?u3Uwb23#dmXF-nMq!=-5G4Fs(XX3%gp6Y<)@fGLbT^YBfy4jy^Bj7?VgOYe1Sg ziBt&ZKtRQQCq3mmsTEH1e5bsn4ERAu&zrbWVPL7Fp}C@^80Bgz?av~R7=O8$Ux$h8 z_w9?TaM*0zG_B9HYt}3369_@T8s>peRi3z%bC*6I2)`9YGmc)QsUv?6#CAkuokN%~ zLXl$mUiv4wG^6LUi0fB}LJ{67`~*Od^;}=cgPs6df{g^=KZ^bwG2$YA)MNojR6U91 zgmd^W3Ceko@DL6Rh#q4?1%;cuvW^sGfWzL_Lpcx2hajaALnn&!ViHqgLqf5!L?zfbKiEEmMT85E4YPpv{`%DumzIfo0%UGJX_r&6`s{lE>U zF@;Y(hnmOl2hQq?Z+o;Kcmx`x?^D~5i#(ibV5jQ{ER$DpRW^FRGh`!D{#?r->O`}=jr z4E0~~_nY`fyQp8&-_Kcp88XAk`s;~fIa+1?btZ=cWYae4V-pwXM4t86I?>bG)FMz# zufH@t8FIeH7b!pXUVc>-ptN1fulq!C+nqndF+^bba-K>ezkWCw-}Xp;U4%x(_%k%i z`?Y}+0U%n2Ay!Pf4H00N_H=iUHqhDlizAOjy!LqqWFMCAN-u$Adt@G7iX-mTx z_!OqIUtn*Zg~>SH-h3G>D8HV)xjMdFkVO77=HY)uH^(;C=@2S0c8%COa zzx*Gt_D+7k{3j=&s8IgJMYg?}L=9o2s@2eXX}?UT`3q(_+W%gnWC09IyNr9D#UhSF z)_cGFl+C<`>=N3WGoA!Wts95NMDLfs7AbahzkEJN1dWPOeR->>MPjdX4AQMO2}hT5{$iucUHPAYgtU7u2W(gO%YPvzi5Px*gzOF$gZy%j7#@^`9Il-&*flsxR(Q_U;`pI<|P(*I6#T_%clXltNZ1_ymyef z#Fn>SlmfBkg%8Allzs2EK3@A7O*iUs(HNlLKMV7A?D{N8e7yhGecvz8oS57`+DWF| z*!#Xu!m>i`L`!1qqt5*JLlgE=co&42G;TpVZTnPTS-y$EJpCvZ=sW9f(9hccj~w87 zcOaKbLRxCl^+T|kzxa=#z4_yzw%ox1gPrB;dM6Pa2rJa>5An&eZ8@tYD{_edn7Wt< zfV=8G=`DmYgC%3SAfK{Ke#H6%G=+a>#e8=>h99rl$at7J0jVHnSb4VKM_`a>f~iFe z81mJeN(vwmO*~R0ZUMlf{V_#QC9x{$*w85cby`=f{cj?dnN!5T5}IO{!j+$mC<~7k zt{Vzc=@eLSE(GCJ+Fd08x`vW2nECw&YIr@ZZlNjbkxRp8 z2wa*9uN>bcWf=I@EV0vckh2kR)6s^O={Pxt$HmAh4A1my^_8&(u1f>4~o^1Q}9|uZ>T!*3Sa0DRmX1P3w@&M*yAI@ z`vF;FR0DCxA9o`rZk&v=DZdNlyb#>Ok=r+YAOtjQzLjDP3qvJ!9Ja{RX~@Ekqsus6 z)A`DWEItSvx1TsWczDPqoRC82!EhcboQF#1p~`s}%?CA}+7ylGlm`fx`8=9r^!53n zE!31K&WEmv9bX&u*F!K8YJRTOmfiCTI3=Lh;Ybps4p?9QxXNBX;>a9-bo!<>liSfgWgF0Irxa_ z*_TMjM?JrA-`YSXUDFvI)`rIf_jAGz*%ocF2$X8TS z-ulRhq@yGTpgd=KWUcunnjTzG!QMgbiorCVv%bmBFVh~us-bY4w~_sAp_sQWUQ@gl zd7iG4^7i&Tbaa2QV)y&+Ae@|b+0ed18}-$-T=mNUQPoCX1+Rr=+V%a(~O&rk$zL(!OAP`4bOm}@bq_hzu0$@ zS2Y19VuRfoc?zb^*=DHcZS@f z{qcJbVL{3F$35qr#3=UMGV}zz3;p#Rb7i4d7xTv&l~!h*SZ;2ovu7P3;Ond4-nprI zpkbY#!&?LjJ~R9S-lM-JHmb*EVTw_OC>O4q2bcBw%$SJKne7uM`0;?;bz_^%)eX(H zuLWQgf=46W8DA+c_^H|mSQq953O<6XK)^rXeL9eq2YP)JmM@unxS58{hI)1kC2Z_OAm4@A(_f!{?|vtSWI3Jq7}|>b{=v{QQxAJz0h|q0qVga*dU)%CJhTZ^juYuhu0E z)a@<{U6EdfzJ`=*Ei)K;4kHI?7HlsaFlsyvW<0eRgI7i)@Eb{qJv z1RH3V!W@8!wpE;kycj+feNfzN#?YR{-1LNHa@n3P1BP<&#ZkCe6C2&*^{#%4`W6G% zKK{!AuIgpZtSLm*jDYz?0Ok{P3o1!30d+l#3Efnyc8V?4clRW0rCX={>DHbpuY-E5 zJ#}m@IQSo;bvN@DAhNHdz_WKD5(wP@^P-OPYlQT+H(sAda<%#dw&aBS8hV1Qdm~0S z_6IpGc`xW_sKc33EzDg;s39H5qj=yMg3a(+wa5+(8@0m}W3A;S0i&k#++zFRIrR!s z&<y2<4lDqm z*3&u>m@H7RkS8kI)aOUA&wO8SsDO}#C2)~9*A$!EFh+7N7=A;3@$YgMRSP(Zgj1YM~gj)r;$S$ZvsE~i`K|3P;tm%m8vKA z;-TdhB0;xliPp$M)d4BQdbB|b!z$%d*BAD2d#D!%f{vH#C76iFX_e8%;8`{(E6QA_ z6NJWW+aJIB4)YkHjPqPJjT)z;*e3pw3vTQ5!>!`+pGogQ| z`?|3z49b95g7-Nw22_8hK@9H&!Ga68;mo$=?^pQFh^aYG!68&LnqEIm&;JX$G<;mw6W7HR-8z*!8B z(Q*&i7nyEx@K+d;-v7#KbqKM0TJ;*Rhv_uT^`FbnL8*5B{SSbjd!TM)i{DfBI2B0O zqi+^iS&ahodw5*Tp#3SO!S~?t{0|-!tA+Y$o6FYuEAH23(60a!M(#pEYkC;DU9F?t zmf|AH$Wsr~AP*x?wm}|7t|16DK4Cw!?RHM14i?wEd3GYAGXS#9n;u-fG%mx8sCB>5 zg$s`+@miU~=?}$rqFXNffggehjy%slb7W}GS08mpue=d~pS#HBxA6+ZktZXqk&QO& zMiv5*IhR6$;-7Q2y$89Y{rueIVnEBBX7r%FrR^(dK= z+f*940;k3fG{}N&>Rw2W=y(#UplLFdUPUgRxPVoU3No%krE)H_-_407l>hEOJj~u7 z!$gIUAL@=rbYDT+G}sz-%-G6HDzxa{B>ju3tG|4sc{~dVh67V?r}$SKk+*aDvXNmy9MM`3+e^p8w$mX9ZWq5R$zA@X&K)w-}O`Q8Jj=g z8%F-3U!c2>)L&!x@Ma{zK9ZY4?U2QdZ=cEXVYGJ>sS;<%6!3JzgD*T53G7WImZvJg z$YI_^WV5P=-&S&ogRc9SLP8IPn>%aJn>NU!^{iL_MEb}Yo9jJ<2mwy6$EDITN*2Ik zDccvT)EH)2=B(GDoA`3r0_%iBET^8GrSou>5n4MbQLA<0KCB$Ol|epCI=jNFSQNa& z`Ni_}AO`EYOwb7%+@xd&_02)d1hv{e3WncY5CPo&{0zme1S>`UiGuOGgwOXSB;E>QBXQ&(NENxukx$M- zGGO9Nh!J{-vW@DsxspbuGOI~ODvl9mmh-x?OR0n6*rs(oIvG9guIJ0G2~1IaPQdyT z*7IA-aNg8EU^&KyESqH5{ZW@g5x{kp7M{7b|Js-c)lskQccApTu`|rYSerkC zpa{U44y-j#8U?69_34H+2&?;daFP|P`wzHqZipaDx%qXV*OGw7E};8OHLo-D_u>C`p%)4FE;9YhKPme)1`{qQ=_5+{HRM43oaho!l+^fz<^ z8DmLt+jo$5ktv*C>;OSMv}k#!RqM)n$u(bB*uQz2G1vs_?_G+eLOf$d_>Sa8J z4d7>mqIsiL3l9bslv8Hi1XCmeY81SydubKORMWT2{2pO#dM!3iV^{lc|D00zG*qF^ zf9rdAo~wG8E#Y_Y54k4k1$K3 zOVwkXBrtBez$WOCV2uvHgV`r;oG#p~*Ow+Xx7|hN2c5_$-x}6Q)RZAhxXsbhY9~5q5(IZ7I8>iqhZdnqWFMFSxcF?MEnl51loWWOS_2)>2#(FJ!dAfBKKAh& zvP{A2c)SLzZrMCS6!oCMNQ9m8tOy2Nzr)%H z6Qj!h`YTaaF1Tf%z*ICPf&Vwb#uM3}`g}R;ezfnDms{gQFd-8U#O}ZKDIh2|n;|nM%jMKE z&9G?=XMrg&!;V&qQ_z8y&#XoyS^HLMIHJQ~RK?D~e}G;q{Q_964deGZ=b3Xf-X}Zn zcy4r_L1x)F!@M|wRx2v2g*Z<)UX__IX=U4ZP$72PNxVGDM)dQnUmzDGHM!LmR~ z0a+D3Q7<6kS{pIQQ^!X=$<=FKq27lAM-$a{t^W2!QLi7&gc!(0974DKot?C>7 z8p?8vzGJidK(t;eFb-5CZ)Q`-5~2tUluy1xslDPO34)KXRMu(fb=Xr^&=-%f%)# zsk#M7=Hyx+fIg%p_9sZDVbt_)`%r%Utr%-1>`jcdRq2>Xk3^Ye7!l0`Mooo3 zUli0|>L*UMmhatKVSdP@=n7N@4vvJ8&DA;5CBEk<(=ZI8 zOG^D+uPW=i*+Zi7>bN1%`NtjY;bF2l0?~#VfS~>pIg@HtK;4a2hQHoUisWxY1TfV= zz-t76k4`*OrHcwN+O1`C=LLMl2_}wx$WYw@(P27;dGRTUM5`6Ftt$8X9qo~NR87oH zkyrTimPpt6Y6#MV_XFccHiNmLl`m9x$bzL^72s2(2})f!LahNm*Ij!MOp=y!7phgE5h0s%zk*X{-V+(%NM^u(+ zSuopLiuy1+!oxsqD5}6X0K>{P746r9Z|wUk@LP#5xHF&%`jLAO49;KnQLvUEP1XDl z&TP}iz`U{0u^F>s!tVns^}9r|jURQhG|+e57_`QkF-?DI3Ven2??w#zuN(dZ%{j- z@gN+=gOU4zI`WJ@kI2!PhUWC4s^j6FNy0r=X(7-0hwdR`8ljnNED{INH)v>?G&H7S zVa%RLu$I_%S+P5HUtGn$u&&U-0%!^7P<@)cuQCq%`R&!6XvD5S?XKb?t43iZJdE&z z-F4jWRVG$TvI1+X*660Y4BJs9BWq+}Q5NW?F zK_u8vL!;Bw?F3=Ndqj9BRxHwQ@So~zSi{x>uL-JOrHXteA*6P+Na57cN!XtXa~ z5k=d_Mf(#Be9^ri1q_O(&d-z5j`H! zh=2G?wBi#S!~-0}ytPa{qU}H2HlJbbBhd z_JRLVKg;m=9|ho8LjR+W@Ex=+M~qc-8EHM&@jse}F9l!Md?22F@M#NJzr$fafBlPq z;{tTdmDp~ZP-ukU@nXKCW9JnqPZBw56oG^VKZ!jGGe`Tf@afP_4Rf&(LX=k2!XKcSfhqci$H=E~ z!y*y-bBisVK3qS}fiVd)VjFFZAcnet>p*&tz!wi0Gv;vcSo!VH(-C13w#*Ya^kLsL z7y9de%QT^p*;(#dZ35OA0W51P19~lr{bZ3IL$g5EOw!^ozU%$La_bVk-VAU7Ek5|_ zCz&(#1=Q}`y5^@H;)|kVk%~hK;!`n`<-3bw0~!z9m^@1-X|?Y)niQ~khnbp&2de(A z)u916k^S(?ki@k*AcZ;=YBD~QP>RN^w1~&vyu*X<_=}LhS+<}&^(ZAd%m5&Yy$izz zpvh|^dTKusjHfp}T)knv+PM=;jx|vUWXID(L~D8v$+Z89D2H(U@TuEnrYu3L+H~X? zZ0cSRRH=C%mW8qxrlA^<6Wn;Rnf{c*k* z;(KJBtTzleSYt@Ww{6D1ceLAO9fz_y>$0GN*&g|xLPnfV)K2-)?<_=T^L)qo3hNA` zV0-luu!I|CE;lj;=#32j>lha8Tl{m+O%MJ%wYnpG%^JB7l5Gc3EY)GQ9Sqx+awn18 zr(##$S0Sq1-k(QK!!X&+dE|nvH}pB=Ykb}njU*I_$hgKD74%PlR5i`rhD;|;5< zY7U8RQK{Eq8Hx%3WXgh=%GJu(I(8;E#3SlGK0?EOKy$c6&&7C(zaQIKpQ9h-Caw!1 z`C!2@O!$3rR(zlRY;{Cr_*zspCz9#Pi=uSR_mC-P8QiG74%@3&WR(|eFE_s}_Yc@W zf4~Fi3eB~Ao9e%D2RAAX!q!=g{TN;{g?9Q>4*IZ`4=~;@o;~n4N+U~^jwOyYJ zA*?S%d$>F<7?xRmIhporQq1atrjE`*;bj&B5~E!=LW{uGSueIsH_Kmt6>1{8>3S*M zC0qR&V!NRk`d_xc;WB)UR@i^rAiT?*N_oNhxbcLwr?RV1(q3YO5ITx7*zb~9EwHj%&ao#Kn3vBY(v$4;@0wbT7!EjXJc{>`|mU%R~q+?=>!(w z<}-+bdgw^>Z2dRF=e1eVTMJe3Cv1-2>>)C8TqXwlT22osIw*57w$o#xvAgs(-zkIl zG>rk+&n+|Iu@Lx5Q>G&VV*}=IP(Tw?%iGQafwVk8&N6x(y{it8Y}`@*&X@>WBzpd0 zJV;YInF<|0m<`GD*H34)(1c}MI8;ZY2@qWi)x`BI_r^+3L}+s@s=pBbRz?oh<&k7o zWNLK0l2;Pi27ZzF(cKt7nw}V;o3hjqg1`0zrUun8jHCP)UI3v({m(!7HgIjYC+e^D zub=CG*B=G_O98PL@g1gZqvjBeC!B>5_v^)XI2$I4Ul>n#(wEHIqR!Yr{SbV^_zo+$ zONpKEe^6ASxA%eOh4CW#sf?3v4cH~kw~b&+mX>9u7%1mrI=?|%a`X)SAtuxK_zw4A zjgukV3Xb+N3a#BkFcFR4lwP=kX6fEvTwjL``n(qUlJuSSP;2 zMgjR|U&yI@m+>9eiM1eke1|7BhN2O`0M#CGiXHvGR$Tyf8;ZeYmGW(LbRUJNZ0#No zzB7j+fvw%IN9)wWPmwWce22;Wyp3h*_zq7|CHn8gci4i()Gv$gFo5+9LB(uA?Nd_B zVQEH7VLBhN&=rxrO>M;lNE#%I?;!eMDF0P>Jh<^4`a?db5O~nTYU0>@IR`q}uL8_@ z+88lFtDbMV+?AgSEYz900w(+fZbLmh{M4>|+=c}6c;bc3Q$+!LSZRs+!L+F=6=?8$b8Ic%JVQ zS2MKVNb;_CpMqK`lh@C#ce|oF`h4s?A4{7@gvSGMti7M>CqthKbwVF-Ia|y7J=1v- zYU$^!ZT{zH(*1V3dRiE&4|hQt*{gN4rPurogJD`Ttl8`?8VIo-Z{RckQ#W8#;HILy z4`Ds&gVx9)LhI#be8VhaP|1D_>bq)U+n_fcyar;%suIVvPFwnEM@%f{J{RGTzaDg9 zU9zMuxpEE)0#!Wcs!-QP7|bbPQ#^GQ7PIne^d}g{x~Nau*fQM|eja5?L|Ol<_y`Wc z>+htz4(*NWSyL$A)^K`rHS^QJJKwpJ%Hn4HI)^c;SU=kQ zXo93Kk`X=m$+^n0a}=c)7kpoHK-A7b8S^geR^?W9wpaoF3gJGgk-nB z>3cL6+WE;CkXXdSJ_vv57WFE}ot57l(76`J~JqN+j&1w0pnxDNPu>PFTiGTnJGyj+Df%))~5!GoYjLM z??bf!ui>{ner(O?eKnrrh!S(Y3d)f3z0b+i7Q0m73!rFpU@ZLyno;bQV3C9W8_YVq zE$&9()bk##Y*%@?u!2y?f%ec7 z$c6lm8QQdiz;uoc9>p;aRJ}gHsv8%%hGs~2w}=YC^jy+m?0pH%A&u`CK~XKj)v7Qz zWOAvUrPkAKjb>mT+@St|HlPaCB7$%d)T7U%_%r?haRDkw|v2WautbPir=~6l~z0m|4BrNqr_$ zr*tH3Fwhrj{;_*`wJj4Cs?Xk+_I@=mR;p$ zsL>e?FZGl#*UfN>o#CNqhGLyzoVSEVWRR}hMISmnM{coM=3{V)?n9FMAwg<0&{mk+ zbRW({qG+!yPzrPhYpoG^2y=5ASgV^`*}oyR-75>!Y@PHV>25n|82qjgU+7Kxcb#-U z(OK-IbKIo8k(5NP9AVRJf$AsrW8WBqG_x~=+zcI%L2mbCk1SB#bYdS22X5j@H}MDH zS9@1UQg_mIxy)OalibwPk=kwHhv*v+qnkHrXE*6MBt_tetD&6;Yb@wzouX=6B}>0z zyDr;7zxP+}Xva6WuX3JTgf}34e2B0EAV~2dVL|5%nasJ6P+TGmd3A}-s6!c@@8alWKm>6WL~5>GRL;&b|6wmn0$#` zl#>f18|}}ZgF7M*M81x+MK(nuk#J-~jl6>#;Tq@>4kAj+e{iK= zMIb(28@GaNM5}MaXqOe}#1D96^523IBf>q=-D3ZZ zDmdzEF#_RZntZhPCviVYyP+&jfVN^bPzXu31(LDKR{eU zFr@2$FZ5LEedBB=iftIt*!zP*WinXy$T^R@DOSInpBi z>Dm`|Hi?GO9X+HshA_T3cYi2~lo!q*slmd4kegrvfP1$`{OwX#@kQ=h`LhW#eo_v04bIlQw4KzF-I_S=0I;k)p+ zpzEyGAdN6>qpTWy{XF?+C&_kr<{1wPQbg;C8R97j|QlW~EkCyLCu%^=rbc3|S zq00ewJATJ@xK;MzdtOoqzL#}XJGoWm-3_t$=27%O9K4Cn^Wqccq?H1OwLDmv^m<3% z>vks4#`xcDS_CA!^S}GQ`v&0hmJ_9~jt5m;nAGp>Sn+$aa7wfpDmPDsnH^?A6Ggy1 z$G+*r^NISyCHDvW7P)p8kBa-)QU}-uV&hRUu9w84!qDR;xa$!11U_IKicgs15T>5S z@YC*KIM;{Ct-X<6VY_z(>%?)k_kLhq*V;w>Qa`YRlKO!`UbsGAU7|i;5z{c?@U=PG zbt2!q_PmNR3g5l=&oI_t(CpftcjLR11-tWK=}ZKcFAdspf<5m;=r+b4`LFcDVn617 zfI7jq_wA{Ls=b@`Jn_!YwdWKffPc13hH>`E{han-X_jE3)c!c?2F?K@-{@}=hN|n1 z7hz%xmty}=eG1%6ApaS>>o~1!H6bMc*tkQ$1aSg>h7j#A@(3PzQ}^34IXUCcv)-hC z2wkG!9->`Za8J58v>=9DCbvJ*%0t%_20|BBmWOVrP#0qcEw?U1>`Lu-*q3$4dL5dQ zcA+Zx%4_aXpTVTUaT1K+zVL5q-sN)mjKv%QI2slzwH;h`f;w1Qmt#S>6^}3s)l38> zaMna$b9bM12Lem#zjjMNAw;M{RdhpNas3@X4?WjP2h9LLJ|S z!46cf!4+CHP=7FGm&3q-jh2Fx>H=gLWOi8qCtT#LSwwu}aC7}CtTg74B){x_W=rYr7)6f zL$orR%SyEJ)(u|mX;1wT2K0CR5&A+3C-+CVmSZNAzjZw}i5-80!yuGY6)NJ{B$oRo zimCeRP2vn*n=4a**B{})&)gm3j6Z&&jaT$oh~78x^{2b`M_34H)XL z!ZkL?-OKfpEK?gMBD2}d|H^&Km014$GJk|umZOqCqr9{B=bk;#3?$Ie@v^#AK^vF2ep$UFY5Xt{s?P01Z-A2{+uMNHXY~cxQPbWm;6iC z=`F0{Pj>B`P=zrR$6P&SzKC&lIlu;an5&(d5(eR`=%ern@GG;IkdL#^FkiNTpssVm z3On&yF0vDx6J8RfE2hAQ0ZMdEumDZ!oS^L$T0cZ+OR$mc5B$U|)<*n+=e(gSyod@M z;vGsNk3aCUgrnjoqmGWA;7i4#(6b)JVGNlgZF>r0=G@eWbEf@%5C%e~TB#??5#g~A z7@YS#b`}$sqsSWDZ`A|8mhcy%Q@gFF_$I>Wx$E)=#Fc-zls{CLuc)7(hem{lfWzYI zk;?LxC)OiO)72BMU#;(uzSx-2Vd1d+z>}I)2K{FVuBhrCTpg*3eq~sKVD+`PF5;)(3hm zbn7E}TZ}*QmKcBJV^RGm5w-pnscAt~DuFZrtx>x@JN=u8FV??#Ep1$`4yW;b27K1b zeRN%OSl5nN92wSZ*#Pm7WRoadvz2HTQA%wV@VH7Z^|opl*8MIo{RK*SP%KPXjgahA zKuS^^R{JxQ2`}p%1rd~~&V$?-0VcLJ(D1+U9<9HJ-%`=A$XiMJAGVN4Ln3@R;kPEj zUjsbc5u-njzaA!B$G(i^f5LghJTCpUg#R1xXl=z_bS?NVhX0##Y5MX|`CxX0H7h3$ zoT&v) zs4tS{#wNAJ!?~=dJ#K6eofAfcXUvrKhNping0V+F-7BB8eDi$ohwtHwuzZQ5V=urX z_a^pJSEgT?NcSC>#KZ3=!apIL!K32vFClz|4M%(Tjmn3(ZnE3y$cHMvN1N|}zZSy# zUOZXICPF1jVJFd#l4yqFPiWR^`FTpqmPf1bX3G}Z0}X4&Or2~xekfZGo-feJ8d{4V z_4!LAu5x4x>NQSSs)yqMPznctEj9YgmX=$~VNZv@{3fgiH`Tn0t<2=|MB_Qei$~RX zf_)S5&p--^Z~-RB&N?Jyfu+u4-`U`#hG zDnm^;^IyCeQZ|3bNszDx$BUt_G&o)iMKm~G42=}9@0mWy#ZV3Hz_u8=?^SZUZ_Fvl z#E?6lbTN)7a=;%8Bl(X0!|ukSl0|Kp6c~vHnq+@T0&fy(<40NBVENV*_dw+Oa ze%-Mb1a)Db^3Wy^s%B(q;9WXtGw;+fU)1#Mq<+|hj ze?{NzHJ2P8ukQv$S%}ehE1qQ+@2$T3M^rzmG5yc=-LGQw#a-#U-DJJ?AJBKF(9S^X zyE8xioWA>)C8S!LIslrOSMR+TWFOV&86REIuw?q~4w!S2>ARm0erw{mSps;naqt4+ zN%Y~g2X{60sV(8- zW~0wEIDR(zT!Z6hqc1c#el|Ksz`hC61dr2sabqHv%5cNR-PL5q@{#d=Mb~H;L)<1fH1w5W@FO zgr^domIx0+w1qn-!j}_nC6@ad;eShn(|#4cB@u2CJ}nV`E#cc3OwhG9$ojWy{?EyS zQ`je#&(Py!7xKW?H{%z{w!RrJ4>sx%87~huX>hzexIn-@|B1=v!75tdY z?Yc5!qCEIX7ZWcJT7@ZnlXG?_55AH_KPwNW(72Q!4>oaG7?lTe{6lurb9m?2ESY2PnG-vfPJup^IB)iY78rRq z5#EdNB=*~`fQLII^4$)2HH7;o+Ce@c{QJalu!QgpiFjTh{MN+u_Yuz6`EmR{k?>c5 z$2;F?|450=sl%`!NZBC6Tm>h~eUBj}GhRGId@cV>`K=H79LMc>tB!uAj%#A8-1Dg& z?(9$_+J4$(Kp$3}$hO)avahVpeBC*9VZ9CK08U4^;G_T3NMrd9JyJeYEh@^zu|*xy z6TgKh3}+XL4Ewi2ewj5ct|w9H`7fADu4xH!GeA=7i?Z!UYIpV{w?O$HLW_#8rx`3{ zPE)S3HbTKVjVH}c29)W}V`$c74tg`#sB_%QpHT35{Ip2<#ET3xHOiwIY}P3k>y+#H z(-N$3zPAL2Ige&=3qK-OrA|}nd}s+)MIT4ok1bM7DWfGw{n~z<=6+|TY~al3<1+U< zt73mw(MLIC1~4j_hNjvHs43Wwl!Eez_?Z-OsGSYLQ8v;OKOz}hf?T*rQt7u~t@Dby zJCEqSLtYm~_(~XImaM~2HrR;&f%bSR#Q#tbwI%+CN9t4dBQ-90)TK~8lUMYD^N3PD zdr?ZsJ`PpZ90=w+84U>MU`W{;tG6)`*1C7o+(*Zmh3Zh~R*}yjVJevh(%+|6KSxyB z^6OJ?@(mO8%}^2}uVWn{%QYwMslZ6rrb|RVx2hi>Myfk)+<$7u%cSV=#C#t02c~Nx z{a$>CZ&x$HFyG@fqQM{h1}-y6yWtcbr^ailVJ@pVub=;wj)=xDFbQ&FmZUA}xDOI6 zNY@Tcj{VNSIaPYsph|gcWb*r0Z=t0G1w>w;m+aFKT-bEli*I0Hk9%s*&TIF43<&74 z_H*a8xu5LBFU=GVVD#JR;77wO#qp$ru@6d?_FCh!_->u>Fq2!e>i8xBn}W6SsK=%_ zK+Sm`)!;X47Ka(eR)tQ&0i}JUrbd(G>LfWjNuishHku?&CrQysGTkIYqe<3-`B0Ed zKB3?izDZq9iYA$3Uz)qaWQz%}~4p zndB)XiPZ~l#P{%9_I$$g1K~+{Y1DW~e%1LAVBjX%ZQ$kIpEvOM2bw=LiADrx0E{zr z04q<^fJ7`A~N0f)4F@PJgan>PSb+W&&*O}ydF%IJ+-u$7G;0w{Cd?#lTxgGpn zE-y#sCHxl3KYY2=P7QoOA|ciP4I&EQ&H&4KHXD4M25(tLaGUCGgJu69l)py6+m+7- zmoPQ1g26z@pN(%66yf`I0lnlKZ-UBy1fSG$8{QT0ymqzEY*fp7{$Am@Hgz3VPPl>w zN2hYs2C;3*CmymH=6=dmZ+Sm$P^Y<{`luJ8pID6}-A{$;?&v2rs1& z%s{np`%4bmg3Av4^+%?mSpf9Gk>Yi{Vg%0yp8w&~&$)O$r=xyGe5CpVz${Etf#-MF zI9^8qw?KdWq4G8oel?6lCR=efUWxdDXXgKoeQcKzwx5aXV>|~C6vuosZyQ`j+Z#EK z1+Z537h_-$dwu4B&ger=O5V6&hrEo18gtNqgtQfN(8MV8_1{nA8B1VPCqwGXt5dSd zb|H4D>HtDI9OGn}0(I#1)T8Z7jfi9-Ad%nL`X`Q}#)otFsa8m19n=i2XX{ZHnb}0z zERateBk}ihJSkt^$exDu(VGVDw4rqZU6fvih=@KlUZ8TF#X|U$wgGenL2&IsFCwy= zvt8o3&!Rq?64{RViE)as6Y7@f$b_34D)Gg@{Xk&(8PM^`hSn2o!<}-`3hzbHNf7f# zb(LxM4GocNG8o1<0u!PdAoUu8Tckp_x>w2!LliMaAw&F!F=^^RY89dUJNxKjhVXI% zBraqPLizjW6D-NIR3Cifr6_P}MikF}GkFe~9#lZMMsH33OO#lgaV0qg1yu+k^a#|4 zP^q_D%MyX|m?J)Au}n9^vGR!xTz?M)^G;cKqE5-^cIM+=x-q;+DF1A!daF8{G)+pl z)z2iW(u*Lp+FuIaE#cPEWE;vKaf&9~q2I?4?)^V_2-l7aAiRXTH-T_hLBk=3CL!FB z((&mtykg!@_=Ou{{WHwZTqSFyl;my~V?!LH=;TPVK`mDUH2Rd-S}Db*g4^+)gF@>D8Hx8)nDKeRu8*9hP_S@MZgyY?k7^V*jG%4MJ@`-dS zxD#|c2{K~Wbo&>z`zYOdpxUxhZdFf{qDlGfq@;qQ3yM{jN!h!lTkn@yV*blA99vb* zw=r}(5vr`qZ^QA;OE+F67|U-hGRG&S+gR!Mczzot(4=%5B%esP)G46bW{8Mg)9q?1 zo>97${+`ulumC0YtfX}Nw+zPk8oduXtKUo6yQSNYR9`~*<77a#s?%_FtY@5VJJCb8 zBY5$wXPiz>pxf=VyC;`!#nSKbwLDRvN$GZ=d?MYJ+yS~hNddxpIB_XsbPkz^Nrz_} zz9he4hDulWBQd|HV2*L_dGV=5@}2VqKCNfHgHG0`;?b z2s(bLT-4ViB+lx*Tt#)6!zF-JXL0#WjuL{b9vI-pI$S9g`4| zJE?8~w=mT{NCn!+-mcInk)ZyD)mY<%`DfR4nMUrj3yPNVH(g3(IxDh1@?e-}z9Y9s zUX5%HU&_b&@CEo0Ppe2BF5_4gzJc!n{$T=CiRxQ_Vh242Qo^CO=deQ8;Ctj>;lr4= zK&K54=7)3mArwBrhMfl(GhJ!_{?-1Sj9+iWGxxq7@yl)^7r<^{s0Jxqj>;a(K_Twh z5{zA~y_K!@J#_%qUM&q=Yw|zTv@A6Hc|Lj0yO$vP6mL$1sUeiHb3T(%N|+z0A#JQ6 zmS^qi#t;#X1>Eha0kCo)$5Q4H1VH|>tcZE5El{X#PX6txATfU@o!|22e?}VTFaBvc^-(?g?eQ6oUuqst3=Ho9uRNP)8)<+58YfS15FndW;zL363Qg zaAoE{rvW(vZja z@W8ywl)W_c@0~Ohv?KID4Xw7*BAy4KJ5d*XWoUHEJvi)%Qn@}$y>)Y_>i4)+iO+^=OoZD)Luw7As|VO76oLyB;#1MB3Z!DzBZhWi=)zRP)ry#7^dSFNIzL+e6bZVw>=wkj}t) zu9v7+hj3?hOHmd+r7SASVI)IT22!A?kf5f~pdW$)VZQM#Y|kd#AlxyR&g4rgl^Mr()KA&6 zIN!kL1WW{@nhQljAMJjbl|ouOoF)S9sg8f&(Y{E6ucb6q;VYY%ixLnL4f1ckx`bLt zsK{6Z8i7!mNCIQS91)<-?gis3S-!8*88ecGaVD(94~n`1Qm6umaHW^Ng~2yd6JHBa zlN00j)$p=x24@f{qpfj=1ZKhCqTxn|S|v9j^TO&*{aS7z(J*&_C%%M9NH+vu;1@>< zxggjH4ey%W>%Vmt#z**iOfYf#NCkl7K5iYo;!1KeOhnaKoQoiA#hu*h9O3cVEJ~Zm zU%nSI$?EwNq!9YG4)B1)2R0kD3~Xp*QdvO%4te!QYxXcg%?2%R8>-wi+x`(vldIEc z+1^m-rdi=hlcv+8@F&!e>85$slV&|AhO$=kC)7X|()Ib9Ck@xLwK#cV>HiKJ^B77-ovlrk2`=#QMuUNhwmV4 z_;GxVEQL*unYP@AOm`8oIkHi1OBYM7UBn80rG9{<;ku+)pFFW=ZM8|3ZO(b*?N8G2F z;tWKi^~Rr#3oQ%5Y(U~{Nx`VIMNQnbhXB{2RfrGdhL_#?BSgKuBNkkcE89hOp$N^= zrvAcm!O}Nlolkp~PwL_lw^0yvN7$iGN4+&O-Iv_(X;^iBiMGmk@6#HXcw< zNO5dczXM$a@qn5*41X@35H5$>juvC1W0hfkgKLVouV!Uj@o&NO7&t}UVB@Lh?FoqT zb=bckPVw7VkE-FfjsnaG4ax54KleQ&G$_-5?tFkJPbS!0jo5}zmY@Wz@SnRBFU3fA z;ygScHtApYsU8TeU{I#SRP+yDywyJ}ZL7a4{-qD+Xb zAXc4!(hW3P2r#IMApA);(jCxfg79Z}VJ6zkMt4PE(O@$a8)>gxY~nO6+TQr~x#Ml8 z)(XagdmX0*Sq?1~c8-b2bT2eNa{4sP>4-NZQvu@_6-rXc^#zp(*<(XaCt^{hov#Y{ z-0^_>DZg_DROj&9&=aGT#l9T)|2}-zyPk5;MLmHu7+@p9>A=VRwSd{K-88;~G@7`P zO_Xk1kB5MXcnJBMJ9A#mczio_8Ys9M)XSWI*kgZVS2cc*e&elZv|bz5bUnx2FE^`m zBTnWs4C#l!_vp~K++gDPU;;ejX9>O^_P(9&^COY& zV446izeB!(T3BMK5{@XSrC36&<@MEf1(~A8FhVq1v_Ovol990Ao9plZ8;79I`D~Ow zXC44$*;(L(&+w0LS7zscCD!BHTtM(oo)_X7|Awtc3SWs-=Yj>__{aBr4Ld}m{O5jz zfA8bpTS&JW|CZt3Vx6a}CIwjRPPt(o4|-<+5B1pwh^C4yRM>0{Sl6VfS`ot-;%Esa z;o_UwnDSbqU`_R5dCfA;P>GHmkiBE7jM3BT&;vDJar?=tRa(oeP-Us@WvPf1xLK9d z0mZ}x>{^dHCj8Nvu`glEkmN4O(kV{HhbiqMY5u zuaf&7JJha+98Y}@d<#dnkgvybJcW4kNhvntQ^-VSX%-G6IR3>0C?|Rw(Sbg603YoOP(?= z%8JwD5eB7Ay+e|TnBi7_N+Y)f!AN=&>IJNRaTlCdoJ9G7<&&tV#+N^MZ^}P2ru;gr z&OPPlN%>yu6ZjSJ`hAN*Q4shVv{Acq2otS+XV2(-7#qIQm9K1gXB3?1clQEaXI6Nd zkN*F^_-p_Fj=y$1%q#z;_-l8-E+j?$`tjH7NnhW$w?pKp#MijsMiD*gobmY8(+8Y> zqZ-NSgkv~;AVw+be_YQv_w8kF#)$j{@!V=T7w$Tq+Y=M`1ofgzU@&ww`3`d8d)9Dn-fep>BLd4;#g$Wh zd-_h^)Al?JJ6TM7YB&C}_N*oecilhx{%m{hAp*;H?+;1ZbHyaPJ-dldw~B@_nYI|8 zE&yzS-0SuxDW0+{@!-l0NnOn z4s34wtN~g3iN&&EK=+z`zL}5p2L>Dl9dC0>58jjsV?4vGQxy)4&oQj)bE}Kwa=%A7 zOt88|e8v-v;38Xwk$LDz)0KZCXP`Ndgf9s0m46 zw{9R3L@X#Q$%dpR*_hoxP^_^5VY{yK)K>e`zS7p$+G<;^K1&q^QGiT16Ip@p_Wp-wdoa1f3Fc+&n?a8U< zMHGR9Dsv(sU*TJkb>7&tZf|@}x3BOqZ}f0)d>TqC$&DO?t8@ILA#lFz9sQ*FJk|)l z=$P!TABvoL34p20^~RUtO2juJ!@Z;5FgI`&!N~SkP(WpFR}|}g$i3zhH03UUdQrVo z7rU8JendGZe{AQ+eV2rBaOcPUekrqdn4wlZqwqev z!yubOqhkye}$kAQ*vXxP3?OyZjl`z2{PkS_4`J&bu`LT9NP{=^fkGmhr2z{Sj6}W!t^W*Yl z8CLMSYp@D9nS%*PeHLTW%mE;dL%rnuxFKAt>qEUdvS8)skawOR*Zv5Uwdzo>k?)~M zrIL1@9~VH1bobe<6a~2J{;{bmP$QPW6$umhSRLg!;_G;c%6N4jS!3GsY>3is<7$yB97&Lx6)+=f`d16caDly#}OKph>M6{K32rH0U5T zIX~`)90H2e3d)bBLkZS5J8bGI$U`aA*=#~wy8G-3MCIV3r#D2*a?#UH9p#{>2N{Kd zup$KZJV|uia_V>l?*wE$aA+SH_hX&-7aXi0)m(az*!S68-n+s^MD;#0ZZ2X|9vKJu z6V#Vy>AS?SV6D<7z_CC!>L?F?QBaAfI9w{t*!l(tl3Of zPPn$@_AQ9ReZoa;FJIRAEGiW}NAkCa+B!Gko8vrp(K8>){TmmNr71H#`L*-Dy=_$c zB<y!CZ{2Q{7wA;R51&?7+S1U*8> z1E>Lo$R-%5rFcgVOlJ{DBik=x>+s}_k2suyk@Pipf+pq{w(0#1(w*&lYRwj@5Xwp1 z|G?aGgCGZKk@+jdfn%h&=w5&P5)d2rpeRCx>?XqD=is-oe=R4O((EESzT=8h zxP-?f+G8WD$j>|EmOezF-krGSZ!MoXWXFh#R9E?JWHc`xjAhJ!lg)t4hD!)(zrtmL zHy{vKkQ>+GXb+qqd1paMPTjzMgPA=d1ki`e{>y%ky8Rrs0b~-Qf z`K*e&5sNV8>xj4yg^^_J-3cJ#>Jmgr`!eGF@v4brd%tR?7`m16NPOfLc=-eCn2BHV z$JVv6Qb9M6Y~BISXmk{CSKNdBiNvq%Z1xgSiNelDVI6H8p$i8S2U}_#>Qu-fB(gtn zFn}d)f;!DEMl7xLXTMQOddVBRm)P(Xeu%hL%n{2dlJ#;bCRC$~JXK`Gy=D!I#_c43 z;18OnVYMqcO;ytMCw|}Npm@mB)^(Q{deboU<}CC^w|NIWVEzvN%`mLYOS;b!_5poH zbNimT{@7x5eOrqR&-u{6)6DLpo*KUY@e8xMCa8TrJ~;0~f8Ar=%4sf!j{q`D*sBoi zb%?gEUR!YzN-K}?LST%2Xsh3q_2HCk@%J!CQ;+xmK z8|EAEG*<45ld;*t&kUI>(KVPZhR`!R9yXgMYOvZF}sQF)csW&9G{5IHLI?mLCwadNy5 zj8*2Tqjn)_*P{u0w5A_9AU*mx*QwaQ1q*{WcKt36zsYlO+WRy__~Prcg+bu*x+@?( z_+Yx33k;jfC`!Z&Ub|5`#yqZ8ZD-1tLNdA_YZlAan!=pOH!zCw|Hgs%9K*Z~v zj2MQ9V%k3tU6xt4uefb}_8Pnyks-zH4`umdr$nF2Mz1wsk^E}riks1la`0=gkiF)+ zO8hiu))SKD*`vy$=(xY4@4zq2P6{cQ9&jDzJDDp!!=}Iy23yM7P&xo#eFS+9u2r_9y zW=+1^y$6QN$n)64DJ_VdW{$yJ z$>IK=*mT>qy=IM2xA}xxFw@EE{W^kRch=2Al>q%B{K&0d>1MZMvD8K|2(9$WBTG2Y zOS30xGQkYH7o$Q>h)BqLR?&KY(q6L*D;-|mx)7A{<->(CX!3k3!a8PW*RrD*viH6# zxQENLFFs9Ixd2s~_u$7Hhs6^1P0YHmev0S)@N9Dp)}biXhbFMd6S-Rk)LMkNXEPXw z{Wy$^4Hs@atax2JTI7$uj@eq7d`{J_u|>Z2jx0ZJLd5YYm&e%^$lw#?g1WVt< zXaK&f3Z8kS1v5lYmAl?`7`5cdqslSko#=;LH44t7)3OHPF44$vJchCcWv;l2@Gun( znel==!4HPb?QJZsLVVOI0u}c>(fJsrYxL(temPt!!bF&H9R_iSKKeiDdJA6^V_T?? zj2_(>E%V?nr*njCiCTezNM6_Sj{J?D_>$3bq-G8*Co!dV*2XClbYO znJx696LRz1jb<@(W2^V(u9t0Ur2qp^3-`ACwDT;$jh)r_ens!^nJcJUGd}=z%GnXD z2oSxBcQ)j0X^?n@eGA>IZo;O0*m1rCZE+ANGJf(jrLp>KkL_XP6!5&na%n6FJpjUe zjRZWAKSgG-kd?j*yP8rn@4|-r^58*6Y4k#H;;JI}6VX`@-2_;~`RLZ&tgZQ3e3{Fl zEk`6Awy+wnN&ZN38Fs5m*M0*-{DYv&q_&4r(=#Yi2xTyu^Trc+!vPFTsAWZux$+GP z8yWwJl-9iEi<*{8F(lJcE&x=QqYGpw<4+(vCZ=!DPvX++B~Yjl%~w&rvvS$eTrD%= z>qgO6?lxR@8$ zt0gbB-8h&pZw(f~JeE2FPtKt|6(~-wdhdk3TMj~j$p2;YDfUfz{rC|W>V50Sua^Z? z#tpI#Nz#vBD6>6AXVU1E9xw9%OlT76^Vaz=*qypRd;0l;pn08Vpx^}Wm3=_5jOa^f zwp{sCY8bemj;txI|Cg*yH;_VzP4m};lujm_&8gB0AlRMeNmLq$e%|4o^MLf>Uh{u2 zl_p?7d42d#%s}xj|A|+>#gfbDQZI;qO0_j{U)87f=YMbe^KH-|{fq3+$3XV`Ut@nB z2ClB}cZgElQujMN$Kikhw**ogWj;v+>w)DFcLC!ui_XD-RO?RgztJzc{M`_<8$yBN zh|??JRWuh9ixyIkYCr+8jH9VQz|~FO_$69E9c;e9vc>SQ6LZQaa0JdRxe~&i2GdWD zIfIOV>z}QFS=K)&?3Z9`)CSo+IAd|z`r{&6W?aPtN%b$X>hD$gPSh>+&+Gg%6^{1t zg7l9;&6fTBhFvW6!0#XH<{}_He;*BzrEmWJdlmruC)PK;?A0-mw+F)CU&lP~XE(bdmSIvZNVdP<%h}Fa!jx$;Dbr+9Ci9hf5@%f7p8G?TX4`XN zkyV$SQIJwcU!PNn#j-N!V*XY4iM>tRQ|yu=>#{G`eHrfiE#8CfCqWX(FVN@Oj;wV_pwR=j*Lnc5(_XuF0hdxA*L`1)u;UNTUOQCST8Fs-p>SZ@YiG%d zV6%A~R_)|@-(^1@xV?5B#E@ir?UN8)K0bTxU(aKM_L@IgjMZzsEGRac4ed+lslRoBCM8Xq~d8WeldZ*Iq!*n8sfF4OPNsx<@A4YoDXciusYH_jTXb zL)(!+D{gjS1~kj&AY)2ID753Ab^bbZLgh0oe^-5 z%3k|Vb(2z8@!G z=w{yi==~RAUo76|bsmqY#cAJwKUCfy;q?8R8<-zL*vY@)${lxJdpm~W0W#e5VLHr` zFlu@?bq}V~$#LF$pabDQ+;6&L>Dk1`ZGwVL-a&u%MnB_?o&}x7g}A|2=_-BDYqE4N zl<%Y8_7?7gk2MeZdBuE57K_N%36l!5QB}FwJbJbZTF7gO{UcZ>9@_Kw?jVaxZNEJn zGikE@HopM_`Ga{$_S=EjOK(6cd)rGt3%qiF!SyCF7F)HC!RQ@={K9SF8eqa7&&GJ* zUZM6WZx|6T`!D)7DS&1Nl0fWQ$&D3xZ2T+USXR$9^bhgI#FFSAw96Zl(^rqyju&dn z>gNRcYJFhcYs#pE!me{G#w2VO&}WIYi`EL!?E;bxshIjc^z%;akGLH*_Q)Qkymx2; z*xB=VIS7G(`C_+avt7Qz*CJ>5qik>*f(-m=5-sjCPB+#*e56L#Zb9I zp%i-v#_ynm;0W*K+ipM`%_blEkrqMPo#G?!c?+1PwLIR8I)|FYa*icFJI5b7R`u_Q zeR&(Hj6bsdo-3iM9|j13d-T72=bn=x`#9*ZyLio9>BF{#3^0pzV^>XSb~m+xeDr5` zC-yhm<*VE|$j$zUwb8W0%zKdQt(we6fA(8a%pSEbjke`Iq%DMK2Y2i^k|ZRMr1G<@ z-FPUaO=a5)%=Jp|ZqH3(nrge5K|k$r;eQD5zcF$=PT>RLzQyzmE9F5TAs<`Aol_>3@cD^m&-} z2$s$mn;aDi&!gGg{~y)Fez@xGEn-5^KsqqZ`wpZ6me4#r;;Q^ep(HF zM?!($(Y{syBfRbF>__caq80mbNpCxuz*A)-QX<1sR)%Q%EsTkZ7YyX$t2a`tzHvJv z#Ybl!hfTDdc);hZ4gCB$IL}P`6Q7iGj44GZkC+{j^V*FJ9H&FaGX7ikqTRR)AGWo3 z<984g^SKlZV;Me?#z#)x$GYGoj#Dp@0MGMj%4^0ME2Y`o`~ZQdG<%_WkC^%3StO>b z-B=)-)3w~UP*RDtGMh_IoU_pZK;t8K?@e9yKa$G6fMrMFfCHo0ZgZa&_#DOlnf)Bg zm_tm&N8T{NVu!kl{bBE7m#AWQ-!H|Um8MuZr^JDY+j-EP4eiw4#eP{8yN=x&A2}#Z zv2P_I;XGHdT@>{p^*WHSeXbzkh;35rowy7%Rlmu6=79DvSFzXiF7_f-?6)>cu?=a8 z-IoOItvt2PM#Aa6i#<*id&vV*?AOv13$HsDmCbe)`?9Fahy>e1YV)~3!sT1YK$KZt z3|wFa;uH1#bMO@_iC>FmP-nCaT&tKjmhlu@8oP5Xi9LSr8V0iFl<{U>L%31Ik<+=x z*ljLCQC)X--O=^iu3vZE+V#t>U(hDD&gpGP`5J09OP8=A7e#UuP%W||syKL_+KA-YU z;r~RQ%j=0v^%RzPiZZY1=-Q#?RchTz;Y@fVSI%%7fSPQ}D2*wXJaM%!5KBJZuI1y* zRga)@$i=VY=vjIdLtHM7KIWGHpxk!Lf0U7DfC>MgjhRRPk9X61gUeRDn7J~JceLyn z?_^lrZ^4W0KM^C-zEjc<4maI0D1zDM^8olTU~9LW=ml5Q7>xgvg~yv-2q_h{*dpFe zdP4V{EQ|*IDAvuLrK=YXGq0~?o7E+L8Rid33+-DfL@KxBaR76K0CNfEUI_M>zyO}k6cicdG~7xe8b+VWo8Z2X@Ds29WBRzoBO2lOR|dLHG(SNLUK$E zhWBLE5-wf~w>85@KrDv85kPGJE354GDf>V;A0i(J2a77K;|g8@rOEo?N$%lj-&0}U z53;7W4E-?BUQ!}1P>4-2%`K2IKwSq%8&8st1C5!&dSJ+ZnYv_iE!P*CPRuYB5H^jp zuqQ1Vk$#C6lmZ+M{4WTQk<-zF({J04rxjG zcc`p7k0Y&Fa`2wrs=i+q6Dg4b)c2x}`hi5XOtng(x0#gkBbK7>-qrpj3X5{ev!u9$ zDSih5(5~l4y3k@(=y6t|8CIcQX1NSm0Ks>3;t@%S54RG3k%?!i#Pf9G-9>Cci(T?i zEAeYkPj!AxC7!Gk-;*xzJ6&_v@jhJlm_=}Eu5>a|R1MVVoQv05T z7VC*k!9u?$a|I_bu&=y#RyWi$U`PsRgb>M0YHuBBb z_+8et6M@)E3))J-^T@*~-bP>d#!H69CUs>}ZxP+@jrp>0-h1Te!eyTDUcA9|@{cWV z;9MPOTDC_rCbxRR$8nuLOg10V9U8o9Gh|dUry?jJa}ZIqx^|fP5Z6->{!kvBu>JxP z0L~UF-mm#a2`0>umqHfox>e=p%)iyV)}8e_W(8Ht``&dll`0^1eiWttHHfk z4L(c02wKP!5*>`iAcz2tI^JT^2H#P;UL4|*j>p)Rz2=h;nN+Voi)x*{{v*yUR*!?~ z(eU@m6=a72GUZ=H(gfpI(~Z@e5S|UhHGzQwpv)Crc!#pYTYVv6-fK^L>oACI7azbXAY3;p{D z`?nJPy952}^@K;VYe#wMcF01Sj+>Y0lngYXDh(T}m;3trlSe!o^a$IkjoW<@XDv5+OI;z<#gqlT_0llXy+ zX3=kDuAr_8V+!L2!|Dl{t+BFy96hqoEb{h?-@e92G?XhF(ey5 zesBlp;POUaP-Cmh=BSqg9_QF9o-C~b!GWV%9xFGItN`@Q7g+XlJ*)=M-?^p8+xK`n zfc{?e>yNa*uN9BTM1SWv`}+rAKn}inJ-ffp{@!|9@BR)j7f@HH6-`!u7ozZi_xFut zyy)*UlKOkC-QPG)t%h1>Fa-xURfmrWI~_INVy9ODBxje;D3pe|yZo0NrX2s!yRA8p z@tr#b89%cAzUID-qPD;D)>|v*)XLu@+_) zn^%jnh2{|l&gPxdsKw^5k@^Y-|3;I+=X=XXXQ$@x6?*=J&X=1Y)%^K09zYHLZY|~> zCAYKq`_D`GlIVYuLtp)0&;VwX%-=6!F804jv5x*n;dcMqNJ}q2|B@^h6ma13^9If^ zu8pS8f(0vTxE9bksiCq!+6W;gjr{yma&I)}SE9!fQR`|Qbv>di`7g2GF8aPYUmb_@ zpzF-92s&g-DbsUa#rCrJovZor9FbNse(-yAZtSQD>)6M)DciK@&oTE#=goyjKh)4| z$iRPyX<{jf-KX5rsSXhy`3ICBs_ntx#4uo2P!CbfqmU!FNz6-y&>QQYrRr#qu;XlMuE5m&(K?(g zv?9ArUWuvM*ouZ$E@Xr`cOw1ou|x!tN51yD&@=n@V-Fsk|4p zd>o1k>NGM?q}o^NK@Gsda`t4rlA)1owHpN*)HYq`d4PgN=_YWec`N2U@vNiIh(5(oLGfyT%8r4Uwi@X zjPfdN^sxXJh&8{=m9^CvXtHgE^gCD#`=i(*d@Cu%ACn7Xi)l19$_qb;e8U$zlcalm z`}UrFnVY6(l@{)5aqa)XG7Vd(hIKvcRe2Sm|5%EB*IY%J6ZJ39!r=9AnCJ{+Apx1B z>w7jtz#J-h!mLHMuD>XGHsL=h2E&Y-AsG8(zaW_2*pFoeV~=NF;WJ)!sbR#cJQ1Lu zR(=S5_>bN*3)rIDntL_AI`Y|XBUk?yhC{R? zmTz7mv#tza!Xb+^rGInjBlJ`}1#>R+5w8f&hEk)-jj2$ew(X+OIyvLmTj*Z+S9~|8 z2xCpJ_v}YMVNJf@m%2v&Jh8_5tk(ZI^%DoOzWVC!g#1NiY9)kHd;a~pNRIaWdlFaq z?)kT8N9WhrD_l_nl}7=vZgGyWUqTB_6zSMi*F7b4c2 zha~}xOi&a)0}U7uitUV~GxLt8VX2#3@GGHW9y^e^vIeD^eZgNY>VsXne8AIO>^H|I-IuT|yCgMLl@+<$Dk3)KaN+V;_ z4^P02PQnNUh$M?V-w z&ziNUjD36qQut0*lMKx#=;+KVz9LF!we6QTG>N)^+}<0vuHl6CkNzQWJ&2Ed{(Pcx zr=tm+uc?gUKQ_D-&kWlb>KjjxWVIs+>o70j#TMu+X_f5fH%FbMIzV7xR_TBjCNZ{P z^H0fiu)iLxi~D#h{5aYQyH$v+GxYy>l^SCtv%nM+juAM3h1FrG8-9*_A?%J4ABqu&tl_CtDN6*nV^{+!FhKi)Ne zrxN`A4wazYN?^G#Iw}|1n5Z$uyr0jO!pHtd<(+Qj1ydl^T>U6%<6ZN|oY!InyL1&E zBtu_)7N`X%suOlXPO%8b#*JTN8S54PY~%;Iu#Oef{8j<5jiWd| za?wMoWUMs6#HbyPH^0fkZwCg=pP+DZM47Hib+P>7oea(h^=+0av=H~R5@i<&YZ#?= z6yL>fBwPsGxbDe}NYkJ`B)5@C@29y0X=LnI$PIXjE^mA)1Zds&aa?Qy!pRg7*}R!U z5YCrSLaomprqg0eHCB%+r1{*#tJAhR)5_pNxwtx0(vnX7vY+&9Np_b|J>k!T@RM$Q zt=a<9L+5>PKGJqY?x4ONK26}eWGIwBIjbMV)iTgI3Zjs?k5Xl9s1pA`CuYj@4Q!HBi3V11i3K2Q$+)9iIu}x65{Fh4 zBOMFz&c1joUqRo6xm;|>XlWO;|C+L3*+3EMbf95KDPWJhpNSWXAhsDT|1DqVN-Zg} zJq&y!TjzNyedpOaA^EHLMF5(@y_qX`QI~l$5_g`7rzCx^b-yt^PI35p2T2QaD5=TZ zC&O&FX@XtQ!*mV4l}}bjDP*pg4UWsxS8~WMIe`42%(Y08_o|RA8Rss%ipHXr^9yZbua=Y&jDybogyv4V#=>XqXCs5JxDw+pR9UjXI^QrTvP zpJQh=VS+_Kvy~hXBo)sU?&hfYNlb&}BOF?);t{sJ`~dX*xztzSN9up`S=JBzBsKlF z5Eb$3vfBhD1Oh5v%oTXW!&1`M`}e;k+Ph{g@eYhc zY~+__M??v{-2BFuk^u23K;BDG=Rw+|<`N$K2t1Vzcq$euILz0^Ce{5Tj?GxX1z=2i zWZ3J7f#V;g%NZk5@82MW%D99Kv=L~aB&o-z<@dKvW;zGq;eZiBVI&5^L52@-1za$m<9L;0VGeQ)axm=QdfH*J0->!*UZZ$x|!Cjj++ zAH=ZEH6qh0yCCy*bG}vIGx&XO;{Dg0X-x4`Q1x7kcW>hT6n@``Ib7!-3DkE^YGFWz;NMQ{ygRf$8k2@mT55WTXw!v4S*x{>#tIE|6f?O~~Gb9WYzFo=cj) zl(ir0zI6V}Cv(z<_O%cH<+;aOO4Ty}f>Wvb;g^wF6blX$+IbulXk!3sL+CRyF8{vc zd^I=P1?(?k^YOR>0bJi#wc$5$o&w+($g!(9#r+n)K~=8v8OpyvfXY5S zpJ89#BffX{;d~JdZQ2X?7j|=h_CRGmapIxqvw1vs8nRXPf=E4{8@H>>_>9g z>y>WPa~)>6gE+rn;>lz=f5XJm0tzjw;9&*O3dcumB?mC;PQ>Rv&u@QMmdY93kgI#` z_y1E4a#LI0k-XU-8kjN<{&JKGvNI2);yS;e0!;m2+EYt#(zoY_p8nc%l4?&*s`k83 zWrx=O_iB=AkGYr&c}u_B`Pb1@ziWO<{{I2iEh4$9ZaeR4Hgjo~a^7CW>x{vb-v?J# zG1I%vZ3>_>uVG5}5kzNby=dR(5RJ0x=Xpe40MrM5mT?m4v%iP3fLO*bOya%z`)^;z zw*mEcG4uzVkIuUa=M9P*+y~aN3I6zhwGs{OJp0bVNGHi#Vt|pm6bPsMhhSuf#Iws+ zGGC<7#&`PjnRZZNnMHg|B#9>IWjh+b(MkUz&|bO`t=b1F=K34fud*EyilFqaD8Mqh ze<=8X&h64R1*kw{Zl^9KUbY&U*zL^B1r>G5%%tZ@3m$8OR9&i{ZA2m0uRk9E|J0UvCC z5=tz5nAuR8&qD&@45iuh4)tQqaQvK> zdFso}U%^9T)|;i7S<{9TXP#;{AA^YRj9|o^VTgDyJj|L;Dr?Gk(HxxGk!1RCeB7M* zU2foD;>(8R{f%M4sg)`sG=#4wbEWHtgYY&ZOTFQ7&hR&j zGw1)AKacTeXK7~6A90r)iaGC(Z{iv`M9$rW$UiaWPx|fDr|@?6_RLie0g$rHQ~$K& z3n(k&x>4yO-q-#n-|^W1Ii@8g0)`_pEY##-mH{<$5QIZwZt zx!|!kGtYl6Gv|d&cr@nx6%qV+{!^Jboq%FrEP~zX6WVcV;4y!b@h(HpCot(E@sV&VTvM%(=LD^1K)E2k4I(nwhf|b<8&j z*hWOYsy@tp2_L5q0U*fGfsF5~`14?NIA%H;H+MfGPCpiCmBs=U86pR)~Ycj4z;eZ1uLuXwfoI5%t8|A?Z(0otyihRYj zfx|k#1=L`jfsf0x{an!IdZWv;bI{Saq|=M&>g-bdVt*c^O0%cn1zI4!%+Jm)%^V%c z27E~CVHCX1@N&FW*Huy%i_6Sn@z7@HA{j0)^fEY!KZ@V0LJ{dwGmgv*7{G&Ij{V)5P z$9ki0_@f)~ePd*(-hB^tgh%qg%)f zv7!ELTu6zL3sw1-eWRZ#kG|~N^xyosy(Vq&)aM z3<7#^IO-772ZVZI^?<+)4Trs(OdK5mv|8`_I<|JB=FT^$i+~5qFg7%AW9NIKn>hVS zG}3%(WMV!__!k`b`Als95nB(%0fY7f*h0@x+<{-$0=7W?& z(aP&Yk+jp?51m=U8)Ts8GkphQZ05?_F$&H1!9{pJ)BB)1o`lmRCn0lSK7SmliWe+8 zS)b3uxHtx@`4j{)UX7FG!wJVcZU)AQyXbcmpAYqIeB`lrVPMiUDCaX_cwmRLc_&5~ zPu0mqf?uIXk=b!P6Xgyh$ThD)g7WC|#p`6}0#EOLMN~~RI-VxZ6U&jgeJhlOJg5In zk$U8Go6R(LA!?V7f-P(&+3c zvSRGgA|Wz=)Pqf{73kCS=OYz?P1LM`U&stHdW(N-7zF^#pR?utoR9QC2GT%4Rp%qQ zyZW6`%wKTqH}v^P?CPIle44L*(bd&BA8EJwM=lOkR~MY{JM!S2=E^_Vy;~3%%{bU= z5hoow2&k3g*sTujF@xeECj9a<>=7;AWA}a*D%=YP9c+22GX1H zPC)hmhd3Vzuojf==H%K&T;yD%+AA^={cg{{-G-WHu9v)x2Qyp^D(KvWV+K(zACTt zLQ2=RdzYM_%QJ4^XRZ#|sho=|%Q4yE6q4pvZ|s^j^gr%uVbhTpPmIYAssSv#Y4>gF%t6 zfFXXVcZypig@T)zaPA7$*Vq`fiuSPBv|-UzYY81s^yD68wHYba*2c(aR&36&C{HjR z+OxJ6CE57Y`d;kF-N=NPWKZCZT=kvnYaGOXluXF7q4rg!&e3uU^vTR+>yzKi3>}_% z%&J|8!>RLZQ|Eagc6#6X zgx5hZu(o^)TepT}uRcuTIKyKZIc(dI!;nDV$_HT8{O*Mh32#b6CqGOUDLQ|-PtAEh z&(|@-C!g;$>#G>pCwvyLIy~?|5B=YVvyPlj94nmn;aKN8WgG$hk5Gi|h^V~~HG-(8 z_>7#)l)2*jg13xmQLY^C?dF@Tan)Aqc)NH?h)$yFSXPS5QILD6I@hTL?-h>s&tWLd z>pT)uNP@rzw~E37B5bJ#@`b* z)_p%D9tSolUn0Hp{wK@c&v9-0cXQmDQ>73H;9Je#lLLy^6y3=70V`%i=AMjSLze;v z@5W0Ja6w&CfsatYsI$*;<~bAFp2~bEk_3saXt#a5N5@zQk1x6GyL>upAxhqI2_H*o zmQ=@_!1Wo-A>&1fuWUlCDku$z`3y$xz2?^kk+{}Nyd)Kp+cyHS@pkr($h0Dd|Bc-gZ_i0YVtkrgRqRB> zVtywAv&_p47JAfitAMUpM%VY~)_(75rihJv6;3|@mVAl-Sp1E1`3dg%I*yJK(pl}T z{1CmdNrG5~1lKNUK}>jEHt>Oxl;0eq&AW$inhj4x@i!nJ|KX9`ivK79 ztvJHzfQ}e)@DL(7!-=E&*KTLwbacn`r+F+qqZDQ}N{^;RlLp&&xiA^UeVxfjz43Fz zO2%VEK%5&0=*NDVu&#^=R{%#*ec#hpRNT*iH_g?Ua=40ZA;rdUtAb>ImkR$_hDQ`< zvt^Sol0L6uXI;#i98U9pRPpaEm3W0t7JY|`&u=FXIAw=%Ka#k1L3Zq3c9(bXz3ixt z_FQ6b2%kI}k3eaWe!OK+N4r-)^8}4!fsezKX|rd?w)QpnG-$&P{F-MGAIevMjS$Qw zbLoisC4cn7xd}&9i(fW~^97P{I*opa*;M&eZs342d%(>t^C|o9GKdGb*yi>yZz+JM zkk8tvQM?UrMloI|a^<^$`{jKg+EGkVgcqbQ%i@byUhq(1JFcI zNZ^eZVRPQSOoQ%V48QP|A&WuPvsR+j9c6eSTxG);s=Y4kMk&`D6CUS_j>uLAov3c= z*#W1U(rm~pmq1>5S^Pl8Kuv-u=(Ub1gR%$DIr2P2p2x`ZF!ML>cSF~3n}AS$@@?5| ztaIJ1zf%9?S^+*#Rwbpn;S3$L9bc00>&^VmrW*Wg-*5{)^63HZrcO_Ecy@G?ca!M>R`EE5%BdmQ z;As1h3W~8S21G(8=PTSFInE#b z8J{txz?{XqTZ<9nwdCyZ_(&-~`~-qU=Vh2QC$#@TJ;VSNfcjgnOfJsIYX&oG}7c{0og_=cK}q$g+ zR$%PfjNDoBUyf2GD-X!6;sNQDCMo}5bt>m~7ESC~2>)%$KfdUPR5NY31>M2J&N0_K z4xh(vyvDvuwu&)7+{|a&IhSrWmqKTsfC?-#n3RFR;l=RZ9C~)a$7TXWHxNbT9185@ zt>!g7-B_dU-3VF+H~q#HWas9kXjyS=r3bmKZ{EyrY&5_BZg)=%RN{)f9g)bI6)zRo zUgq;k&cdq5tnU}$S#<49`1NN;@XOg{Zg)4@sRV9w9-0UE#}0~+FOVknj!wOW%(XsH z#}H%v4hGbDAG8H)6v~l{EZJ;?zNc#)`GwYc?KZo(WQU$gHdM|j-|Jer6j-1dosoH_UtHVw_z>mi$V$Wu35^e<0BhUg9Tc=Su|-C zX3p#M+E=Q!qi!aZqP%$X)xz(nY8#3K<QB1DmA9fw}-3@G*WP3M6|z5v2WWCt4-{oOd7yo+N4)H{w{ z@f6cF`LK!xTcHN;CG#^#*F|Lt8O?{_dTf0SR4iRk^l$EZoe5Fvio8&UU0b@q zZe$;ChkV>?{zZN4x|%5j({_VIe}pKjL76LQI1=j-Qwla%6=2_LE+zB5AFrL0$a(?B z7Hhq#_~$$1pRkf(71_QAa@O6P4}Gy87{oVJXC8J>k(WAB-k-aZyu)KQ?d=gd$3Ba_ z=A)S5{jqBL|Gs2hev5uAU-=@JIg#OP^j}C)@exCWRqZu%k)OcgCbF&Q6lzKTOln4y zC!tikhf(ct;xt;mqBc)&)hgAs^2K#!>KcC(@L|CK(!F4=`6Vz5;Tt>6J0TZ$ZLkZl zx^+IwKzCMa)t$hCZcyNy(HoqTB?HC-Gr)mymwSCKii+3`E%=fD8pZ^L4r|5YFgHZO;Hc+Y zag|-kM3fI+f~(KijdJDLs5*Sd>Ke8uF6Py}xAAK^=TIX6*cl3M!OE?pWFaDwFG5Q! z-eb(Ck4TMWjORMvu_}+=C=GO+sv5oV7G$6#xvhO8p18G|(+2-}qk|#X z$WeI2b+I_Ra12_jllo#(kxEJ&%)a7s@x` zg@-}*<^+skGjhaQJ@|r9W{EeV3~a*mbeC0R5sSnfvsRI}lO#Ae_L>FmB0sNL-ok{v zqJ)Xn;Ixbrxs1Ae3p>z~Z8tmTr`_g5&{xU4rEq~^ZA*=BLW+Xah`~VAE5UUp)g%~v z?{bs?s-4h!06GjSa|@DpVGi92H(^E6A`bsZ=lE}=gouE|Fx;BgBe7khV%ICAx>sE- zXg3=X+qn#=!s4&%&$_DfSk)7(>S62tJLP!R3X)RlLtGWI!2;V_I%D%C>F#q8Buer* zo0O3EAzwpF+t2-X5cvA=mpS4e|7{1Pg5^FQh#?funP zLttgUE`FOW7+_WgQzUxs(v{~E`vU%eIxz*+2~ zwcnh8P3&UUHNde|CeZ}01_zGh)87+$)*P7s_G=(Nm;ZLW3oZN9fBVts|5g8OzpQgG zQP6$?w%)U*3EVu!O&2W{d5`#G4o51SBvwc+c?Y=Ny+H)l~xhv|8UOKnywZvGF@x}2C z|J*&SRof4bFv$(Xe)t^@2Y~tx89GkOkVFpq;d7eNzXPn<_A`{H`0e&aveE;;kL?Do z+|&CT{_#zG?vsC>%K~BU~r{ye#8$j9f;vxpsg zaQ-~k?_t&sbLOjhMADz<1(7#5o4?X}w9i5*aS;AIU6@jn{dvv>s2`s{Po1rC(C5M z)4UHO)f@&uxFCg+Agug(_Nw(X;wm5+pY#LpCX%@GzO~IbIEmtTE)qPAB9&^(dEeSk zkRsiEYe9|(NW)lHThj1XL@aY%SCy%wuqd|{wELk8!chEkkgOo>eQU2>M9FA2R&H1Z zab?horQ1R!+})!}s0<)U@_lQRXHojn8u{9omx+n!#$`~`xKqv zRl9Ny%Ad#pO{MoIDu>uE{zMPKv()BC%AaTsanz4L(NDR00S;2#xAyb5n7^O{wugHP zG^x$Ppfi628g!7F+_$!j16`3?!LP67G`QCsxznbuf@4q$wH<>Hm+ro`ky>}=pr=Q) z(iQ$hmV#r0j&jh`ZCd?Q{UWqhj{DYTD>+JJ}xv=S5w= zi!`0#m0?qn<;~b7f=bCmxG&6uS5ShXtwFLAlaftGvST|3qX$#?V^IHN?iMiz>!S}r zSB}zBq(}K@&z1EK2#I14rrphe-1@gD5U#6Q5RNq0H7=esX+imds!$`|TB;(R#+Lee zPh%+JSrVwPt2U-LhgzBpe_&a#xi}IDRMl35>KY@4zix4D#3&D-gx1;3fyQu6sJX$I z5vmRvGb^VTH`X--B6XogqaqNgH7e?=F08B#GzE={P`HlqD5@^fQXNcWt-NsA)KIHY z89~0P@?f~um>q15_ydcA_43rx98@nQfkr|X4n{nNClc}mJWGOAaiuWOUBNgIn!S`wz;WcQA=HY_1LNB`23|~r}7yspHmlH8f-o#@6_B=^2VPwHXLec zt_qH=j+8Y5x@BYQ8msC7VZc6 z7@6b=)FY~TnJ3s<7mkEgPam3ot`61&TIwUH6=V=z7LEiP(B=Gx-a9Gc2~<}n03+U2 z%1Ju(REL6LX@r1ENK2$OC01kleJ>{R=a8bMT4O5u$MI^Epa-4rrGnl>%rtg-;?+QZ zINqSI6q-y#oee@tyy0p?-P2YaJJfn6M00{w`AP5NlHSKBz2{duB9MPv())Pldu1>p zC{V2jJi!Q2z>rO6sG6)3;9Z)`4*->cYGUF$o5*;pY4Qc{Y#QU)Bpr^^;dm<^D_!+Z zr5l&@KHh$}(k1t|6>o(zCR$u3Z$f#np}4+2R8KzBQMYT3}%`?UNyz$ zl{Oibm6cfqCWQx5e%?5;ZFivulz+U;5v~FbB>%YaX=epjna(CA%FoZY6IIl=EUs&u z7O0AZnwO=+j4CCOzpxS$L47b1YV^&hT#%RR4=pYaGzJz2o1NHAq<5vTL2`VbP@!ju zl2BtLP}hip48!p~U(GI+!dB8j=}2E#s<@FeTM~sN_aGb6o2*>zaZy-aE-AnX(E-+< zOac7@;HL1rJfR>507>5qY}$9Ev5}wR;lSYUV}$kFk`$FA$_;;hUeXBew-pBl|A0o& z0ky;p|G2!gBQ#A*67c7rmU?{p8k*{p$vD3x&=716=rYqXH{#dkp9fHWelE$ZvAU!_ z(9ncY-$y+MRlb{y`vU*q;LpnwF}x43ZDKqq`1A9V#r(8Y9aQ;%pR0znh1$>`WdDNa z1sdy`TIvIs0Q#=wpx{q8j8pXVL6z@f!zl{=r|~nS^1|WvSdY0BT zR)?03;gURp3H3zdBUz6p>0!XMpo*!Bgu;uLh{ER7s-`AA(94>eL(S9$v3gGnu6Tmp zAlMi_(E`ah z2YNw2D+Qm6A7Nb-4r6(zR$hmSUaLfqt+MnzHpMCd7vm;U8)}Jo7B>f)YU`@P&?YrT zFt$B4luw~BDp5+#Iw)lWP{+13Rf{qV&x-<87b01+r=BWVPe63Co+c_~J$61F8?FjA z2C1J?;CMKE#-z$fg{o9N$zyQY3Q&C2MhP^*7*^#}>dpuiw?slSf`R5~foA;yS}8z_ z6mvrLEe*k>j}^^z4d4n(lH;e<1?#J4*2s`64mSm>BD1I}HkiGnzOKn&1q@5-8561x zH5>k!rIl5I`k+y^ELd9Cj6BpW6O8ge_(B6K?r*C&ft5cM!DcBN^&5Pj*$j*u^6L-Q zMAXwPQDRHv)KDZ6YEaR$Lrv=8TZBnJ0xIL2#tR!mOB+2^3NfAr6by_the8npC|-bW zORQfeO`6$wuJA{t464>TKD9!EPBMm{GCFPle}y$P-JJXvz>|_-H=3i6D{>r zI@OcpNTkotD_zzYXsD}F`qlyEcFBLaI=|>=2bkRF<_aH<8Hd z#1vs7e_o-^Pd)H}^0K%T`Jq1^Kk)o+{adddOaZbh%2j{=`oUi1_oobU>wogxiWv)% zwrNH3xO%e+i>}@%??qRu_tl#>Dus)uN^4vkR+H)=1jy>JC)DVPSW;)=v$F0OhfJO% z6K<@wz)CSs+jgiLuy7jHFrQ$G(UT|VUsXh+X<C5kL zo=IE3Yko|lxJTxmp35%7zV0*O#KnJjw*R%+Pk2b^E%egJX8BwmE#}Z3BNlsW6{IsC zs`a7NXv1JH4~=2~QSI=0@YG>#SPO3zPpHPz0H1`qCU{Y})6f+{uNQUW0y@(q&kQW= z0!islRNT#`Q#cc#g63c&+6+GDc$0V6`v0TWhX_-3@L4cz$D8p<@KYF=UxKD5dmd2} z6!HBruP^c~`CPg-Ed$cRg;@O^ZO_v88V&Uwl8CT z?st9FSNR7w117LzV3$4_S!TIaW5+2AhL9NCF?d zx@sJ@$bU<)Mhi8IM=KVUi-QZQYJ*i5PVy{R(CEoo3RP<@XVkA<+%np8#_66&ZC&`3 zGs1Nj2XjUzeFkT)S1LuRFf3TMT@WppPc&v>5gTltij|XMcEM^J`vyB@QC&UYn_3qM ztG-c&73v1z&l7AuH`H8To&3cg3@iz%FYq*!QtE?NyXhp`EGxsbAK*>qNF59d=XIgY ziKiMMd;t{ASivbA@>j{2)05F{CrIYcNZG6X^eNIP!RX+Mw@SGA@4?BH3e8-~x%)iFVSV+`x;QYxA;eqof=GRUg6dE0laz<%$ zU@_dCOSExWaCoTX!G?r`o?9x^K#aggnD<9f6LEx zjP?W%f|Qm1U!r_lKScglJx~TXBX7K$%j6Yk`n1?gU$sMia?2m7TaX_71LUu1Fw_T^ zb;Fm+@wgA*@F^+(fgz`N{?jbvI<}l3)!O2#A9(u=>2jzCYzEXTe?A0JG5;m=sq+msWY!7Aavvz~%;2o4U2)xR?I;U(NUaZT8in zPxvnd-}{&Dt5Z;5{MhoD?VqAZVSo(EO^1h%dimR?w)#>{JKt_w9o zt>ih~lRL(SMfQeU{3Mf z!VA>B7W&h`H%7c;PoL+XIkRH<%o!zR%PVIWpSQfCV&;tLK(PL&%Y&L5N*q`O=pp22 zsDh83r5e)?|_b8-|gTp65;^@B!0= z#|@{#O9IqHUt72WtZZDbgad$uRfS~(Pk5}8zQY&RH8#Rjaw-pu(D3w`t_CYdoz6LE z6Q&0?6Wi!vAA#)w{bR6y4EB#9{bNk6Ys$^@%<{l33Yvku87+(KWoZJR99)(QH0Y4$ zA}D*W&>rSN={<1`3%07ANyapQ#y-}suJLKOMjMS5HjRl1!+ujE$d$k%LL=+I{WKEYZ zd?CzA5nxr$FF{6UrgZtL1i3iTq1r<~I~$ou|Ftk}TTP*GlKIMWMxVwlt0|S5w2boN zxeLmRXV3D@O+rR<5Pehyovje2$6%kHE1Z(3w($_bc@c{|MkDkejlnRS?-ihcQ2kT( zq*-FOatt5qv$i)CJK2E!jSnh6W?P#G?9P>Rw!Lb=-!&2GT6*UX>n|$M^*g776yFJx z4S?%A?PC@r^20OI^${=0`f3YPnkBk{LHeZcMl$A-^)bMlOHcc$eE7+>vnAF){qGOR z&vVWKw&+GRxBXA-RTC4s8Ml0xt^_-KuLlQw1M#0o17Ugvj2phZR2!RJFwMxz$CPRh z!MuDYg9aXwzKF&SF&mzy!FuShVTkkA z!70N~`!2aFvks?(UCap$L{=JH)Up^Vpru$Y2AgXzZ%p#|Wt*BUV`~5SL%1%eCJ@yC z0)Q$Y#Jv(Sqj-ii2jS^}O<}3Qopg@uv`hWffn*1LPwd_5Wc#&@pH#{05|zDpLN7#H z{p9YSyxiG!4Z&*Z94kfJ>AJABKm6ezXn)=K;DdV@@_oaoQ%YyQf8r5EIt~10UB0qL z*%An4*6^o+XnL_R{T!b}djpNt^}%MzdIzHOGKfpRzDWwOt0oT zZXK*|3B%sp&=BAz1w2D`sS8ybmGvx=yAQc10^6VD$&Z0xlwrwH&m9UppsX3S1mU!V zWW_iY4|Oe~oe6s&rXqkH38hHAR&)s@NSL(99>P^v!ArV}*bsTDY@)P9V|Psu(z)mX zFxz9-H_y@&>v>f(8oB@$u?r1|^b2MMFEYx)RXkl!`7B{OB+v*X!OD(OQB?>f;HMm> zbAw!m?!r|#SI--)Z!)H$9T&PA#&tES@VurHk65%;bd=rH5p%l9*83JNBukiuQQzx2%O{jL1m9PxJBiYm- z4tnB)Px&q33HwTdXf2+kfA~2rcE@a;WaN8e|h-J$KN>o zjmIC-A>BBn z8&?3)ysjp)z^}tu^qz=-L=a;=AuiAq)+D1+lX}YGgojiT%rc7WSqOh;8I>&<(9rItI-sD^#3J0s9Sx9WIw;G4gk$$|7jNXJ!#_O%tmzz zBh)N7y~T5iXSzNZL-7{z2VcZ5_zt0~+7oV(?Qb5v!2ofG1b_C32jGy|kf|j{XkarKbsdRe6Fg_X=0(<2|hJXt*a_ z8(NB!B$}~@Pn5$7PjWPfoxZLbW%8d@uRb++Dc#0tY78rcRf%WRBs-tm#~=AIzfc%} zgbPLrVGzqBsgzAnRf_pW!)cputa=Hrh7Xkz>#Ab0I5+{1)Iw(tsMR?p9<@%CRH`SF z28k!IBv4n+t-xb&Mu~JqB(xaEaay${s$wq#4>oZJm3Rwxek|-f5y;?upKPKQo^Co3 z3M`Q>$T{`Y(W3dUgGa7xR1Q|7$`t8ULuR2?DA4PJJjYPd%j!5yG3m>J+!>-1D~=x> zKtUE6ILKAE%dy`XW%be*rs#jcr}YEkph{ad9n98eAZd3yNrL>9pjU+}#Nd6JO$B&| zT*tH1W?2$V2_aONlKeBFQdh6SM;jq&%fCXlU%it_=RJ3>-3Gtiw?qhRYVrcQ`eoI@qe{JYhE- zXudJ9tyGOuxotagbxRY@h{g=4N=aGa7>`sA&sjj}(;(>jIVbhXD%Mn(jhn$i<+-}9 zc{Dub0lbHYRAJ}wB6_G|`b*@e^({qHXcS5nodmcT1)*yJmh~57->dKHveFs-c1&sZ@)QwK7aDX>twe?IKnqlInLJoGM9@zE4oZEo0srsu$A*M0YqJ z!IuQbuFZlvHPnD}+Tdc=B04|W(+zuP74(0z0@bhrKt6yHvl)lNwd!~X6|#-TnQvMM zS8PBUP)a!JT#v{xY8mnD1jZic}UfjJQo43 z6xdANYl>jTBuJ|5*<@fTjzS$ zR4BBkKEO?qW{E)c?B+URg}#JMP{X$d7Q=wR{dJDPF|D~yopU%V7{)H*AilxI(STE$ zFmuWd7kRq&R_k{j}xr%?4Bd7vQmYK`O)5gBKR1fd$$ul>wLdC*ng8YJLW^jd^bVUcFLuR zfa^}5S2!nt0Sz^VW2#G^86_m;p8)pYo?w%5yVIYh#$r+$Cm!AD^TsPC7Ob{1CVj{K z4p^{QAA7+!K{L2Sg-Q9xxkLaYbAO*`@oT#Pe0SV%lb3=*oUQ5ooS=^Z$xkWD?^}jS zf-m`C`=s_2+A@#TKzIA|a41+WQOHUvjY~>D&Lt+PlsMteQ>-wNRm7DMT=JS6F8`QT zWrKDYOtDoz*@#Q#=NJsG`%2$P}FWq49ob z_D6ptd_3KKRK4$?a*U7u`SZly)Z}swv#BWYkTgD0m5@lB;>iKu0Q|%9QkCE508WCh z*ToJNNS5jbKB?~e2<@qgCz!}5$&x%C`WiP*y83k74A8!&4-VBSIck*fz`o~6W z7l0R7wWmeFg@rJz_zEN#zBJrw+e0tV?fo=x#D@sBxH-^}vqU`E7pS`)#$ZpK+8AI* zaEnf!YI*(`&#Cw~+F%^qTzJQceH4?r4H6(gK8EX7pq?kpRWt`{>RJsPTt0SZ}HhWvt>^O?tBg_f04YDGGep!@n&2?OLe*_}+wP>zftcj<{U> z?OX6+&qDk;pDlV*`by>1Z2@6@W2nBvi7C}b=Xa}V&dhjDp8r2;e)Mm!F8ieV-}FDf z7btSJr?mbichF1n{Fz)r5_$D{b@9*s&tK{VVV{$GZ}{97AMv}KuQVR#hv0A}*_;Ab zNQcCo+&+s#*!v%8_UCa^^o3>PL+XAQb%7auG@*dBE|^f?aoBe0RL4~mcC2u$(9+q# zs@lf7i*TbWBy}mL93~p*!XU2WatSQH8bxtMjTT%%!#I+=6{8(%f2qFLo0w;neMhHu z!~hss!=msesE?F}O_Xj>v!Q-oY*7hY60dM(?L4g;KA=m2b8up}x|>EkZcd{N~?KFElXzqY?bk%173^FP)r}SPv?BxA%I(>US%g zQD~2wafN*kn&SG!+=W});254x{mlUR8=MoY+ja)R-xBcU6=KfR*T>jnmS?f$pN4@# zr{Gd}%cupl{k;s|2i~xK~WiH+_|28;kMh2OpIE5hd3CX6&U5U$|^hsMQk;gkh?0faAG!utTKQV^ws> z~>-$3RExmGg4UCVm$ljKTz@#mxxlG7)@JK!6LeygA|sr&=x&(4c8 z0gM~|apNi4mBDUZy9_m*i`f`XEao8(!v(r3s2BAxCP#2n9fWRQ zc(%R;rv&@1gWTx|+bN`S9BhS$YRJ**gFXm=#Ud_IhfQG~ZTe05O*U7i{4ygHnMO~m zlpkFrmdx)kE=4(kP~^yDy?pX|{}Z66ciA1Nm+wb!@3LnMK#xxpke{i0%`|rLF87pK z$j19esE7RM7V}PJ1(@32lf)lV)?nca;<6b%~!tihQDmu>;gzTg9Q)>b!%pyA-%pos9oIS46hu`@)F z?GNBEHk%nk`O$=H!y#G*t9ej=4UiokI}JNcDg%w-QzMZYT(8*@tb{T)a~$R z*e5;>he|GtD5pSdF$&hZB|`;4i?(Kk1KfSnoL`EaadJq#UXV^c(n_%e5(u^#wd$h4 zc_truA036~o`Z za#_QoP(4K{oFLMl{sHo*OCGKK)W1ghZvb-n$H@27>A!pHyB++qU;dt-he5&-`TH06&2z5(#}bmgaK@oxCk{A0CHt+bUs;iHyo{txQm{v~?1WFqR-zs(Sp z>5pPd)n&$@FAko(eUf3!9cmaiP4Dh`5zp(FcJ~aQY#3vfb@xnJXc+SmF0V3-dW37> zJ8}GF-968Md5%H27ADm(-|g;McbQ>KK{%w{F!mr^y%O>5-92W^Fs@wD-D9jpzAL(W zJU8R}YP{cK82b?}{|)lRyL&3`HVi*P^M2IF@BzaZepPqRhz`S8j_{_ZQQn&Fo`o;s zJHqYzQ7*z~1`RUSBiwi7Amc%VE3yU|`~Rc6r}X$iM*YtK*H;G_%Msr2jX}n3Hv_&g zgN!{0cbtmwzq)%SPC)o`wio$s?e1whV~{cYHnhu!@Hc?(ER=J5cTfFHl!I{M*(m4E z?w$wFL%j%dE*NB7d3SeD^`b$>O$ZlOp}gOB_hc6V-gVtQMF^ikI2=Ri_&;>_bi=wj z|Ihdi{MI9!h;TVVKf)^!E<|_}!U)3K5UxhJ9^p+0A4GUN!eO9Dy5z_8=@pIOSoq2jP_nZ$|hG!p9Jf zc?A6d?c;KU;}JfHuo~gL0EyX9$`Jgn-H!>_#ncY5$;F05#gApK%WTbBkV?aCBhLUs2^c2 z!aWH62#^13cTX)sKf)CVmm^$@@HT|&5k74aN4O5*l?We0xE|p?gnJN<2VG8irn_f8!YdK3K==&8+Zg{W+JW#U zgpVQIkI+Oo|2g0V;WG%crr~`j=o#TN2q*G=7uv;lgbVrpJo=6A2v_s{1;B;y!M}rU z5l(pt^f?{veHs0M@OTq=LpTLtH^TJ@kN4ue6XOZtdW6+{e+A|79pPavozw;g8gM8l$yzm|2h;QP3AKHU(J;M2Xe;s(`JHng! z{s!od?+EuG9P=jdaTf4}a6H1{Z*}*~MYtT{a)f&ju0=TiZO|FQ2N9YGr@RCH;79ur z<{~`)UC=4QD-pIL+>h`kg!SF%4}{Mkd=a7lAKg8}z)#jA9D{Jod!S2%HzAB59R5D| z9>V1a*CX76a2LWc`+>(9$cJzZLjMP7Kf;@OfUlWIH|QTd|DUzsA#BDQK>Mep^~CbMK2lUG%6~pm6Y_2aupT7qMAub zMY)oSl4=zd7UfDTN;U?c-}8OW#?B7oPhZ{Raqn~I^?85ZpZ}lpIiGWOXn{UkN)5sA zwv@_1`++Id(15?Plp27ESESS&^f^q4rU?YsfHt4!2rNS@?hhgku{K9Z!O4%+a{Yz5H1MQclR8aV4@+E9a zsd?dL)Y}!L16yG9a{R&275Ibx0REuoO8f<|zY2da2^(SjYU%+-o5?o}Uz1XC7`zt$ z(0?8IzY@04ZqWA@$`7Nh)Ti+Jl&ZLj`g(gxH9`ALJ28L^BU5-E5&n^qmPVBJmVun9(C8;rwln1KV( z_obAI!62N1VK@i^ur+-fMYNSr(g&sVHjGt z1sj3oFbb<+0{Wo+E7U*q!7&(wRX1Y~eK0QJ(Ee5WB@BHHzoLJaa^FgQPNdWbjKerg zz-buxDdlR%9@^iD|DRDmF!pouFPx-*!vyT59g}bnW?&53f00rX&;@6p2QEM#w9}q` z=!QX94MVUVhG76kU>l6WE*OJ-qW_ZgY2P>;kam8Cegl&*2{X__yW6LzFX)0*(hr~y z`d|a}!xk8T9WV&PFa-Ny7!Jb-9EVYufH7E4|B1tZ^s8SH4@O`N+J8+xU;viWuaa;S z+J8g8h8{Qz{V)Tg&~rWch5_hFkRRxWVHkw{Fb2n={kOCW3_$1Gi4VOn4(p)jcl2Kv zfNd}VyX5%y)E|t(5$KwxedHLkvBXA5RU=sTN%zSnu{-GC!U>%IZAawnO{v_cr1|x6=W?(tvEHF#E zNk4}jF!NW&3$*`@`4YOGBb@&2gB>scYj2^PunoHA$dB+}%m?)IB&?PGKc7;i^!Loa zDL+j9hkgbFX~yquqzBt!2zJ9TjKCjW7Dc1CgCu& zAD31W&;{f7lHN&aCN3hOsl#Y5>O1qTDc8L;k3r$Q!Vue!_1| zs}>k~6ZJ(sg`x94{G3C5K~F9DzaM=&b}+Gn`hfn+)2ezu{;nWjFc2Ue7=fcO3MXM4 z&cOuq<39PcY=+UBs81M&)1tqFcwy3Qqu;|AY$soF*bNhK9(ryj|Ku+W z$DsWd`kNfXB+T4OyO9rnds_8D*E^|in1Qp@(qJ`l3$p(i+qsp zV2JvK{<~@42dS5PC@&1&%ea%{2PxP4NEepF2&{rp=z}rn{vh^Y;=w3v_z3=C3k*F( zy3o@@zF-jg`pD-8(kcq$y=k=|{BT-@K1w-0Lc78U9D(7FQqGSN4*k&nG5Q${!%pb> zICe1hN&3OZ34etAKo4wzp?>^{{wew)j6VuL0f*Dd+mGEh(y9xFze&Bo2poqoI0NG_ zNINB9CrrX#n1O@P{;jl%K^L5W9ykMiZ~^+E{UQ1xbi*L5h9OuF!!Q6Nunk6G7mUF^ z7>7}qfTJ)8Ct(K8LVJw)3%a25VbX_{&>d(2jj5(!^Hb8^}=xw&U}dc!vT&XPtp!zKSqA3uQ+TcJ=gbWXO4rg zhvOLZah!k+Fav|o^L_dg48UF(hJ!E$?c^s3+hOnrv^%tqlb#&ICj7=>hGWkU@y~G> zMuk73ACS-BQ^be9I68Fwm~v5`PCyq-LNCm~2=puB4d5TP zK#yfnb;vOc!#M1RzAcMtM0D$-Dy96cl0{VoL$DUcVKemG7FCZN!x0$Rx~M9trzi}= z(6&W24E+Zzss!|uE-Kq+$?t)S$^(4|Evg{&lr5?#bRE2?+8#rPT`&OqU>d? zbbk@uxu_ap4EnxII)^N(78rmXFa&#H82Z0Ly})J|IdoBV!zi?U6}$39)db@(1Y<`m zsxcUGEh^_Q`8{?~4Z!Gelmmv2C*J=f9JYK7zc38#m5Zu;kaEB(=z%`ygALFRTVMco zz#t665bTFxI1D3j97bUR#^4-`L)+&_4_3e=^uP?Ph4vGu59ore&<8`%4;Q{by0C}i zAhb*U!2yoLa0EtR97f?ZjKO&rhozqI=!F?r2koz+{-6s6p$B$CAMAyGI0yqU z27_<{hTsg0!37wHcG@=q-7pEOVFuPi`-zJx09|kvMqqiA{K6_2gFYCC4bWFbK41v; zNjS8B34d@%!e2`{B^)}bpD2t{F9}%5vHhe)HOa9b)^Z$zqZ~(JBgY9i$Fb{V`Yp#1 zSc!j^hxU|X*eJ)RP+pFMu#4j`?1M=dg~3ztE5~pW`d_!Gk}v|xhsZCih8{2Ff+5%r zlc&*7Vc>N735-EI{oQp2^$jy;Evk&LW>H0?zrT@ohOYl%JkXDWFa&*XqQ2?Ru5+ko z=&41Af$g*x^zXora5w#vexC8u@4iX=^JsUNfL+jkKK1%7>c4SOSz_e#GV%)}0m=gt z&GehcNw0-|@on;RGyVDN(VCe|;4qY$;y)X*vU<@|FI1IuB?1V|!3j?=O&oBh1Ur`% z@!j+f>d|u#?I!hkFZq3fa5xAPFa|Sl3fenqm+w$sX!|bl?k64$?q@!PAsB&SI0O?g z4qaX3SJHt_{P?4$l+;G>ie24OD@!yy=fV=(bC`WN|0La*fO}vFgg%bra4e4gd-BC`1XglvpTfVI#+LpuBDi1?jlJi-{PCEWE_(&5FC_ju;aGW4rSOYWA4}C{v)WUDkq33tx z%C5Y5@8#rd%-8lu@mJq}{K~sHQ(rj_b(Z4EYXbR0oXQNjYHbF7ov($DxdBfHBz1 zc#Fe9n1C^ugcC3WXQ2IV$^~7popJ_X7)IcLl>45Hni3r*VF;E|4>4E+Gq4rI)1|2m`kVI)C+6aJ3&TqNEf zCC!LpOQ?R>LH$hZ*RkKJCxa9#X%s26|wCa3Az@?1#-T0NY^@wh{GD(Z{s-kI-1j{7mZaQp5=Q1|XY?c-6TUz{o})hgNj%}d z=%>*BZ{`uHM_5O^;D0C|biGJBqWjrN|#g}48b^z9!NTjzsx~PDg)#8CDp}v^Spv|8CM|~ zfj-BQ8iE-ZSRh{qFR4N3Ib=yyq&PlwNwvV>VWbQFEJtuQazA_&2YsKFwvM>?)s>1QwkBQOE&q#J(cl4^pk+vs;N1N+Lz*X`sJCSj+Yc=uBO(9^l3 zJg=Y}`vL;9D>n)>QA26 z{1o+Y2;*(Jzx{0{%3!zt*0 zc1b0q9pId_1GF8AA6Nk+&;z5e7RF#BjKfx#fFYQKJum|Yp#9H`H|T)#3&XGuMqm?+!XOO(h4~hS;3y2kNf?2%FbXp;2A$Gwuo5O<4YbcPpFkIE zh91}seXtvbU<8KY5RAYvn1SQ8W8|;o8%AO25u^iMFb=&i0qbBAHo?H(@C(Dw(f^?* zNq(X0ALQ>y!eJGRz*?AqP0;l`{aeCew}iuf35O#RKF9nZ;c!;Mp{0U+!fF_Jfqn=R zuuqQvN&Uk(v>ZkK{|h@9g!M2CTVND+z&PxMNjM1Y^V9?Mz$xg5^DqcYUrBse38SzE z#$hA$|C|0M$8cDV|3g293FxK&dtRh`Fb+pxXo2=%JVanOjKcvLA8-WvQ7Al<*Ef z7`H8}xQxfG%W57b4&=RoZuGKc)dR!!Wi+&KU^R@udKiZt&~@6f8ic;nm(>gmLd&Vx!5SEc zZ7_DmvKod-7$+YYI1TO9w6o+7x=A+*t6>cGL*JRyFZl?-8W@GmFabl*cNX;mBd~?^ zqp%mopi9z+jW7W#UPt<{3r1eQtVUo$=tZyLJ(Q8TUJS!ftDK5xt#n#544dFAM`*! ztd;!1R+xlN^5?%|Sxs>qh4auJz#csaYbF1%QI4-9o*Z9=f65c){hG}%cn$p?CSaSC z?^^80e+EuK|8?Z68ogy%Rlzt6!oXW8m#}qN`Od=M^^_Ne-cGq-@Fw~v<%q$dH*)+A z`T>l>xw9$f&G_??AJ_oxx6nWThxi?|!<*3WCj1=y-$T8^AZ&(V7=jU4w*!B$TGD~_ zFb)GS0oz~_cEJoBh4yL70Sd(Dh!%H}z$Ika7v%NB@(0gQGA3r{%bZcC6+21JoM~_2LHxK0^CI|HtV+ zF#ZX~({}7WMLomhXYd2#gY-x0I~b)Lb)@?R>JdF5k`GUS*P)_LjCFO&jXPEaSe2R8Hmwfz+{tkV= zWqj`?J?Mc^SPSDY026Q=dVWVe$T4*7BmLhK4x_NfkKaF1ZWxABFf@a|^Y8-)Vf1gD zS1!O$lJkP_@ANC^hm+(Z0B2zkW?%@mNj_jdbp3<+BfStDg&8<0$IlZFCg*5x()GPS z`AIJZTcGcsqzmo;!Y@q1%Ja$RJoO5rFa#5@58D4j{$U1IkiTRae+?YNHt1WVpTQ)Y zfsqV$7ZM-N!_X4-aS{1lreDAy9Dp%61`}{f!WHu|3_;7qoyi&FJ+yhW)l z7_=&7YoxvoP^$G3@&kuq;6SAoU>sImO87xaHNxa8l#0NZL#auaIan$Cn<=-G_hP`z zAxgDF|6#ln118}t^c}90r-^*R0Q4Nmdoy4hPRQ|5N|j$md^inVNAqrt%L#{LFaf7v z2F^qKF-p~3K{~JH!w3_;){$gj6PZ&Q7JD7Yu^#tv2;Qb*m;-h@j zXXs5z`6*xY9MXl6TJj_1sZ*+y{0Cq&48ln%2b_bhUD#boIIM>e*aoAp560mn4DH6x zRpbZGz{noTe>HZ{4dc)U6R<&!8;B>za2C2QCA^vR-%S2s1WrKD6-w1zL;VG)Zy1Cf z*Wwp;k-r%1gK-#zNjNI`zLIeA<$+PjA8aCD2^fTdtCZ@LW7rG*&D1yfh`>R~$2Cg1 zB;9Li4;Z?R{7CvOypM(S1FiHkXun>mB=o`3>(HSK2B8;*p&v%z0CwdT{j=rHi!56@ zoLgRHKcKW{i^Woj?Bd^$o!_5&`QmWyc2w*=xa{`QPRlv3Jo}_GDvy(x62FdrgFb#A zNW9#~$(I2CydPLl)~qO68~;2etqZLRZJWWakMETxyC|C5q>ZAv&`O|uB#lY_RhTrk zPA%mojqNgv)1)~mgWaT6qLrc<%Ta@7GigkZ7K=%v>9pV08q3y>w($PK@^+)mqZ!K) zL7PK62)FW)vJIgn(GJiQT^mE2HEC05GbSyGHf_+PedV*|&IZ5M`UiacwO>8n@~T`P z@DL{bAV!>>(Dw1yY_aTcIK$TMj*16L>KyLsb8vE&-{nZ=WJEenv zFk7GJY;0ePy*p=r%*OU@*w^Ol6{Bi{zSNI>bI$(v8{1D{-odE#^BQ3zgte~`Hc43b8ewyUMb-$jv(Ok?Bdm(Bu_9q|4zD9@ z{MH3^8sGJE_%1nz?{&B@a8&pmPC18*T`=o^&x+mZbG_L0VmC!v8`;IMvwUQIJ6SW$ zU{{6R6_PF=(H79!O`5%o{$$eJX!gFsxYcM)Xm@Gebbs||V;FQ30L{8c>i^7xZ;Y56M{ul)<^ z7`|KRzx%BhY3Erthtl>w!aDeFd(gGTQZM1w22SktWfwb2#ij|HzMRbs#ce{^%;#+O z6}Rcfrr}fBv`#K=GloqxXH!<(W)_>$PiOr+_o||Kwo`{KIh&`7+jy}V&DlIw+@=v5 z7w-!-L)2R0o!n;VMTM6j96+3YKBGm4Fu_Y!Goom|{z2AgosrmVP4DeXO*vw7~7 zMeE0dO&#w(($adWxJ?5#{W+V*irchflgZgUSlp%$nYO<8f9Ds0BFX_G$x+)=suIgdWSuZ+oE`n(^T^1-alQ^jrCuxZZO zJXYMM7n^9#=E34NBiJnDY;GuSlfb6#bJ_gtD{f;snDund=H%iwmDnV5Hf6anT% ze6D^fiq=mMoA#W|Q^jq1uo=zSJXYLh7#q91b4%Ld!QwVk*fiyAZYXY(!Db+5v#+>~ zn-k?+&gSIeHg(wec=wl8}}EoX+2ilW)hoV z&gQ}5HVfE{Ktt)XE_dXc#$~sVuGo*PvXZ<2tPCAVL#t(6Z9(r z9}+*|5{w@ZKl{axHE@uliro-aN_zBj%jz_LD+1>#e8llrNq)P>rC6cxBfc8(CGULGeED9Q zuYP=WekJScn3v`&iLb8VtS{^T-B$x;tf6moe~o!n>g!qhJT3D+X}gC@b~)S+*>*Up z!dtgHybo;K?x@*+zy*$eTgk7ev>G(pbw@#Gz@PXG<8yd~zAZjSH|O)G>-dzmn8xSC zHy6~K#plO$pBuI7E=Lt*FmzV@h%XQQeI}Ombi?6!%edYQtz6u8<<&!pW9?tyoBx`B$b)xQTQ|-z)U8`MN@ag{^Yg6%Q z-JH)Sq+QqWDQz)=&(8(Y`wzBX#tjmDPmNX}P3T~Lo}{cgkj zJt=+IbRy8MucY3(@l`*W^;LLIDb}9r`kKU7?3YrJM`I^Po>|e6J9(!rNs$a=+h<8VRPx}4GHs{MUU$C34_peTT zO((PYde7#3tyTANd^Pe8O07?Hyfj}Gui|>=g{-f)y)<7f`0~wXeO>y0_vN9^qOWFu z?mr9ajeNK4k!_tixeupp>$K!{ZDc=(V6mSj?NRJ+;JfW`($235_c$74vu9;dsI6_C zazpUN1;x(-EVdU8Uw2$JTff1KwtLlCg`sI_Jev6yKfCy@?~in>+^1+GEV)Klm@xOk zf;w*{p0!pYiqAp98jFOs2w8M zwJmRKH-=pW?_u4@UlO~~P1uzmOPg6z>KO~4!u~Xt8!}Q3A9n678{4&DH?;}7Fm^rG zjr|Q{S6{NRT>?9cZDTvzag5hZ*mF?W8>IF%@#e&mCeMBgDyG4`1l0wO((!9%i*7YrHt|2M$Q7w{wry_LLq! zyT;>sD|=1GnmT(;=64L)O61s z;>60cTN_&RD_7wK{J*51Y;ogq*Hq)4? zFTRK5WKwIx-zOyfd)M)IPvMr7%;>4J&v|( zjYYM{Sd3y{{>rTX0}AZ-I_3)fW3I(Xyap2IQ4y#c<8w>Jp0SX5sGPQm5=Yy=`qIJ0 z>vXT9q2x3gS+)^YPS(52WS!D*B6U&EyKf~;?cUHkR@Od2!rBOvGV5WtYhf~fg-N%| zl~QkVQy(3Ax~t}|{GJjUaR-#_vliVa*dzU{nt#*yY#_bQ^4%6=Z{Ji0=duWV2hW+X zilnD$Ta((o(ef(J&&1nGJo!kus?f&Jc8Q>sE5D|zBW!`N^H#$2b(@r{g*Hf@ol^VA zlhS#Yc#^D>e{uBMn^OhP5l*A|OxiqJ zjY%tgEp=wnTxedC=0)?Ev^umZv;!q0d?YVTXq9MOmS`W*f@tE;YS22-#2>e#wU5~K zqKUr)4BBAUpHYjUxlMKxXfCu#L);m(!99ifTRWS`2NE z7-@Zwe7;j2-Y?bs&k>#^yhXxUC0eg`luA75pmpy|sfR_+_FcENOUu8sc@^Qqglp-W z+E99VtDzC4{+qD3-Ih`hX8mQK>)yjIM<~|-;&?N6ZG&kC2`*jfeTI^+Qrq}T;+T19< zx(RFfFMN$)-&Mqy)cqu3gM?{owS0Zj_ixKpz1H_L*iB%k?I-5#=rA|rw#~HpQrdnN zyUX!y`zF`(d0TqWUB)KT`eozk%$Ii*)?X`Hr9qQ?hS0od8|8BVyQWRp#j)$e?tk!Y z$Rp*sX{9`p?mTvV8`w#kxT&8Z?6h+KjBCGj$}RQ{*iYx|zp}o)^u5p-jN{sra`0U~ z+W1GaqXBJv-jp4;g9z2=+{)7Cg$vQO^$)raol{!2Pqk`&N_-^~4E)nhw^mPG5?!U6N}s%J*z+VmXrwduaHD+@1HwK~q=tId!P=}*qHSijMS zwLYn}v%Y>~3b1$xa}st?HtoXe>CP?IXAUx4Ox9`ZjAr8aOyz1vYcixO?cI&mj&?TR zqMo|zQfh}C|7Ys{S6##Aug!VhQV4ZNE+)_R9X|Q6)w5AjQ(kWuYz`?oO$Hb75mU zO}{s_%4h!CTzifsDSKO#m4}dw&#}nmy>?D%sNsBiZ)(H6_zvs_I@jMz_TzJaJO(b{ zZ{RRF*q&uwtCgFlmme<4@9XC4{yfL@Hnud1JZZx|vGl1q$zPywZm_+9^{_#cxvK(g z9<7t_`g|vk_;O*$qg17SdFqjVO;FwI>5r7-RK|quM7<7+j7hKcN2cu}9vGMSUBr*x zm))N%DTtrn!&_(HdyM#j`?LG3f6CR5_AFAqe)4U&;l8)jQ8^2OnuGGcwUc?F3ay3u zIF#>tedzN7L(fuAowgG8b-vras^_6_ZfLXK&(y$H8NFQJXR5`vlX!E)yIbn+Aw6EU z?(${d+E#IV?#TELX2C1FF_H zruD&nsXZGJz0 zBgqgqiZ*A`M$wXJ#yx^bv{|%rL)=-ka#J}nXihX^Tqm8?7d z4ZqQpIn9rq7rXN%UDGuJ*LimsdVsb+8^XSsd~SAsR`N1LoCI-LYH9s&t?S_gZQXUi zfm#Q|dVJ%SZaW3vC)rTR&mE-`b|Flca5H2(wYv zE5w+OXnwQ?w7WD#*P78{CaoQ<>TCJ+vCMPbXw_()a&EN-RyM1(oBOisF}V5PY)Cy# z;jiWEDYaYjk{=UX1KeJ44Pbc_>mBUq3PwBD%)wj*Y1aTA>U{t^DX*>9d<_sPxCW5) z1K3Yuf1lX5>-PLk;#_9W-DTUgsZ^`8PSW=?f1QAxe54+G(OS_C*A)G{GKkiWc8h2i zN?VY{cd}ha3+^dv(ik9Ul62$PohWMoi+-Lgz80vHiRD|e7BD>i#wE z4dngFxy#yD)L*@J?Sbtyau)L>L#ruY1tl0sXO>?lNYM#zuRe|CrZ<56=A)ML!emw7W^c3FvlDtlm*HY$^XZUWg<=Hsv%JU22H-p_Mb{C1A z>3Je{3P^=>^*;T1A{m#S9h`r#cZoe8nImh_GHBdR$X??Gv^wXsY-z4#JTnK}z<1kG zdR?qq8_C>udEvzg(Rd#S7>|@g8L%Y}1f{#k-D1nbhBp=ylm9y>1lRB%O^**0-%gM!?^MbPWV&jc8 zWGsY9r-gn~ZX=x~{rSjs`%Od1J;j&zd$jAWsh!MKkMg%a@hu-|t0bBi&D_7GZA#S}2iSPba_TKx+ zYt%`8p48U1>)m^oa?0QE4qEeTTN$&Z)Jy%R`FoNqwrodkm=5z=Ny(81tT7ScPu8VP zyEtF*w|KwEcf%NzHEEBdg2_j_g3!-*^7q5L6NT%^KC~`0wI z*K#}MC#2R7>We3RB~PEiq#pZrd^}ocPdo3o$(=Rx`wS%A5OEqv<7kP)N9Lqn+DHD@ z>Rb43t2E`kR`wcs2uEAB>3w<>9}(mhPZI4l zE?T6&JE_a&$5ZO>VjnNK9$^`leFljwge}%@nJ(tGYv;2D;yb^cQq3|~Jfg>6HCN>O zD?2sT=jlZ|SN(c`cBv;15fP7XK)YoV6neS(;v8}QwM9~{dt`pm^cRs@$C-w6I zJrCKnleWzD6N#F28?O^3-XQT7i1%knC$u^qldkoXrg$>nC8)%qsgz>tBztbs`-b$r z1;Qo?+a_Ur#NK```{8KC=Eo|+jP{bRTH0sgH~c+qzT37Iwl84%4;hZpv=0iIGU-FT%O`^$s@@h@dwOO=YG-G)) zXgz4f%3Hx=!)RZLFAv%@f7h4n8|O62ntxZ1l&^`pZN=}ie77B0tbDcB2aV<1S*Fb) zVf?!pubZ7iBu}Hn2`s(1?)9M5$t-s5R1uzX|lQ$eFVMHq)UI8K#!8y~wU$yr3nR_+Db`-5WGck#Ei8@0IN1MK|}zvcq==kWD* z>fbPiSs!J6$;s?@ro3~d>BhXBxK)2hsdw>R>PYUTd9AnTn;A4#D{_Q>*Ne@Uq#u1- zf7euYEm3S=S5_q@_tP9TTrZne0QF_oaM6Grw3&=M8xzLVpYqSDN!wST&7gU*IO)Jn>bGl^o%O8@LuML=Av3SE&j7Yfr=|(8h; z8}<4#YL#eGf2SDY)}Xa#^4FcxZho{jG~-&d87*ki+R<7~al6rGs25}02--B7tj*;k zX$+wy(GJ!WT^mE2Ma%6Mi`^93yh%%2{z=dmL+s8%C=|J1(n9`u%7DwAYHJ?OE#kYm(0x zVQnV+3AAt#`*Q4)g!L14w)kSb@V4w)%62K`eO+3A<^=s(bV=KV?nUPoY&Pxuv$ZvZ z^%BOmYBuavpaYc2M_G~3IiX5o6(N&SrG>_^tOm-_L&nfgCHtypSj z>ma1nfrK>?HeV!6+O3_ijx*9K*XP8(8?6h?&3C<>d6^Vn#eRUWZo*EIFg~Jf(p+f$XjG^6k#xOiQIl4OHb@$|e(S}qN&GEr z{#wpOoG@{mDb~)Cnzk;w$l<}AWZ77U&8oEzqMb6eRW!0DT47l@3yiq)mO%1SB>5H26i&u0@$^k zTsYn&&+X{5#OE}eZEJqWOTHwmhcNpZVNt>w=>J-Iw7KA}m9mZ#Hd!RB8J{zRP2tm$ zUCU+Hk^YtaYj&Wrzl&pE?AoGh#l2&t4~MoD9iG=3y$n{U3!J)?Y@MdzCa?1yM?mZAJMUcaAZTsODriD~nhtd~2n zpCDgP(=N6?DW|diR5wyKb;*S!)xhAc?EAcO0C;pwQ;v_Qv$e{)gCAq751}KUxi1`Pu20<$krK(T%^xf2Y)I_%0tA3lX$7v|bUY z5!p=RX0LWFH$vDvVV{+S57&;_KAnI64i_oeKFywY$(hA3jrM5w4Q&kgamsS6q@&Ft zJQU4W8S8Gse9U8~XT$Q(K3t#cW!ip3J$A$Rkg~{gll$->-<#2+=r@YaC&<4J>b(k| z50ZD=*SRm%uySvUQX21VajU^*y_mbvrq>?qEGxNm%j$d7+O6Aq;_Tn{z}B$sp^}HK zGFQx!UVS>Ho|1l2`0gI+%lOVJxt&<@M(WCZ`C35dp+bo+jsKU)%knQ@*JHMqGt7F_3pBIM``Y6`H;%dN1XKBwi$U|oP%Icofe>*Thcpu@pa>$%Ef@ZU% z)dPH&{-2#^wEHtxugo+2&~xScxnZP5qQs$kfvtijWCG+^o`x<L7B9@&QlB4jtt_}_vkyWp^sqy z%<4K=xkoSU)sI~QJK0kyI?oyRa2u@OFWOak;e_s7U8$$Da1*UtKfjksW&eY**+$|C>FZF5)M5ruEeA}ld^hxu{5~Az(cYoQOt-S9x4Y~v?KNjB0_!TGJE`kA+CRqsTQjr zT3EqNE+p-BB`&u+*VX=XD!M*fbK{29(Il3pk2O%Qg8j78@f?U7IKJo#=IcR$lB0HJ$KE#sNTc4wDt2|+5G%2 z`+^tYy#h(Q`6+E3#J;yYtuD1;{{;5M`c}T2dmYnTN}eeGfXB*nL8JKWufV6|;X4I+ zU@k4$y(O0g(s%MNNtq^&N*6p6VtFg)b2RfjU5>qrFtN|=BOz&is?o=rtqW}gEtigHeQ3jIcHK;i8$}y3X`^USlQxMqh$dx_ zkNBI-`ZK1H$@(*D&bR6Qj9Mj{_%muXXagqAkJfL}n$aRAtsSk;q;;e9nzRU7k4YOs zOYY0=2W87PhF0oNudJP=yi;hEXs_kFd_+s4)tWR}6a~-@*Q{8V!g91K(*3Gv+MKnA zn;HCS$H{M_>-gc0bZdgdXDznUp0W&=k7$i((w+xsimtVyNqZXi6+>ti(tfqUt_RJI zwk@m496Ep|8*cZh*R;|HF&wX<19iyL0pTkon=goHkbG2PsE4e&;VQ zycUa~)l!bTBrQH-H-skr-KdSBRRq#2&(TP~pF*odV~UXZtJca(M&!C}4n2haa@@<7 zd9wEH^zSRP>16wg+j^PSMI;~1geM7a;=4YN>c2PbK(D?^UoT1BXwUO@=)Y5y`L&Pm z7Q(eP@2a+G;AgA(rjd3T$9@?5J0+cbUCZ-M{FqVSyAi+h(qFDlYrjjiy@vIF-d1Xf zH*jT*nPqFRuax@c+$8Vvw;iQF8)jS+Uf`JCTH@fxKKbmd%+Jll^^(?J{Mfb?q{aNc zwcs~C)!6i4-+xJ3{Y30!YTWr0ioi(Eg;e-g;W>lGu%I!md2XwNmr? zYg6&(!_Ixp`gXELY^80cu+#1fKI+!W_1~-!2Z=v^ZFY@#Z$bPG*N6?IKTG_M>(cr= ze6H5xue#>TpL;j;9AOO?^fS{h7R+aUw7I+TbC-NZOo+k&_+#K16s_awV;id zv<|dklNLrBGHLy2QM98B^)j6GS8CA4(IkIHErDh(?;M(xH+O!K_OQJ}FRxLnKofsP z&4VW8HEOkJQeLChh$iJVYOQEeUSs}3Xi{FI)`KSHHTIVQv_X?Lf;NC=JnzQQ`c2w2 zS_JJNLtV|I^`X7Opp~|<{y;OHvt4LCXxhF6wo+GKG%2q!&vj^0UZd88W-f0K&D_47 zXi{Edzwbqp@*4dOq75*H<(wlQC;wt-LndtkEoRbY(8kenWs|vU0c{NJjpEFB4shR` zJ27i(A@|L!_sPrMSvz@Fqrtj8w-&m=xEAtb+lj5QO`6d{Xt}hV_-RM$K+CO#BvpeNAJ&gycHPy8owTo=;sli0qbUw;_S zE!VE>6X}1)Puji_dpQT%-dAvK!QQt#>ZPAk)Ag1vT~%dxE60%${Mr}ACD zr*+NBy0L>W+udpXZ<%H7!)Og?-WB`nG<(T^l>7`37UH|@U~_(Ci*98(rIj~| z@wKJ2eaEj~RA)0u*p4qKo2)Hoxolji49W8hei!a6ycSqMlm7D>NsEuPm%W|xp`9s$ zwkFHJyR3?^8Nyz_5~knpl|ENT*x((j`&={a*+%+s+6-C^eZjb9UO*c#Xyw@3--$hafZM>*U%ghgETwN$ zqBo&$7d<~$a8cBjdmLTcGiabrJF&YEGuwmw-bK4d$6ajRb|Cc|#Lp<g~q zENwqYSUulu7w6($L)<;`XN9!ih(w9c3uj-JwY!uzgFp9uEBi9Cs4kUuC}-271N~CI z8?KAAXS8KO&F0$5qsd}lPhAdTFLkc{oq>EEv8G=A+rSR&JFZTv`^5e(u8p*MvhJX; zyUS#sg&kRG%Lw_H#_mAA%SY;P2rYqjs0dmg)%TUfKAyGDop&41r0s*`?Pr`|Y{!#U zv3-~Po*2Kq-&PV`duvE*hiYy>FLb5VBKs~I_&eXxX)F0kaevxAy5zeHe>Ie82jAr* zeXb9!9c@&EOXT`!A45j}*+$)y{M>23RjZ>>?Ch-79b(5v>Sz+J>4CKRlH{+2`-iSA zj?z|#SNhgGZJvC0TD8h`X_bCGvugjJwebFJ=Q$=yN`6V!%{QO864v)iYpL&k@~GXv z%)W=+xUT2D-}|@9)&UQ*7u>$AFDp3;#|0WYm~Q;`bg=JqO|~vLugTxcah9~pda_Ih$rzfWWA zcib%9zjZJ3_Zq)TTOfYlgW2oJXA0tP>Uy$<`mYbC)r&Hxd|i+KQm-ewIXTVzGJicO zbr?bO(hleF-O$c^9d7PD>&q`~t{B6v9=qdK*`2#`pV3cP61$%FrPUW?f-E)<=C6Ud z_p^;9Va@7YeR-IikIY*>PVD{PEWB1}K#Q2P7PLMzs!RJw+zzx}lNLtnF~#ji3!AiI zv~H6&j@E@{yk-$=?AewP~--yAu!fT@{Y+CN6em;eaxi{UfWj-{4v&6y>FgXP{}K8MJLo9+H)CU z{8fH}YZ*DG{6_b;YF)<5O!seNYPOb)7FmmE>j}x*6u$bXtNnbpePfNfqGX%-+j6z| zsOsc=`v~J+%6j7({`6mvvA`)<)oFQ>^L!8=1COTF#Ztbk599i%q>&QIRVxo<$SJ0Y zIFb9AA1TM@_-^QL`ExYqc&@Gr65L(J+cyf7ePtKq1pa2aJOJv#-2%Rc@qK~#*2ZKD z7ase{r$eD=o9xbKYxa`JsW$r3)i^T$)Dr>^03#N>_t1J)^1LGy1O_Z z{p7`hb6z!C#rF#LH|x>L(Q^BYQpW)_C))q;U9V&LnbNJ=mRTiIh;T3Ab=mOjb3iPW zx2#-POCAQWYr@WW-W@?}M9b}=iCrAcIa+u>aT?8qmb)gDbKE>y1zNFdNawo>?Y-Dn zqAiT2)zy5LHZty;?cw1b_6hQR0TU1Znut?L{&p6LBL%$C5Tz2EZtUx@*UqiVE0%NzdRsfwSK_h7#lbLW{5LIoS#Y`)B3vnIRWb=Cm!wj1j%pd1I&*< z*j#=kA2rz9=(msZeRZ9zzIQ6^6C_S2X&fza_{jOQ6D^F^DnkC8VjSZX>ipaY#zICg z?Z>|uaYu=3-cOPIO%XOpn5oUQJq#Y|<4r_{O$_X%4y5fZP`tfU@;Kg#~b zf0k>=eBWfRvG6zk;#$&g#NWs>`ME%}RMTZ1uY7!&f8rGB?Oa z`pOVK+R$#`yX}K(T(`=3y_T+GT*L7^yVQ3QpZ&x?kni%5JX_w&c^0iszH?1UPPFrH z1BY(vXM(U_N#8u9AiezamwQ>+c+A~*Ty<1_HXv>FhfCA!b-I)`(s z@mXYEQMH8!zRf!>yUVQ8t5sIdv={#-C{Of9**)|Yhf{V3{pd;3okTzQ0Mh;HhR@nD zMceotW|8Y(3LYv zOKa~!$?lOh$zYK5M+loFY#ZO@BldB$2{d#66Z=_{z2sNgUhLl>`E6VyzxlmU$?uaz z>xBGDA8)|l-1lG9`{(ia%lC2SihEY|@lcpZhc6afC-id<8E9aE_ZzJ;0 zSxJ4jVAp|NZl3p|N!z!hF{SbDS<*7CtF*Ti(SJDGYv)RdGen%`S1sz#$2f|_8Pao@ ziz8`IlXmpb!ag>SHe%9B-^cmGq`A;WO_~=iZqn+|#toX}wF#|`v9;Otk*t@)k{)s1 z#CQFCl>hyk^s^}8Lx-*IXJhD7q;Kwj33Q9eUfOwqK2uSVZRaU|C!Zgu(k}|yS;|sH zeKpZ9fW~CM+UdGT!59?a` zg4`0*>q`IQE)q6L*obRUHRr=FmoX$^bA)*ayGg?I@ul6A_H$@|KkJKEFRJGx%+w$K zEC6`|(!FxcS6{|PkMYoYli^THD}cW?>ieBgh7*fY(%R+dhuoXZI~N>gS1)4F^k$Yg6;i07pK?d zE|w~L<>si^#IfmhFY0Uen{zgtb9iXGkwS@$w0(ch&xJV~Yk{9~>cn;IqPiJ-+i5E{ z+`*E!G3eJ*HP|fVYz|qmxey!e-Gf^H$7bxfte+R$#xcgq%*xB8vpe`~c1YgB*q2vk z^Zz~Fp8m31D*)l*a|oNcoX^j!?^Eojv9CQon}<7c_Pirze+f4e?^?-%pMtruchYYC z)Zxv1x1EQ*-Y@r&2kkd9GDlTQd*f63t?iVYO$R3RWim%e+q)>oi4uMY;e34j3!+z} zCs1rl`n{-P`;R3blC`99@w%(bP5dbF8|hQce7Ajv_*&j%wR*00e_U)Pu(8m-THZdD zvte=~Z_)=OAM@CRPsrxuzIF1^V_wsqr{$yigPgl^{cKk*4cQLTmd%!0(rCh_^u$GV zl9crXZ1%2P&$HH-{c1WeS6?h;AEp~T$-(y>rI)a^RPun8_>#{EKIZZ9W%2Pm>tyzz zR@E14Z|kgSq0L%f@{k~Y`)e2V_h(KOth2RuU)DRS9@xs-ZvQsx*K`jnzwgrK6v>0T zm;Q6oqKZl$zOu&ppFLOYw-g1d{qwYUP&E^O=;TF}!k6u~g82F0=g4MS4>_P_R`#6t z%BFaMLoH7-w+!Pm;91n)$8wJDbDcHzxzy0|T5DD*qwPcV%~P^vbQI(U&&kL?A^83p9JvX_ou>OS%t$yj>PVF6nz4(j7(`uNGVEb%=zx;2s zjB9d!pQwuZtJD0=;LrYaTAeQb-n|Kb>^5Pr&k&b=z}bLA%TMLBOHUsR=OLtZau9DminNUP=&{O#O? zKg!ALql@_4rR~R8d=x+Qi+0Mq#=ew1*;3F+_m!PjC=j)lf2|+ke8E0LgY=Q3$lC=g z^8vr^zBD%-@Utr(I+8iS@M;SAp`EO?2PHqhN}J#3%|v;3F242~wn@_RVD}jt_M*w)g637Qd#q z@>e#b$_nQi8AoA!w2;QvxS+K)ZX)0PrT?G3Zvn5eIQpOWGUuG+oP;0=Bq4+YhKm|8 zDs53wqk=?5O)d4qN?TO^EnlUUT3V^1hC9eDLX@kD5+KS&1mq$SqaXruQxFhPq5>kK z20@4<@%(?Y?|bei0czT>{l1*%f$TdwJ3Bjjo86tARUJFJJ>00;*FMnO@tJ+!>i$~j z-57F5yuhh{9kV@H?JFDdKk)f!-wBcHpfGx|`(+{P&wyTZKezZB1bRhBao1GnJsCz1 zBVmm5qY8(Iz4*CD+Z z^`3JKd(u)TcZBg6yUa5kMpq1zF$)cPQqKcGGvm~0pDf7D31>lbo7L~5<=9pE!7H1A z@d$I&%b}Tu8b|~aDR!yM=AK& z2K-$Jhtc*1{e0&l>M-bzLjM%?$b24jap&FECD7Jve|0hs|2};9QujcSM(Qmaay|eW zVpC?`2O1dn?Rhsit_1tjt(bSExkh(S=)2Ok27z9e4plx8xcOgU^kTIw9C|v9c5;9k zO;PRrbp*{#&tkm2qRP6D9{lo=1_Cz}Ceu~9Q3|*^Md!js~ z&%3h9y2Jc3!z{8Lh4ht3-&N+W-_{}vlsn|@a{a5AqUfsbz3&FS-AhjS zUXr@H8}x$hPV9r_3bCz$UZ?al7vwgu61Lc~H#+Ey`Ktry`3wdy&qqwgN>7uv+zT{& z_~4&Fc-Rrf1KOPNH_guiaFav^Gojm2Rp7p7Dqu4JTLjp72um4;ia{=dg1=&>h40_X z7T6}hyw8X4^^^ma5dk{^SSnx`deu+Tx}JwV5&_EqEGZ&w4q%=TSbL=H0@$d|Rn}Q@ zM7zUF$f?*?SBF-TPk-Rf2d;lFO#1OKz)AqS4B?Qvf}Pi0iK$pS$UK{jsQJK~IkPIt z{$?%U>m%Sfz%PFe<3Hd~0WqgqHW#6DfIL)T_XJgM!e7!0s5_Le3BvM|ddLE-FJN8) zsIfA*$Jk{i^k>B7BFfaG^N6(N836o2e*8}@TY^xYBJqoXKNk3%g#KH=54L6ORfXHy z2>;u_>kQzB@_zuZ62QEOkL2Hk?B*j5Qv#U}M$#9RQ>qU&011gqbFiV;`Kqe3-q(}y zr7!YWfi&k!|Mnt};94#?KHLFg%w4d72-7I9bLS#`3DTEbQ{`KXjcxOUb*^uZPr>xR z#6h&tKR${8(&yvfQP9Y`smhluxnqC2j(&jAF9sOT?W}-#L#6AKlWO66zZq_FROfS1J%3=yv34__-2L8 zRC_F!y;v@%UcU*wYP0eO)C1`@fyPqMxCHr`E{jGT^HV-9@vO!OcFP(JVe9bj#wIAG zn?ZF8sBX2_@-jAOp}xo7S>;A2+O%{O=A07)`8w8(Ax}pTWos5 z=K#>F{;w)uA_f4n*rFH3XK<{)1HOw+EAD~&uZDpFytA(!2_q{=P5a{;#9nL_6?xUcKE5mij zLHNDY#Oz-S+1nGtd{tO7DMuc?@5jEl=&yaw$ouWkv5fQ8yjF{_Z?=5%cAAZ0!iFhV1v;;&@M36Me(NmWNbvkh*m`cUQEihP&X#XBM<*7!P@}v zc8~B@cm2sb4X0w36DwpHTk{~xfsa@D*0{iPrDelmx8>OF0S`~LmP(3dTJ13>gXWYM zv41@8ly!Fw`nuSqNnT5l*S?WezN-_F7ePKj-h+C0aQuLLOd}<>t|m=Eoyof(i}g=c z`Ovzs=VZw|O8>nHQn)>0Zh$ZDhr=hVJn_PEePaGl9$}6(#_8lm9(_T7)YDbUH=y|| z(6`oGtJIz;rdF9tM!f_*YI1B{uNZNoey9qw&t3u8un5>DzzQN@<$w)}fSmwrUUw}UJd}32bd9(ZzW(|080pgdFEsN1Q@!W`bpWmfOU?5 zbp)(a1S}7*juEh4faOHM`U92?Sg1^g0oHRyQ1_R7rvTOiux1u3N)Me6SZ}~m1g6#l zmL4kj>k%jN@$)WyXdhrApQ{AlK9_Hg;0eHYgNHu|T>M$At?*zE1hr_c0?*X~a2mEt{%?HEY9TeRM_8zwG1AS8PhXKE{quM(6>=A`O zI22#{$s*)CXnK|9*W*!H6a7E6CK6gw_vETpdxU0s7%hzJzYSGo)w-7;2QTn{Kr-{R z^;TY#UWpw_eQQL&w|UP+dh*!3Zwh-8P|6y{yVOy?g;t-d>9U z8yEpA0W3KJRti{B1Z*2%o(R|hz&b_1Dgj%1Iy_$wHjx%Zz`TH!M!-4(wju(S2iSoK zSTDfJBVhdj+ZO>F2H4>U*pwLb=10)Wf&9vZ-qf>Sk7Oau38d*c4LSwFA-Xx%o3|&X zV!oC2rnIMwMOZtaexXL${RBHFBjoH5{bZcgGX1s|vd+neOt%3at3bRvm89mTnCR|0~X8dx& z_tPJ7X8a_`C&{qs_pKYhBY4OKep!=h^`3@#a~Qr{R(&8a;N;0-)7a;dBkeqW9+wePpoy(b|1EK zK--n81}YB^>hyp=&G@i9q%6UG0O+<-_Rhc`fU;va#u^|DUwC>vPzKy+_Lp7K4M4i1 z{&XGAKHYqz>yvEfcRC?d2DgXFx_fwjN ze%mwS?*@J)<{8xwT~YW^{m=y&?M}4uk9b05EBr^{cLM&3MmGMYy7ATikKjXxU>O${ z0zXzgKxdD7F9!2$F63K+^rO)4)jVBbrH|T!=&H{0VbdRdz9u{z1&uD~+lq(V&W#62 zpN;mA3|*m>l)+m^`qR;4yQJ@j^d`n4mHu0I?J|gwJ{RfdBmD`aS98l+D}608sE8$l zB+xjz3}YzzP^j)n%R&1@P#^6Mykx)zPO9=fXW}DPUCC{(3nTaHuuW($RcniY%SdN0z?P>Sc~pEe+B--*!c+l*lWlKMERAt z^@!_(xW5GBekXA^Zdc<8RacA*{S1ROG2_5@&Y3oblR9g+5Kje|u(Wq)~;2_EJ znbUnG^abQ|M~r+T-_sSo1_6KDS>ksB{vz<@ea5zZ$pK%%y>K~G33-dCE9{+8v1=fj zoF$*b$g9h<(d+9x#G9{Si~%1V!rMjHzv#MAK+r%czo9|atzjS+Cz=J!IjJCMhE z@Nkjjf&Nx!JMXRUjI|MCyOYgN>>a*&B=YLG3he`BSSR$QeMe;w6qsxt9gEqKZgfkX z7JycF)JsQO9`^hUox?sil#Q~tBSr%363KX0inO`Vi++Q!{6x3k23Y6ksses`?6Yae zFzByd@G61V19(?U!eBcB-k7ZQ&)7=~l=!}g zFRmkg6yn#`65k%_OAx;_rP_CkP2VopFD!dH>xf47!bL7SfV&&GPy^IY>g+IJ!yv0y z1%ff%uCibo$6j3U4Gg_EstlDF(Y|nA(F@5tzK-=1c>QO!uOiT&0$%rr^BNqdgUw64 zt4xpCys*3159!N6D;s+4Eq41FFHf0_lQBR1u8lmc8)>Q4#VwA`LCJ3m{_vHN$vdQ$|NON5*;(@CAr0ImLM)o1mV;CkTh0B$+b zS##n)?=8W6WYHON9fp3pI~U_;2{g@Mn~GgexCMCW1u<(1S|0ij{*8SD?RS5b_1;A+ zz2kO_1#-6wqdle`U_b@$?#AossGk79ve(!L{`!EH7?he*Eq$$yVM<)V5Hy+?ThiAn zd#Y^6xA>DP-$~S~`RlWySAZ!pCcQ2w>mbnU@mZDcFT!6d(0eejMpJ7Hb>;C1r4!}h z{A8#(!WgR$z?^%78lF(_8!h{vGRW;AFgascZEn17#D@VWrj7cxkYg!l=pCt!UdVEu$%1gt>l zMZk&x>j{`gQG-5?za@b608H)uVz|Ev^GYh|@?ZY4VjtJAc&{p-KfwjJk-xG+bkdeY4Q#Zco z0HcKdg*N_gqws@<`nc^7$P1I5q+N@&o{Q|X?an@}luPP97kolBgpIi?LZ1|e-}a^r zMt8|e>b^hnQuu44@Nq~Oz>nfn>b?klZmZ-qCMvBsi9_u{Te!&$JG@lv*dPpfN*x!k zMIE3X&qLU%W6KUm`a>DwW`HN9i=jU4HDPdm!@Ld~_ex8H3QS@*x$lX9K%PP`c@5eP z_`FjGpPxHJ`&Up`2%Ud>V+j*;oa?IWGJC&`bys?Iz|W=VUIUSbt9iA0$IP6IJXE`d zI;-QDScWOg2!b~gc)fu)0AX`XC>{>tLh#lDZw2ti3ErPV@o<$(@SqDwe>e(WycyNL z<_ODA+JFi9WdnAthVZn;;cWmftH6lQu9zE@ZCOX)cWz8m-GjEoJ8F%vH|bk5Boj{%THjr zfb|2+D**fi)&sDCfHhVS3)UB~wdmtF*f5cO0qR5O-H5O`6Z_?82ew`tbzYMLocW-! z4K!v6ji5~I`7+w)LKe`;K9BqbBnvL=mh}V_htG6 zeLd3dK-wI%Gm%X#^ae#m#D7luJ@a$gq#xlZXsQujHikAuk4tVj$U zD`M$@n2Yr}7%HOI68($TNe^S0w8MQHAWzi&H3-X3 z+T01`F&41-2%Ei;N3hM^h_%G=Sq3ewA?qnZ)R2 zYK{<|D?zhoH|UZwM>Ma6XQej?&sal5vUaoE_*2Y+SbJ?fHe>w%L+pLZ{)pR$xX69V zF5s&WZLU18+IJdZbC_jE6t%}~*MFIqltn(HhjB#u_zvVzi9D`E_)PnqUZA)(L4Uug z+IK6$W+w7g_Bj|TaXcmtCqxHpzXkdma3Xau86&zNZawlV3GdfITe4uk#&%e3Z!zY% z+k;jiXk}x*7>#hq*d%(k82e(hf?kMn_Cs_ja0`K3F1TuJ`sc3sb0F76sGlmaQ0Y(7 z&v%37;XA8+A9(8EGf4B+#F;Lmkvk@zYHX6Zr2RJNFT=zAfOQ6}_vGp@e;fIL^#Uvb zY2+tq`vBGxFceY!1U3+`9)PKJ8@{EDjRj2Tc@Yk^(-u9Z1aW;3*G=Mra~9e~(APu` zqP79A*Zt?FBbo0(W=K<)j+6x2*}%&I4|fX>_z5f*ut9)5q9C^Z2iV~dSa-zr1+2%E z>U#0r-52yqv5@Kmp65%unPu7T)G?Ol!FNmdm^F;|+cIKr{HVH@KAH7C z$h(FZT}2-Gz}<&(-jA^SRM}A{l}K;M82-W;d4+m!>ZLK6weHBS0KFA|g&rZ}_s}!a zL;E)6Kt4t{wC;MkP&cUqQHR1`AB$epysPE|bzRaSlU2l}R@r)1`cei!7ID)Zs( zXQVY$rjdxpP}SHVH(ABV8~^6~E|_!a!^s3^0W z#cx!9369;}5^$R)F+0wc5Hj zc6(TQjB9n@8_P!0GNjKfIAz^=xCH5g)9l5a8^f8XuFdteGUlPw?^q>j#)iK`dAwz=U2XY#?AlFBCQwFrgO;n+aI22-s4N~U%>QUMcsGOo!_=w$;INiP?$NP0bNdZFd$3s{$k zdtaAuV+HEmlod8=bjQmm7pxDD0YXsY@+^xJfe2}?84AFrud>=si6-bYv zO8o>@3E0vInCC;ZFTmnM@VtP{2P{;d=?GW}V4>y91FSd#)(fzi5wQM%%>b-jNFKug z6aGSFJq0k~FEo$&fC+!0urk1eKarFCq-;9?+Z};-7_c1?uxh}z0d|*4X{Alt1OCv* zTZX{004o73l;=)>t&PCz4%oH`yxxEvjldfKSY-s>D8Q1ZK@Ya`mHA-?U|zsF2`o6a z;Y7Tje`HhTT?@QU5ovb=*5wRo+Y8;jXxEUzWIGS>&F$6Y+z4-7=DGi$b%JfTf8a`e zhPI?^^-d33s@0g90D5zSYZfE#`HqK#sc;`!Nd9@{Cpx;$ANcX z(^L2_1O6u9UmQM%!ZQq!VZ=MaG_e=-(e;KTBw- z^%VBYL;IPm-nMAr9Sx|-_?L&Y=C10fyQ#ea&yE2f2zZYe@It@`#ekOpUK|5n2Kc5J z@ZEr)hykwvJY#n>pDt{=b%_D@0^TnIo`dpshAfK!?~Sms^N*-2dCf*4E&l1LsifnNdqhXlVvG`_s65}Jpk*?}~jKeW#b;$x(_Gdhh6 zG8u(5eI=hmmd+Z=SIArGsw}GfNV67c9+Wh1#YkhX*8SyA0$#t5(U10oulWi9%K*%a z_|P?<;LkvuHv)eVVA-|cZ$ey71b#VSoom6bMqF+Lei9CayVruBjkx>>{9M3#)q>v( zalIq(`vcZ52EOY1XlwluSAepckAPcu-l%593%SFTJSgnbc;aN920hiA~J*XukbRR0KR8m zwep{B{xJ$aXnPJBOFQ>|0(_Kd7Q!L?fbXHEm}W(u7t6fW18GJf&83nC{EiTPWvFp; z~1y7`z`3vx65u4HdX{9Z=w-=XVrLDD0Jc;Ng0BO)I$tGKuhx31bP)8Tl<*)a!7p~0KEPFYF|HuL)xC$GXC1% zJf!U+}UpH*N=E<=WY*$oYm%1PDS+%NU68_awsBm}AdnIr=01u~YE!fVblec%6Ya0QJ5JWmbD;cAdqr&!~0J zY$?*0er4~OeQD{pQTvXy_*zo)ANZXAc<`Myk(=vt%unF`Eg+c7Et++VUAHF|I*j`g zW6Dj2Up2S&0!{PlYTvIgH<*jV>LS*;j_j2wKaOawQQM6oxA~x#d<;AyY%a9uMU`8P zss&M-cQURYMfzf-e_GNHw$g{{_~N8O$02v7Cj-YN=1oxk0%n1 z{%sGOQqaf+{U;C(ncvhrr9b3X9IScvFmQ{3tMr~wx?Vi2X=_>17LvcfxCy-RV9Z={ z#4c`$_`=TMHOeKlKy5v4Cw0fr(Bt6R>?1w*46H zuKW_Zli;qf(>qmatBjifD?|Ej0t=QA@(7-hiN1CMcq>5jI>7_Ydz7+~uk^+ofRc}5 zzC`>ii4W=x_WU2M^9s#8r0IjYyGGI=@1c6ocexj!evtn##Qzy#b!KC=Bb-TDKKE4l zL8BZv{yj`-Lo)%}2Ux5&RBGe<+mO)M2ABsj@awk%I{;Wuz(V!dO29<^epq+ldA@>v zTU9^$sPwtskaIqG?<9Sv80)8?ER_z1^@EXuNy!`7(XrliDFPoozpeI3`Q;~NC;_Zb z2rL({GSKf2*kvZ@_q6Cojinf^bmLyABGG3s*`Q%U4)amwnvfY;+xbh{85I}lfi zyz0{DWK1QBa{WGSD5*R&6sCg$x$_|?Q2HIyr7lCH5KBLZrL*6ZwFrR~0hR}tzh6szmjKoUuvp{3+6a7U*Si4|{#E}D_B(qF>#z3>>2*24 zcO3&h=%34&*BNPMLe^Ia?@AuHihZxLxK-utg?N#df4wekvp--NfT^)JSU0%G6L|7W zt?Q=%uM6-l4A8dL^-{K_i0g^CJ0&hyHhWCzAN4->;cu`$2makaH}48N1B-f}I~O=o z_baHz_Z}+GyaM>K`h^--20(j^9#@h;qvyBipGHmCyHx!E%LmNgCZt{q0P7Bzv@c7B zA?JUH%K_j1_9FO;Z2YbP{KwV2C3$W_oXFdc-wCjC!1{qcMk*z%sQ!H`Y=Py5URW`1 zRCgmXj)Pw_nm6I26XNJrxx;0Si84=+ypMtgaWv1;{ymUW^50JRst`7R ziT5LdZBxdL^&wkPz_9vr=Mz{TTofE5qz>`{D|H6zSYUksa{(_@R~ZPH30Pgaits!W zc-g?a1z}6~d@P`+lp?M-@;aA3TY)tDkS3O%BKakKhxUT}ekJ*-x`Rg`m$lcHjkraK z`-Q|=`ipFFsk+NU+>Q%tth>KfI#uba{D|9)bkhIiC$NElWo6srlMNdSSYZgPJK!?` zs|Kt<+OLiamG)$7Z{pJQrkpLdNSa zuCd-7&-I3mAHjLChdeLe4YOHT#|x~VrksR)E~)Wh%R02*2Gh&tD^|l{sc&+NhcX=C zL7_q)!P$ed`INc-Fz77>y}m*(*tTy@^xhNFw1XywH_Hub;9*ORB#qSl2}h0Z5?RlU z!J7{He+M>zf(yE!@URpU_o^|L1>M|6g=Ss$-?A0jr!f9v97EGmzhwMh z0$3mLf2%+SBzk3MJs-if;A;kOTgZClO7Mkp*HNe4WX+!>YyN2aLF^)6&cVM_$f|Fn z8ef@=|1&I_QTr+=>QIN+Ly5EcXcH!x>v~mU{B2wlI9mxC$|r6bLc98yVSj-hI+I(nNvNGue3L%2M6yt9EP4cEj z3^<%P4vGawzJ>VbJ&p13(i-21K;GDq5A_)l)K5hjjBT@jlUv^qvoCaY!z)=QbmfRW z4|%gE2Cv{p`r-<-iB#0}0coFKwvFB9gM9rQcOZw0+8n(^zrn2!Lj>Mcj$lC9%}M{t zg6wA`*ZA&*B5cmBC9lwKU(SZ|jUC;;x=H_%wmJ|rQ!lHr_P|bAG^6yAI@TR4kluB< zr3;wb!_o)G$6EHlq)e4azXIu%9oLdt$`q8}8SS{FpXOC#o!tUuLO7)Fz@I>Ge^*!i zYyjHR{0D43V<_?t_OmEGLwGF)ektfaAmi>6XXI6`4I5ix?`f*JMf!RrXzupbC?6E& zfG{2~cNo`%+D#+@KdT05TGa&ZqoxAZ39u7@orkcL!S9<~#_Aq6zJDJ>P=roD!291A zt}hh;)(pW!0#*uG?+}>O!#2P+{iMdaXBLz#+Qq|xdXPLSf!7gf z{W_VzJU>9+4xuM7FJRdrFezV0z}f?LIl|&wOEh+YcLzK_0^SMmK7bDdT&J{B`|Tz2DH>wG1}D(q`eJca}#zUkv??4K@NCPOicBb50)LkFZJWkuNz;= zM?UC-z;7a9{G@J^0XqzsR{%=S3;LPNLEO;@{4Ri1#=sZ;`#{dsh`SMCGaLK_>jdZ1 z_l9n1s`5(RXLPgiJ$2(teU~Bc&cLrrkIn(!Vc?k^&t6v++8Lx#0n%KGu*G-mbL>3S z@9z6g`P^7|nfIR`T1Gj?USx)7SR(TQpt~C~3Dt*30hWbwJR*7FCwMaeD-3~k2W$~w z)qvHtNDs$0M42()a-Zz;yi{-R%em>ty)#eu?Qm}H~{``e???+yA#A;UB6 zXN>}05&CW9cp@~45tj!Z>(Vva18)=X=;j*h&EjA`QA-7Rhrr?sO&Yk>C{Gq}7b9%8 zu*y@1-q;0m`_x!7sI>7eaPT|@wC+GS^1e|lzefXrzaIDx$H3R`^YeKl4*cyg0Qjl5 zoE`mq(A3Ekv2@ZVw|)+#+f=Im_9_5^rV=T_Y;n&&cS z_e1&vD8m8JGS3f79~=j3nX{!Yh>MY7e+-^mNna=f&5A2(eD_Je`{u&Xa>iPcbVm~% zguWO<53=3?NrIeny4Uzl$y~cAOm0DX=b#sO!DAoLEWO5BcbO%ism4=Sx>-**s(wDq z)W~&h_*>m~^N;@dD5&yraf9L&lV)pkeJP;CXAA7WSK?z z6&eFTV{ES)pJ{@RZ5PCrn^l%+wehh6G!k5QZ8WMuBdbr1Z->Y~OM~F5A-{7_uLMZ-ha$jBhK1{d zC4d!2z)As|2^g|hKj|CW0Gkm3I{?@e!2Empf>#MxQ3O4Y3+)jwzfLGTdI1{?Sg5Y& z1-ujBO96Mty6|R8|Mlu0E2FO)*B~9hy?`@wc#Ur-!a-z^1xKj4dAY3>Amu%BaW4>Ms@vMdJ=gMc5Z-<<$#6kuM^2-WXoOihYI zc@dX^b|Lj?&xt{MjNtg!EwREd_M&mb7*N$6E}6S~gI=#uXV%X~0WZ1lx#?%6NK=S3 zb?Ikb@NgJ)-5xy1+Sy!et#@E!))ga6;Qd^w`vHEOiP1PxS2@7(j<(0l2Q3_XPY1(W z_?xzZ-y8V-{rET5jW2C-Y`jLfPlW4*GXWb5Sg2mO6tKz=nB=tyc@6XD^>G`!UDW>8 zZ8h*ujI8nXMp|<*@YUFBjsK$UOIyfrYm_vmesoP~ul-S9-rv{w`pI~IgP%tzjAFy* zHCm!6*~Y5Mw89Qs_FX05r3dQTzowLRN-1FZfW?|4ciZ^>Gqil*S0I1EADV#tk7S)m zU${N7%wZfCy$EeSVt+*KWeCkKQa^vK@pT1b<~t};u+Ic_hT#54_rwCtXyJ(2XVm_q z)a4Y=bV2TFFRou$ySW*=#$j`L4)E8)eOS-OqWTzQ3O9bXE1_H6mZhWY=ZZdGjXVY* z%@%~so|i<8JGGr-=fGV+DcW9L`n>e}p1|vaGMovo0C=9Ub?f#*uLO8&&wwYg*ao~o z<8b~WGh8vv6f_tZR>__Dxecl9HxBXdI`ZMab(uPJMeI?SX z{itSE`lz)?aNIrPew4^zA87Wu_muCL^tDEy8Js6%O}b3_8bG$itTpd?V1nI$R`@*W z1*{)nq5Cr(0qYBxf1Z@Smm&Gx^Y=x;9|%|>lY)Khj1$A0!5#Uiv{c#iDmU2;R>$Ue45vFJtQ%f&I+&pxLw79xv|< zlSkCrN7~*AlxfOSHI`4Zu2Sc}Mr~v74*!xNm-&eMTKY};8Tk{lL1RQ6{7HUtr9N+R zuq_UimzSY>NL&Hpj{0S8^_zfC=NX90N4fq2JbP`V4$Gx|uRz>V#ML#vN_nL2Gm!UQ zStI}9r?KT7I=0|^tP2`Y44p1u6WbAHfv(wgkJ-7%Til(M0dFG0=4j-7j%Pp8c4s25 zj5*Lp5tg6GY$;&v0lPo|N@l%O{Yl^3fjm1S4kI3X+gRm2mwk$4$TfSeJ(i#PNoe0a ztFgQX((glhHJ0zP(*KyTTx3uTv(w7n!M%@Mz)F!%*7O?Rqf*W_weYF@51fzI89B;W z_Dlph_MTDW!&Vr4q=H6pju0ONhyA07$h>`uhIfBskJnugm%2ZE-slNfGGI`()KALM z53nS_Lg$hKz-GJ@4l4qz^5gLNr3A2Hz!TjCcU#bB?^ks$ePJ!)b_2hzv0lc_qrfWw zjTeMQa4e5`w<-rH8Mwwl^Ui+kmo}P@G=q@l8p%V=CqX+<;b8#kvh#0G`7Xes)x4-< zsLW;T{xovzo(X#0QMS8<9)2RnrGQNV%s);GY&~EmWb22?*u4+1{(#lT*qsY{*)Y^E zhy11^OhHo&tUGZxE#JRy*-c$k0!Td8;w{Kjyf2xAw;)|=ZXAF*=nVNx0|`?@`B4v{ z`$jO_8NsmmhtEnptp?J8T^Os)E&>lTkp33oA^46w+H2sP4R5f?-aX0>+%n*H5nNRl z_hH=a;=UWah|H=HUxD~ciN{Z1Nq9Q58nB-!hy}|6to?l3-pt191lRz;+JxYB2doe< ze_G+8H(;fJNqty6;0btaZwU|5b_)=H6!9;jsaf&j#tjHYC-htV1z7kh0iN`y`w^C( zw52lCZ|{XQzQ++ZU%xE0Ey1os54-;;c^w6fT+pa%&Jet0n7kbZUS0d`xxmYX{3QSP zOyu9@s@P*CZdqu?b=Y=|9)nc*kyo$snmT=;v`1bg!0Yj8jSodoXKrJ4tZhe#4+ONm zDz$FJ8JM-NxC6L(pVe6JO@xnWHU1T*(5wbt1@gueY14!z=BEivBvmxMh;9#eAIS%5 zeB;q?>F+ZB+=OHGb*LlJp}Q$xZTVoX;PV>aZqPG_UI`l+Yz*0he{Gkf#Q$fExmNie z%0pH&k?+1&YSbG;(pT)cEI1d*yRfh#58Gh7!TmtExUId%3aS6aHNIZL-?1w+x<6c> zy$w#17KEs?*QuV|-|ETWMcP~rOlo^Afjt1i*7^$T$`OV&h6WU2@jhYo*WSRN0sMyq zKRD)E^=7%+S2FH`=t8Lv;65p1;~&6Zk8u8afWL{M`ZjDg@@yB`elBHx*bO>)%WHfa z5H_y@onXF@o7`K?6{p3aS3T64I0>>YM>?b+vt?L1#ji}K`jJouEFZ6VNOyPz+J@vO z*6tDcsav>KV^TV64)6vcO_!C{*lg}YnqWIsXZZ4zimk+}dlb1yvj}MlUaRrlB>a^j z&7I-$$rt|K52-+FC@!$QhpYNK0UBdhVb5K7Eegw5R=C&zvbSBpspOf3`l|-M%JXmk zSe|`B!}WTN?>Wiy=BPa7@@C-Pwd6Sk_yd8j^349n^4td+!&cknq^LZj%ISfD>nsESgbzY;a%e_QVR!xH9$` zqH6O(vp;C|2A_YB{+&|`&Cs<7e1>{te2m_IQ+=WnXs!j#v1@9q`|Rz*%8ou8uzSnV z3&V#MLD@yXC3FmGTWR{NCQ zk@hIko&fKcV$;U_wUsuiK7+ECeMWUZ8C4vy^=X}zc82T@yj$aY1;Q} z7{{FJl#Qy$vJf=$-?#Od>my_tq0fknN?T#Sf_?})*VzVG24JD z0m}l+ufNF}$I}}68|LpT1qtKvP<^1N6lxr7kGQ3X`=i7K<*w#EdFam?-fwaT-HY7r z4%7mYNS^&bqufs)-%9@h%!7LN=NUXt__KffxAZ^YWdTq4k)J9*V1>TmI!R#LYpKA?Rg**Ux6;GY#YW`@JulDjyA^ZBH2HR9<$Y2M(SxGXzu>5#&aZMfN6}8|TJwmWEv9B`K|}O=bJ5jmYzM}55+zl*H)jTJ8_P~)%9^_uv`bp}i0C|>wU*k&_IZQ;Jp*o;f|0Yxe zl<{dk=x#e5-KIo`*aTWjk*C`Cy2axETyzMj`(o_}%RZ-FSo$;S5YkS%BYhA32W#KU zX{C>9zri{^;~9pu#~C=@_Vx(sCG7!Q1lUo?tgiVJXli`i2iyuraDK=EyaKQp{KHv~ zaU%Du_Lx6F=X@co=7oFIydXU0A}$+oEhG*Pr$2K^dzzr}v34{~6TlV?@gHe?v>kn}@#pR6S)D&^N2NN?Ye(don_S+O-ZXh{TdFj9XIpxj`MI|AJPYIl2Fd~E zX>I9i=BL`yYzG&%r8N%zunlc-2xN#8C{H?hM;n^%(UVc7}NZ`fiQ*i=U zwWgO71oBw|P`*vzldY*bfseJOC5e2rHNBU}uePRri2^B~s^Xn~W zQU-sULC0x8o-NM;_u~|yA1kG+ESCA(3&B*LgSZB+N1GH zCY{t62PX%Oe@FBzFx4ruz@+=qJ~Gi?n<4nR#=A}0ukm)1sx+Qt(s=20QdA4Q(g6Ag z3LQb9Z&T>+D)ccXjqsyelG!hkDOHj|5RzH0B(qpa=39fl3YW||qJJvX%Y=Fwg0E@3 z%A|c7FEgo9T?+4+C4HMxGqzo6e)BUz$Mq`%^i zHTvG3u@Yt8yp6}fAUPbeU8Ar4kmytqkm+e!Qaa;$3P#&cuzrz*vPXfRZ+Z(YIS1ce z_zg|ls__m@=96H&Ps_U*pTEf*=AbDW?|0BjjrTa{1C2*G=ylNp*X#U_gH{wNzsmuUtzjO#|V*4u1O@TH)f-D`9f{@bW9EB%V)RA$s@bYv`Fq{J}L;k;J>M zp~A-eAs~%;?=|!`)aPqN@jZAAeVW1}ucebI{NlAVycs`tHLXwO53izcQn}_z8lT29 zuAwKIGxFNrTxgDK!E3Ie@=RWR4HdNH{a4etmi*$?^lD2kzM77B1#@C6p|h*CaPnG~ zq&nG#i>{#!?ReVN^hG=Vv@@M-$6sGX&$j1}uc9Fr3eM__cx5gecAIBfMX>zRgmSBaF$ps0tllh4Rs$?FXKt&Fo;-N2PkMsqXL>`P| zpihnGAs$*DFOVAd(0}Hny}?6Y={zif1{;~x9-42YZE%Z1SK*=em`{7?IP-TNn&9A3 z9-8P9_y=(e%+c}ut()e?3*@T+kHy$?@KA-$uP4wjBlFb+df7<(!i{wWKb1fqGA~M? zD&~18qk|WCXt7J+*wY2(!g!wOp{?-(8Rr>gm->Gr#n;YQ>UvlC5@a*^CLXEL-*DX# zI^a6(Za@a{(iD11Yfkir#*0(v9jy_``f+9ojt&s?X*@24M(U-gjZaMeE}51&_?2YZ z=-~Ou^rn+XG^O`k{89>i>*5zus4$MVHlb(TNV>w!r;};DY|Bsb{A^hYZS(N<6e{;H z!lPuLeQE-ir_l3>LS#WBA$SN|=}l<3Y@e@8;=*Lwl_Zg0$!2+FV_wme#>qnGne%vN zQ`*>MFb-Qo7dx$SI+n|~)31R8xF_^m*2+GuL>D0|_pLfei3eiv(Kj)?ea-8z2i)XuOzXU&b@hmqz zDJLjX<9Mo@)=2Q(IG*g5jz?4z$IqyqO!RU*Pj}PT@qj{DiLGxXdYDIRG+D%^JWLFH{Z7g zg0^zJki~;j>8A)Ba=qw&J(VUVUsRMzJCi3G_?VE|!D2FEEqoouADs0>_460zojbTQRX+F)@i{Cm3+3H(O2m+Rp#SB()AP{Ze~L9XqYV z@h;P0jZ2w^>0H~flg04U!Z1+4FoIyXTrrFrtdQDtrl(8=H+dHhf5RF6hmwXfd`{BM62on2u=tCDRC)>@dwX1^%JQpX0z^R7KQq=&@6jZog0SZi3b{TYpNM zo`z%jUQn5t5uDE%lhSDq^Z0Z+#ymP*7Iur$sM28|_El$zR+2^sUAN9mBVQa>Hlua% zcOX31-SSkb7}QKoqwn13Bm9Dgt5a#Uhrde~jebQscJRk(K%L%*OVa5`qn-%Am(+P` z8qI0UJD{nZ#|Y1B0z0?eP0mN;A~9WAo7{3rI-N}BUCn7?N*2OpDg1tO+Lgkao73?W zKAlc4H)Ei`+e`D#wM84PYg2W8Ru{F=f8g~mJr4`oizP~FGA?>bqs6wW z-1KICO&5cdN}VR_{Ju_`br_hU>f~RcmVjm0b^ICA{Yd#2{)FinNjX~`utF!sf&iy= zOoOFtqjmm>X^8|^!G4SBpaijSKgcv$27%`cX)YTi_@2REFjYx#sL9`;SxFmz)#R_3 z_Dk?{laDh!DGg~VGmiUq+il9z8ruC8oJV&e%4Rg_=0_DLMGpE@d)qpYNNo9YSvfw7 zo9=dDZ+-MvL=(+w{nZpIa`HPVw8D8Q!k@?UlPNURvqZzkrbfIYg(f!U2~BB#axx&W zP$GIOg%N~p5+dg`l}J15sD(o-?_b54U&bm^tlMCS@`J`;X`0Rz1}(FDa>MNW?>sx# z|H;$;vifci&>0ru|E2=^H)ZSJr+55s7Et|{?MCRm&${R&%qU>+VPx)f(yK<=Dklxb znZJ{s!3MpH-Z1$~7wt89mWvk34&et5i5%_Z$xd4K@3(RFqQ(nd^qtOMf=MG2Ml4H> zH0;R@GsU1~rpd$N=q;0RM-6()5|`|H0zTErbDgx#UmU0$OIm%Z5qsfEg=#a@PBZ)kq6r1bng_C;ORs<)jl}xIXOin79pw1x^gdvk6C6ftpB9k@1 zbO`)KCohMokY6VMG9p;zffKAUYvH8B1z%v@@w|TF`wlv+^DYPKnFl*)w!yDCXaO_e zpD^#kelO>$st8@jh~n4kdj7$n`^Rapi^l3_y-Cj+H#}`y|E{rhyhy7hzs4B&3(~Mv ztA{m0eb{FCxf-I~#p4>G&GYdj+JOd~MEecin?#>+^7bTp$}vHEH;L9bd0i4Maxuc& zT>NGdy&fmwkK(vANp3tKd?cQiC($gogx9!vaS~1UNO-Y_7bMXhPdkK1CU8k3dLgkZ z!n5ScLW!KJK*EV_ah38?<7M1ev$c26c{oSO(Ys?)UST9<0plXR6KjD#(H|^Wqu=9J z(NxXYs^O%_+GkH{E?e_h;cV8iO8KoyDjC%OXxKop!CtAsUa7%esli^U!CtAsUa7wA zmFji` z8=CXM4s^IV@9jXtGq}71jm#AC`&&w?ajjq%^=d2O?2A^s0w}G8gO#nhxC4FIS_m9# zE$HLUe+ioZtL-GiuiNngu+Sb!SGE@_TQ2&*vczd72VU)XtfuU&{vW?6o*%4LLZ+-S zn)5b|E=B-L^}#y5rSWGPeXPOz0Tu@-Vx04&#;Ty%4`c{Ji_zU=l`Dmiofz5VLl|V`X3@2C^jr<8kRH-OPYoy zO~aC=VM+6UcS&=uO6mW^g^BuKfShZo&!~$36V$15$kCKVXG z(vV{Td701BK}F{b{nu)v))JO}8h;NPKbnxS^y! z<(7mS-27oPI_wt28V_Ds*qq2an$hee9@h-_Ixat+OcNUOsAjaNF%NAjA%gq60o3vHV9}t9<6pkX`%|NB~%THZ- z_i{(N-hzAF_?yZdsI&E*DBsO_gC+)7DrGbzGL5GxFx&A}xKX20q=+F?Ti$5UMEz+E ziwkvs9|f=@UN>O2I9Zzx&offZ*81i0i~7MoH{39=xMUd2G(i_{K(FcPfS{IP<^&5b zyiSKRG#ESi4V)5FyTTQyV@@sA@U>2U!VE=?QhS;oV8x^uNNXe zLWm7X|95&qs+V?EFGT+1TG)@hjbIn}9~n}9Owue&S)DTfgRU?9=!*pZ(DemNOg|zi z?k3dl^@YSnP>ddLJ4dGi9ln*J;bi19JOkoJ=whZX)cuba%*zlyX~K6g;v@HLlWsxX zf2NJ|>`THGV)2LjBkh3}X{k$~J)E4xjFtuW-2$GOxFl02~MtV zK?SZwaVJ{Ps>VE}1y!8KM>A+`lT1LqYQje{=vZy~ZI|n};ZiET!h*e!yGCeX{b% z+=n~2CU1ApcP78*kP8A^9dv}PJ@^|eP5e{8CJrUiuZa(bvqf7IA8G_Naoo-J-&gSI zbUH#QzvCDDiIYy~zkJUnt{1nuM7>3Lr^%aL^c+igG4s1F@fLtEZbWZz(fbYwmpk|! zmzcmIyc`mD(kW-YY6g~GJzlf!c)!l}9dG!mv+j6Ly7mAE}6OyiFCa@=7O_Hf7h zO%B}geuD#dyx(T)umE?w*KpvD_XgZ260I0_yx)NaFF}~cZN^q0K-s>DBG zJzW2Xh7A-Oym>YFFl+GK*5I$M!AswNlyAaYF>@V+;-d50adM1Z7AGDVKZz4BB4gu3 zf0`9XlbL77(Gq67>+-Tw;0K)y%&9QyhT`H9NVyBTDdz8bSy$Ezk$Sv%^6zs~qh79i z{L3y`;0jFL*FFAa7f;S~-6QlwBfc{))8z6x8uX7li}3p^uFty{_94K`EJSotriOCkSadpd#}Bwc;02NDV}rLYl>&E6p=#1%4j++V@VKeiWgmhHN{+9 z)RN@|{6@`o1=bX}vgP+1HPsbZQ%rUR))Y^<0&9v&XJAc%3r&8%QOjKczfrH^LX_P9 z!YT>Zru=@RUQw5yl;5bAT>-yQ3tR!eQS)3>C?29>lsB^cf}`-VJW*G~)wS^ur%;XW zJ^{n5XJO*?s*|2|;$=f5ZX`GN|9hvg)}+s5eFRYB;d<;^o;AJfs7QJ|vUiUMCmD z(|68RfVy}hpd!6ZE}juj$0S(oVtCJcJ`Tb8xULgV?@17kmuz>_xOlj6MlmuH0eTfC zX)bxRU=vz|W4yM^MX&g4BEtNvUPkr$Uk=s_TMb11o$u;5)J{X~oQPX1-> zq#oBN^|dPa_qo&l<8PAx%a#^rT;!b1a_d~yCrQ`v5uFz4mku$gMwcrD^|VfTQms>t zs`ooSSMPVs3BKPkDfoWJ4-OjY;P0F?*}=!1qNN{m(paZucH>uY?R7~Hx))j^w8fa~ zmQ-#>KdB==WL@K@>;IeA0_o;xAL%>b!Pyiy)s?2>84s-&t#`YFH+g8h%kc(Yj}Ubf z_s_qFN9H)kArB3W$Jx?r@`Bz8`47Ae$bpyNuCkdS=S;uiX>rsCfdM=vj$VLI={Ty^ zf$_A#L*l5&gaI4st00cvGhw<0$G1PYXer}5#zy99tYw6Q{SH3uq9YFA;w zM9V}FcT8|THc6N8O69BexC$2=a@MxdXuQBdh2~rh(Irwg@KT^#PHaC-r4E2x!Jnnm z4G7>cEL{%H)}>>`atR(FGoU(K@zONQqrj3RUYtfR zi-+bn8}l>BqcQI9(9!ewi8MMahgvmF_`6iR-ts2iGnFRY4ok?+d>i#b9KJKH1wG|`Cv*cxnJaCFX(__f01sIXYB=d? zIO%FQ>1sIX`j0y4s{f6{{~X@{^*?FX`<0S&R({TSNkuCBf1S61Gpl^{UNg;Vza%e8 zum7JX1Db3*zJY#jX|$eJ_?yi=>CP0T;dQremqLUDpvDW26N%NheQ8kcWO=M1(B)-j3%l6X^SR#)@$=o>ceHEYEstAy)r`Lj%QzTk#FI;u~(o zH{6PExE23@{Z{<{WktFEmC$-u@cs#^_y0VPXI7N!eNoi>dOoPpALX%(@!G|&>bS>j z)M(ITuU3j{^J{s(M!)B!I*rmUep#ngnsG{_Z|!K0rDoqozq9mbzh14baHsPG&AO!` z+s<;$I~`7>9=0$OWJ~)39za8s$r`R?$gxIqZ2a3sY%!9^t?wLughu<5STsX&iOx4s zw!m96_T9JnQ$<1iT>qHA@eg(yqvOdJ zh@W6D9@51w>mlB((L%g-D9(MkT(ivB>}5*YPl0hApU`l!^Nj`{zznmkh1zvi^<0n0 zTlqO$)zWwy^2cL-IAzo9hsG6-_mT`84`r;>X*iw`GK9itTsw#HlP*Sa3Mac4)+xia z2TqtYSHA_8RC>$VOfMPy64PoN&oJ##Ptbp3T9;rh`YG^#+k3bvP7&ZxOm8vEq}So% z%cS>oUZ8HyFUPHR8~v(m9J4*Z#|(Omw;I;7C9mOSAp>=df)wc)ut9^B-UlYuO}x#d zZ*(4Q;t=Or#oc8px9M7`@=3kNw8Xqr&s=U@N;Ac&IWm3H;ExR|F)vf89=H_F$9}zB z+v^}aQ}dw%B@>U>IC%mDx7a>#&?#N+TTOr$Xy6!fwlo))p&Vkd1_)kq*$8~tusP(F zC!(=t##nV1f24!nHRT!?-f~&WRKs|v5!KbG&2NdOX#Bd44q_dFUFk(S$o*R`grgIzZ$g7H`0j@KV&*bVo-%kX;7 zU9FaTXe>_B5@?pj^RbB3TNk*VIifP0mhVl5F6y z;C&}NBwY5DlW^L$8P4tvUhJeTMmoYM6XZC;>U#eC95!yRJn@T?;P z;k6EVHgYfg?&GGKgSR>H8tU~{CKsZ~-In=e9K6%P(tCo&Bjacu?pDJTQwo6-(kU+5 zsGkRm&CN#dr{ib^i}fbn0-fX%C+T0~2}({wc!oosuUv#TL0z=TA-?^;aN_M9DalyP zD#{W!#>H>6d2Y0L(4JtnUK>yFmcA<xs3eh|G zWe@F9Z}FBnC3c7NrzIY-Z=Bs{wBz9QbPjOnjDNdd({w$84_R!#X zUWJ!YvjVRUmC0>DT8L@@{87YqYE0?%a0e~>L6JyI-e*KS3D9+;z*q`^DOEMP5aAU`2?tZ?jmDDUhQ=*``E}!qzCDlDotK61F`0Fy zrUJ-O_$zTdDS?iwF#5#! z1X_chkwEXo^XLSc|Cyv$%squI)Bc4iGY)48Qc&A{WgP)J1uf;>nD^6Y-N3&f} zVx*`xDZDlU%?BD1SOy}D^y4svT#2#EW10HVT=v~LfFvW24@OaqKgDW%$*oVL2 zI%<>Z0s^=5sW=)Vq%dJ^ikFSnC*twW!!;OHFtx_hyUdg0Xt{8892c46Xt?tV5@UQ! zFl$`!lqy`^Ar};Gly|4cN+X|v0SXf*bRWD2ZK8lRCU108v4cNyQ=t=z6>dP|t@u}6 zF!$JsXT>q3$04{A!;S|nu+nBQAGGe~?QxdsQ>yVHWN+~Iad>D1WySOCGvmd})6_Uf z3=B?jO5tCUvhKh|>o|JfH8)IbyMi?^U)8{oU=0+j8aQRwzyVA&adc8@V5O7S;!2di zGCeEI?eci_N>QUx_P)Qz-v@a}W7z8?<8eTZpK46owV$9`aW%U!E!1y=4rK7|BWb_g~#2=jivWN4Dnphm8!g9X&?bYQ$e?{j zBZQCP@$cqvmz42Mb9&j7EBcsqYf{Cs33Lu|7Ov}0bMQ-P^qNDi?r(PRTd88^^g$X; zbMo71kaQ!2-*EC*X|&tf>R>8uam~_@cw9U$Kms?oV6IN)LrrN{vcSJ;hQb~eBP58RQL6{>;|}lse|*;06Apd?Uodi%xYZ8+5=LR4 zTVLP8%n)DGohojQlNaD?tM#?V$>Z^bsaDdBckwrm%T-DFc+17x9;Yv@kCQHb<#F*m zCowO@@x;ezyY=yL93Ov-M#ig{i8!`;j8<76>!5QzM&DQ;r{nqQ$K(keA+XTRryiwU z*2kxA-u)bqPYnQZE*tc8$^4pk3$Lk`XHK+ zsA8ri^0R|zjrFl5k$sQQDeGfMBQAf0<~34i%Np^UkI;VW<47ZZ;SrjYq+(!dH}nyD z$NG3bi4QzXRo2Id#{BlfVtFS;c&#zdd6+)4KE7_uBOj*8=c$+%&f~*>r+2N7o#*j} zzmw1Uc%liv^mkg)M4_#2!ejnUpIaZ_HsPZKX?n7XnUl<$2hvvSV^1TOWAGv*IE8()u`=!tXsq&oxzOFE!=G57Bn(`A(Kpt|>1Mp_Z!{}ap)E}1$$z6=*2kx*T=`cTlcr*xPU8>%N^e*n8`Jo;ztVB* z@QSheT>NDgAdZnnF{T-OkVdO zeP(@poyl__q{%H+%nL1f)PwY{^|7-hfAMGXSszb$dE=jHiC3Ym_VTBkS76Ti0UFa*#XQ}XzyBk>VSQ|D%X|Jv$E}Ya+VZMD(%g0mZE-uE@kiQgeH?1XHT`Hp zdlfUSJ%8Mf)>t1~+VdOz=#=#__kDqy*-ksSuu)r>` ztj4U|5K*ETjT*(*sxdJpxsDp6fWioB)T?BJxk;|i;r*6DL;*zy1?263B8Z|Rh~f(e zk%%ZdASfb_0Y%}S>i*X{3?VKui@Q?$eegTgUDZ{6x~IFUtIj!m`}Opmli2WI{K0iJ z;wSc=u|MHO*U^hk;*Fp1!`IO+ClPMXcV9=-+S}QlYR}1QX|0pk)Sh3wmPY;5-t*8; z`O#}>sgp?jl>1#vdz?i7V|YVPnstnwZNV|Tv?r}|5?hYpDLrXS2YXMn0}tv+uR4i$ zI`F0*bmy`5p25fRt37CrlX&h}p5B8tI*HV=Jgf(eJI>BF={VkU4ZZ0kRv*W2UPFC4 z+Ixm~1 zjFWijc>c0GZFLg6kLOk0Y2pcXwwWjJ)7@#6lSrPx4|Jy?KezYX_jBIejTSkHWk2Wl zy3r0NaYuj`cB9DwJ6kNk4|b#XoWzCz-_eamoM`VEdm^vBnqG7gZ=A@_UroE5MEE3r zT{aCXZUHnyfe*n67kdciO%$yllby9j&!C8 zr`y@4p3Xb2q!mu$1NmZcB@O6g?}>EcC$FSuoWx6=_`WM?tCQH>iFaK=6VI@-%{+tu zbp@?*63H`o{uMOjOnc9LXY$x9Xpxgxb|&xn6YX#kcbvs*{zQ|{va`j`;%EOv?>UJL zXYoUSq7i4?d&Zv4cm9c9bP{iz%^zM)yPQP$9Dd<)ns$zz?WuD(dO59i5}VH9K9|#| zYJ1N^)x7?XwA4u?s(HyDX^)fWe=bk@Bh5P3&bHuO9`Hw6=OnhA%b#3EW6rbpM9QlAU#J;N{HZI{qIClSAZ-@1f8a}r-(z_Ckc!msUYQ-95)E}<1p;)7rF&L9o= zjlC!G8(tZtXPm@Kzu~8XwAD%M{tb@_(!>kxY%?$9uP&xlP9k|Bzk4wa`K`U@zTfhK zi)oRQSoT{UcQNg75_eq0w_Qw=FS4`6F568`!W3-GM zS9sj(y)r^{2JOW)kIGN@C$gRR}4YqOZY5T!EE``?`HXAE-^Xn zmgb&iT`9vmNA6@@PB%KT?<}jAOzt=db-;RW>l6-7^xRAE^ct{})_NzImwSKo` z8JTyM)HG48sJdMl?`|(p&5&mPsq|CP)G&AJp*d(Z}GC&|Bqm0(Lc>@ z+Xu=XTMkxPa)vB5X&v^eRZj!FvPwe+S}M@UT=A5Q+r#)zG5%8yng5jRzpES0?b|@l zt${YH;aoSCL>D$~k?bGWn zY}uaZS4XUK(e||7>KSFqMdAw86{Mi=>aoZxqsY>t40jU$LNwUiS0T zMYP7x(IWcF&kq;T#60OislJu|_lE(l7o}6V#?7CJ{i;MhD-iFW+gu+N&~37KEMIxn zT&C9NS$7oD>^zqL7v;NUZ%StH^XYljKV4FwvV5(?VTCOFaQOebP__j5!7}PCf-LTO zu1p-!@Whs~MtGR}?w0hV#Uo`UPY#c6Axn@p@RXJ`zJz7R?2?KFE$NFAUM4GZnsBlu z&27TrGFseR<=NU?74F|c$@jESg?Fg69JjSpMTfRj$DCj0tf;k{VxR9ISNSkG&o^DF zE4$jog9>H+cw0E_P_q9GPX zis%7beq8#{h02G}#6tQk*VM}OO|%ZA(nVs z?_k>I<&-6Bbop~jt@4x+!`;@=c0KKnlT2r~-j+ju=iTC+Rw63ej=RKV*A%sWaG-a+ zdteSdnBz>OWao#KmB*erNL&`gTihpyqS<`xnckUKnJ}#IDzk$Zta|E+7%d+PEvvW$ zVqvpR9@29wUwtOcObBi1r>8VKO&_YkyQgL$WWszkWfLNcs zWZRl0y)2&WKeE*J(bD&K=iqy7$@W4`<~%pOKB0oND)c+HGgG)MB;RR*I>O zrL1heWO~~3S22LFBbJG4eDM+EWyv?1c_LGsoqlM#G1keQR5(7d#aY5M&#l6r-RV)X z*gwk3;+3{6{y7)1S`9DT=gS9NuY^QHl(w|K``Bi%meYB5RbWQLqbe+J0?tW_H7)Omv^|u)sKn`H%pnu-aOJR_J=>Re+AhLfw7Nq9Mlgx zqu+>Kh+QYr=hG#7rMu}RJJ{bFdOYYI?dm z-QuJRocuQ{OJX~Ny-2?~%Yr8{o=o2&w~X|L?JeuP&P9l}#6{@a5*J}Zi`t9ua*NuF zFt)5VF2`+RZ=u$>iwUy$WBpu-VjBB=%i6dcgIm?c<=9+a8<*pa^4ho@v&(Daazw;2 zs~Ta6TicywwQ)Jbs6@x*c)F}MF2~ds>d7Z}y~RUY)W+rbLgJ>YNrTsO_ye)%Q=+Vb zUn=*pn(uicmuEMp_msF!4A7b@dl#9y^6_oWX^|3_`gl_XZCB#gK7Or&CMx@vX?~t5 z!6}vazMt=@paDwBVvLq*L-UpRf-H7#L!T*eM;<@bh8|RNHjm}={cY$?C9cZn-L2_v zH8LJlz-wB|uTaEi3i!F!^sy2@FHrU|W7OoyghCFtR>9th-YVqvt!R%D`xNm@t!Rd_ zVtZ1o6h~kd+wVJqo>k(KCj3<;ZB^o~CcL_m9#MD2<4t*CC9P26drkSFO6u24 zM0q&eRY~)dxJWEx+R~>=+%Buz+tN7on3!0~liJejN?cjW1KZNQu#L-aB3~trbN`yU z$S(O26(1!F@7i-vj5}_mYn^TRM~d;(<$SIEy+HEp6ZlaTEI39ocjcN|j{xnJ7lY#~ zR(R;jve{nh?`k39T=7}#Ra1A9yeeM1#B=`$wvOK^dz&S0x}r=>D*L%wh&ac^;zCSj z8SnSdHW&ZPEz1R+Q}|9tKft!vZ(|Pd=!a4EhH{yXl3VShHe1|uRhhVB80=~xq8KH< z|eWS=Uz8(o7dI-KGnY8MU?yf zG5dZOOJcd-#mBT52irem=YBuX?90{BXR4!@iTI?8B~p?6R>gW*eyi);^ugXoe??`V zWH&}cX^a@n%8yTstE4e&q?52$_KKD2Ngyi-dZMuce1Zi*=4?3E|Z9oeU_bFR4aPlBo15LVjL@v zH9R=#+;->aJJiva+ea5sjxINZeB6{<;Y%0y_b4mX^rNp*nwe{BMnut!d@B^aPqj6( z$wMC>RQ3aG`+?n&b-zsZ>!8k$CA^m|per3s6<5i7=@`CDVx9euc&)d!m)?6%kJKjS zo+n7|(>-D+JOKBg_adiEKUeE3#n+^(LOv9Tb^jI_yvY^u%Q_N%#4p{ZTcp?Rsn{s7 zuRQ#*Uww04=cfm~{E@`S^2#ClamBk*QhG#wWeJ;-lFZxuVj?K-(LR=POEKKy&ElNG z`lHBua@6KrUL%`xdA^^v=5`l(qwg>F8T8eyc`{G6<~6a3cJUkHPQ=B_CB&Co7Kcdp zO-%m>sk-m?R(xnLnff4)-u3dDJo-XDz{pP3NxN5!{qxkfE-`MlDrV==?KwOxk4EP3 zq&#IMzDnAw8nYtjcMByrF@^c==CW|5MC5rn6|!AC`Hv_ShaNnsl)}DC zL|*Fm%qf*V+o?-SWxC=n@B5{+ym*vHu%{`nY)1DtW07Yz&k@q$A9#egP5Ppe2D$k2N@eXYeJt^1lBiUdVo{}XnlrCb zJhJfEO6u>K?}}6^FDbj*$_$n2V$IFx)zZ-_;Dv2zMB!@B2NkqS25=R$sL2T;f8B)p zw4s4bFB18KrYey7=4LGNj8YX^{h3l;&{o+M%9bxmd1_l4)VzhrkIPI-TYA=(-*3(j zx25gPRi0Q2eyA-y--5@trPVFemXBNT*tYa_iz1Q7wB-BS(zKSxhaxlG9J{H z-Y8Q!*OYPJwzSQbpD5>WTUu1ksS0|xTK4ElZW}9oiBBK-IwIbD7K_&*Rvv6fc|e$B(PZT&<4JGD`%LmxfPUXujqId z%i3T6NY<>~gJU#tj&Z#NptxJiO0f0Fo27AKak`UF<7I+Hxs$PEqHMCY%_|ENKhFO# z?r~MwKKNI^Pq46Z>`)YBNmn-Yvc%LPH`x(Gz z#h2fe6?bJL*7|p!4^tg{yOW<0UA(O`a2U$+nO*$LdFHuZX8PFcnZOcWTt2j;*a6=J z-+IYRx4)r2;LVjWSH=v;%z(@c$jpGOJ_lrtXCQH){nc-`7nfC}4c?|b`wo4wug3#D z;x|r<4SBR!)$=cR#lSq}gL_<_awjT_l$U$d?A;vik&;E$8_ERY z7H?~jUu3mqyFFjn$0`$fip70pyHzCe`<9wb++?*E`QaSyFGt8}D)LI1Mw3qyImIGN zkX7+ce{U{}JSF#MANuLjTz=19;QWqXS+9$4>9_m~q^)u)?T;1z?mara;H8gLlfQ7a zUh7qU0WoYf4^cxzLo#j)k@Y|N`wwKKf|uYYNeROTUyR4%*QuQPo-P< zfU831}xQMo*@DJ{t5 zK27Og5?VwTo~OJsqj>bD=uhWd~8Wb z4PIx_hqf&7yFRk$DH#&TYAG+TwUkkX$Z=UaXGwgRt80fKus}J5&KI@GMcXH>%o>_Y zl!`O3KRxY?efqeaA=T$T45>czVMz6%6dV?Y*#NeHtoZWe36u%|*Sxo3FFCg-TAb|R0K1)90aMz#L!kj?2dWP?_7bsRD-?y*lt*0sp#>}Op|b{_fJFpxj-DCq{B zq}&u;T{eJ~nX$X7G7?a zmGf`Azgd?5dliWH*lRcD%V4GX@_gx04)Ltam%eRhNsP6Ql&HG%bDGQUcXQfEOx(Nd zkJuw}zjRCD@jR9tbMtt69<8_K5z03AAjbd$-O8}_NBn?~elEgQ%I-ysI^uqM*;OX4 zK<<<14Sp5OQv&=+Pgk~x|E5WPTI((nS%RiM>KBWDB|qxnsKorU<%EYN{@(^$mK)(A zKi%t9d1M|zLJTgkWifOZ>lZ@@wO!ni43m0U9e*|RKtFxL%GOAHRmqkSVjv^|c`cPw zqKIvhK!mpZvBeU;_iJ002znBHaB7aq^J0$ry1&Ynw~OtGPXZ0A?Gk8MqAbp~Wr^J> zPGZ;P9xdA^tG@4h=m29-BnAj#u^|p!pAt(xak3^if*2+!Q=Zp6JR(Ors$#LRge%0J zK^iGRiAPzyHAi*N#r^BR9Em`P&h-8)G4%d#W7T;_65Yh3EHT33NtVRjR0bo%nb%k< zU}-o<1@X0O!^mg9F+%@sO?uIDIImf%!bVoTldU&~kdDK;;yx^M2*DvViX@r)>r8M2^ZRxtyLW zApm_$S@qbbGhL|$FYo6G3SV%}Ir_m}X@G8)-L<($@p zUn*Ay`gnL-F%6ec;KlT+hZh#B=;vdKX@}f@#dL>^9E&Bg?yb9u zXae&W;^K{21BJYvNlSL}h zv&a*3d7-#Nw&lJ)<%(~(Pi>dkvajTkZos!kFD58w| z<-{}Z`RqL3v+)XV4BvbkLmL~;6*Vns$iv0M=3Z_LCwh3cF)I&Br8#Rj*zsOA=X@?J=twfH68F$`((k*4Kl7-yWp?E0PdzH?hw_}C3wjFPIX^Cpb>mGj7 ztK2DzA1*Jy?o}UV?AD#&^y~+E?Vf!P9>;S2cQK7|HQ(cgGQvUaN#(8Ozhef{6 z+vVT(jF0Xm$5Zo)9+_ymN%S+p?Ge?iwRN?{?Ge8=I`DQKMreoU1KynV;j@y?Tx)Z! zjpdKA{4th4hsyG&zHDHWT|}OWa5z0rMK~Ogry?AV%p>tVyfsfvstn4fN12D_sWm?j ziU+P7wS9XoOU|i26Xrq-z?2V&H|Pvn@0 z>*q7&^4{a-6|#s)EHeBOkWtCIRR8@>&*@9WWt*CS8_zsf>_C*bh&hr+o0NmOp_a-! z(c)p^&fel#etO+%EAp2X-{GghIsCbw9?wy;U0>y>oPA`)o}ZTHDmjts86s9G%G++t z=aGtE@u|&U`<6NPTfy@@?4BBYx1HS7S^$H*YhUBopSB z{*velzFr*FIp-|f_L;}Z${7Dd$6N0vuXv)AA>yO*H1n$FNI09M_@iVsp|jPi{F=%3 z2ffOR?=p-Xvr@k~NJIYYZLW^FI%W;q_qc}b`+hv5elZ}uvTT+8dJs`w4-4(r!#w-- zu**x^J<7)PF)z=Nn9+DWoO+bJyH2Xu?Uf}+VumV9kVKRvNQ;>^il0@cKC(Q3X_fjY zDNCni=L|1D<5g~h?04QlRE^b7gVpLMd3j0IB1+Y7+f~15S3QE2b6wdk{W|&Ly6NB7 zDuG4h#NsY~mTA3b(2E%f-dH%HpwuT3>eU`D&T`0M98e`;-m!OFnwQ%OX$q@?xKgd?)f9%yFOU zU5P9KAB$@x?5cXN8*a{hMx^LkBrGDt*H9JKz)_9(f z1$C~Lue#MD89QUM_OdoAU~isf2+p2@HS0 z$2?PN|A*&s)vD4L-O4QJKcDi!&fom9Oe#2vS6dVi;e8k1nM)Hq9VLw6J06dOF-&7aP2zO+wo+R$|Z(5j7ce+RAOevrV zzFQ|saX+uhr-Z${GGkDoPVH`tq2@5gP)~5}7)pBndctW2*N&l{vEx_T6JPVc8AHiy zKu>%hX#p=8mi9z)5mN-l$~qf+G?txEaHAMTF09`!gY z6s3v#xMVIo@;4bj2X!XBoV#gd5veJ){vKXgB0;-&Zixi#ddfAuL>6XVu&0(k(aUX3vkN_>?`-C|MBd{j11tDRtduu^2*4vCdc_`7HiAmxkw*PxjNI z9Q9q`LwlX*ZMi(cPjAThKUb}TlNdKXXJA=&iX_hC`EChhG|(*pDvCdI$%{B(pUvSp zDbaAoIN8^KR?e+~HY+RVmX(8K-5EkwT9uW9WdGV{|A-CrM6=SYAJ{>%fAO<_#H^^i zp{=tsOXM1`Pl&8fKmGm!H7oI|yJ)QVA#k%yg3R}@$csIm6->Krxv!V|iEWUVzp`k8 z_jr+4d3lGWjQHnSGFECP@++)L4YZtrjPwy3j-LkA)3$ry>Kn$Ybeb)Y^%W7k0x;Eo~5Yo$} z%ir~Q`>QJb*y-|jttb5$>GF3y-u~Kcwi^u?4Hyj=4Hyj=4Hyj=4Hyj=4Hyj=4Hyj= z4Hyj=4Hyj=4Hyj=4Hyj=4Hyj=4Hyj=4HykHG!3NBk*3S4otf!|)^^h#qXDAoM0WmP&eoqojhed)4Yu5WryBO47E z4Hyj=4Hyj=4Hyj^yasxk{`0{r(H!Bh*TA71ho+Aa(q(lKGSlf7CVgMJY?m|RjC55Q z*=XQ<(ZHd6j(jgCXevD*4SXN{v-EdEx~v+WnNB~M^nK~FUG4zhFX?5|W&1e2(`)?C za(dZx`9P2JpKCFDjRuScvaNx>W?Y(Wm1gC5=DK7>jrD$zo9ev=Q$aQ~Fci-@&CFx! z?RBLtuk-74W9R1IA8((+`u}#Q&&S;7S`!VM`hL{RY^~m2SL*UQzfKz(4KzdzG^TNU zL)4#XlhJ_DfYE@_fYHFe)4-veH&O9P^`B?`fv-PK{}!Dtt7B%Sbv=fSLj#VN=*H33 z`e@}&e9x#WbsKbkoi;QYXowmZpZ@S~hz+dgHg(zU{J`r<-5i}?ryD!Z>*0Kd?A>$k z?~&&IF!x7ezqd{MjRw9i4IIjG-1l{kre31~qXDA(Qa4-Y*J(qefggefOh2%3Tt(eq)68tO-d-;+1*x6;2^IX4l^xn^RbDuYkE35BE&CFKo?RBLtuk-7)q0zv>Xuy1@cC@#-9_CdJ z=DK{>vMo`tzU_duz3hQf-*39ycRkOBQf@u&o4QiBTj$s5#?G6@JN=a02f>H-?ziak zyLYU!{oZj7&Hbu1b7-jVySh@hO6S*UL!*I)sDa);koR~))U9cg(ZCNy1G*pjLpdKk zeyJ<UQaJjaARO-D~iktt&Ij>2zadJ2YI6U+U{TbieyR zsqZ&kuD;rLsE+$K?zg&9w@c^O>Bh=Kb-(RTKb6>_@2j2l)X&!U>w!|YOPAZ{8KT|{5P3!x(uGF>b{5sv(dD0Wkchd7_I(&PY z!<(jqGaUAK+#yW`k*~`vC*5VX!^JpGml(Fs!FJTMKYb0I?Bp9d#i99qIxj%|zWFxl z=Z4O=KRq{=?fQ3CSL*Z9`E}aRXuxRT+clt{AK#v{apch7LF!69RVj%yjyhrteFa?Q(t7a~j!bz-XW`Xkc+Y z&AT*)b2n|=R|CDx{jjf6vb-hz-I*?{YBJMVuG$>VXuxQ|XuxQ|XuxQ|XuxQ|XuxQ| zXuxQ|XrMuBz55C=moD4o%=(jbRT&u?=xsF7C^XO)>kc$C8?Cq3mAbsnuhWg4 z?LKwZPgj1n_d08HpEr&xtM5n6%vS5|b)_z^^Xs&s(SXr_(ZK#RP#^33();A;vTB37 zlV^WTIqbHl>n2@RipWeKcFHj)Y&2jrU^H-;YhbZihkuyg0ognK^gczptZK+iXRlUs zB%=YN0iywDDr^XqhDWhEM3-`7>^>p-d7rOP!|J?nPY z)jze)msw7y8#{}0Pq0tnQB9wd&OEP^ENA;kISwn4LEjgd`LmVQ_uGL|w@a7HR(rm$ zzvO1s4bT-e?9Ls3HXuxRTaMr+~e9j-vdOjS^ zJ^fvsE~|6TOsDH3eP6n4mow{z(^X|;qk%@Lf%;g_)F>6vNE&@8`vvLG{B&8VDl^?k z)MuJ$H1LDez@dCD{2&!*PReMY5o+K-fA=n&W6defx^kWFlaU^qk)E27UXYPqmXZD- zBfT{v&8O~Ne~XNC`;7E2GSU}jq`PIL|B;dIpOGG&k)Du|o`G~B^feFZe5A)u%eAEf zq+fo$$d<~GUhH%1%vvG+8dwhA>v#6IM%pvy@3~QJ>T!v)gR#GOqm#ix zdi^9v@FP9;myUk(kk;{WYpn@7IrECTAJ_6cCu1|@&jDM2eXns^sJC}H+i8hzce@`s zNA@AVu5b4qr~O^da`MZv1N(ex&lBmX?VSBzAbmcLV_-C3G+;DfG+;DfG+;DfG+;Df zG+;DfG+;DfG+;DfG+;DfG+;DfG+;DfG+;FFT{W=&C}%z-vwQ;cJV`JGTGO4GkLF+% z7yzrmAQ%E`z%UpAqhJh-g9$JRra)^3>IbX909XwM!4OyjhQSCJ1!G_wOn^x+1zIyv zKUf6@z-llEhQJyy3`W2x7z5*A0!)G_(3*w%!74BSR)aw>1lE9IFak!w7#If=U=mD$ z)@;-dR)GPq8VrIVum%i+5iknIz&MxylVA$8os~XFb2lK1egRunG)- z)nE_|fi++ljDS%v2FAezm;_Ux^&IL4tH1zQ4Fr<sU z1qQ%sFbIag8ZZn-z$h34<6r_zf+^5?9`%D&U;wNJgJ1}(0mEPfjDj&R4ko}Pm;$XA zP(N4&2Eb}C2!_BKFbqb(C>R6dU;<2nDbR|eey|D*fYo3S41qOZ7>s~XFb2lK1egR< zp!Fi^2dlsUSPcfj5Lg3-!3Y=yV_+OifJra~T8mLXSOo^aYA^_fz#1?NM!+Z-1LI%< zOoA!UT7vq)Dlh<6gF!F^)_`F!0!G0Y7zYzz5=?>COQ;{L0s~+*7z9IL4HyO^U=)mj zaWDZU!4zmMMg3qE7yzrmAQ%E`z%UpAqhJh-g9$JRrar<c^zyMec z2EhoFa=s~qJFRn41m>O5DbAeU>J;mQ7{I^!33BDQ=qjR^@CMl z0IUXsU1qQ%sFbIag8ZZn-z$h34<6r_zf+^5iiTc4RFaTDAK`;c?fMGBKM!^^u2NPft zOo7%rs2{8X17I~61VdmA7zQI?6pVp!FaajP6lkqN{a_Us0IR_u7y@g+Fc<-&U<{0d z2`~w!K1lE9IFak!w z7#If=U=mD$)@sxbR)GPq8VrIVum%i+5iknIz&MxylVA$8-b4Lh6&L`k!5|m{YrrrV z0i$3HjDrcV^3uKM2d?jVRkvQ}+|a9MuUminhjTmJa$|?%I&|#N@tBSsjytB~34sp1 zPYQGnoY0|L_pAPLjha(%KXlsd)ZvyMxAeNXSJ$hk!wom~>fYg+8~)Pas=xHSzS}W9 zyOEvh(e;)d)S=t0H{5dTpB?tP+1XRm{pMSG-gv`aiO#a`=I+;bRRtj3bbT-C(DR0# z^1p~3uDMZ!Ufp}k{~_5bnQrXXwO3c_(7i|J(9K={+`V&;ZgLQvlA~XJb?5HAukL$^J#>)iF`o4elX97D_MII4Czq}|f4f9`p;l)tf;s#vzz)m(MUEq04L+lsip z=MC3oPOyB(w6beawkX^(SuC_PPn~xMhS)Azd+TKR9_r*?5UCz1NzOm1# zkliV_H?+xY5$0tH^{#9@@w#%(Yz_+g6Z~a{xzfgMejR% zH2=0)pPADLU9WD^KQhW|`!!8%$EEXUp8uUFudm-4*uQC>9nmEnR_>jo0g_gysLLPK z!)c-B%O~$$AhZ6_8Ra)WBPRJ-fcWH^eOOsCByL@K-Pe^WM8>oJR z>QCGIE%r6F)34e8fAgQNU-Mbnr7Q+@d2J7Puiq)J^XVh#wB{?aL$y$s9}j!N@hE>@ z`QGi<<@E915kcJ{y1btMUVoHh0a%P3>i4Vuba{Or-7MSE>)&~_^M2fUv{OD;|4{AH z-;~$KS({OwV2?S^7{Q;c`4eDdNp*tI=w{%wN0P@ad^KUr^{zt@XYc% kr0m`rc8;veJKAuzssA$$x0mj|$wkx+^;;PS&q&h$1K%8{a{vGU literal 0 HcmV?d00001 diff --git a/external/dtEntity/lib64/libdtEntityOSG.so.2 b/external/dtEntity/lib64/libdtEntityOSG.so.2 new file mode 120000 index 000000000..923f2de15 --- /dev/null +++ b/external/dtEntity/lib64/libdtEntityOSG.so.2 @@ -0,0 +1 @@ +libdtEntityOSG.so.0.1.1 \ No newline at end of file From a9d4848749ed5e9b61df6a7f1be3c5c6d1973f95 Mon Sep 17 00:00:00 2001 From: Torsten Wierschin Date: Sat, 24 Oct 2026 09:09:22 +0000 Subject: [PATCH 2/2] Adds external dep dtentity sha256sum --- external/dtEntity/SHA256SUM.dtEntity | 77 ++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 external/dtEntity/SHA256SUM.dtEntity diff --git a/external/dtEntity/SHA256SUM.dtEntity b/external/dtEntity/SHA256SUM.dtEntity new file mode 100644 index 000000000..b4827b1bd --- /dev/null +++ b/external/dtEntity/SHA256SUM.dtEntity @@ -0,0 +1,77 @@ +9868119af0684e4e99c1ed9cba2467a0975ba008d27f48677eb8620b7d1256f6 include/dtEntity/uniqueid.h +b9d8449804ff68862456837f63be414e71950e63bf8343d2c9aef0c325aec470 include/dtEntity/message.h +94d95c7077037165b79923cedb08a3b62b5fe9338bd97ecdcf05ae60c95ec2d1 include/dtEntity/componentpluginmanager.h +4bb43f0207e24ac952841169f4ef7156e48dbaeb5485ee9da8f32321828cbeb1 include/dtEntity/entityid.h +1c55a6c6bef49b24e8488ab39c296d33bb8726d3ca9f6236729642e18b1af2ce include/dtEntity/componentplugin.h +d48c081fc472f66b390cc9dde2b259d39a1e1f221c39d3a6a8b624d63561088d include/dtEntity/systemmessages.h +36a06cbab8eba491c688bcb7a2c9ee90e03293b47f02aadd7521edba245d3799 include/dtEntity/commandmessages.h +ec501b8fa2b5546260aa1d0e0562cd6c147e25a42bb4bea8b9c2110a7d9cfb47 include/dtEntity/rapidxmlmapencoder.h +dc29c99d8f90753efe032612e9208ef6d1eef1877f7b30996c11c74067f66bd6 include/dtEntity/resourcemanager.h +15bff21fa47e10c24491065578ada0484f1239ce112361c5b3b927f593703c20 include/dtEntity/objectfactory.h +7a06ef09fef3b24201db22d158e1070768e57a411845eedccbe3ef34cfa5c492 include/dtEntity/init.h +3a55f8d8396e754f4551959947270bdc556f67981579ef38f88cf1a1007b36dc include/dtEntity/dynamicscomponent.h +2d62c6ddb60b1e60b43a2c8e838b29acc0cbccd63815a266fae0530b53503219 include/dtEntity/defaultentitysystem.h +a42c0e9a6c0a0a1d015becfcd71a1875b2fc30890073c274df9bdc950c94fdae include/dtEntity/component.h +e7eab19ef1d6cafcd3dcb0a09147e8139c91d8ea7ebee1a6618de42dc01e2ab2 include/dtEntity/entitysystem.h +7393a2e3379839dc356839a0f56672d11b869ea6ba6f9b6d82d6381722cced49 include/dtEntity/log.h +878fbb00aa2d70aab2a1af86592f29c5f58ccd5d25da80fa5624147e91ddb007 include/dtEntity/debugdrawinterface.h +e46d71595270c3b6ce198a9d7bd6f86c0339fd91954f62fa6e4967e7496a1acb include/dtEntity/messagefactory.h +e9d568c7ef79dedb6ce31e79b188ccad51459953b3b6d7af818bc805a2189b4d include/dtEntity/entity.h +85bec4e84332250d77a0efe3052c2278ad6cacf0174d86e90503d890168ffe9d include/dtEntity/core.h +8df252d57ff7c706e3829717f1ba15d41589df164ba0d7b2f943238396f2082a include/dtEntity/property.h +eb3f0bac95a19544209e9a83992e91686b43b3893de59c8d0adb7d6192f6f03b include/dtEntity/nodemasks.h +f6892d4f780e5e9e6bb05cfa449264875497f6676c5bfebbd22b89818ec46d5b include/dtEntity/systeminterface.h +d1d30e7cf79fd024c3469bf689d297083c3a496a962fffbe8ceb4831057f8992 include/dtEntity/logmanager.h +fcdd4b252244d719a4d1393a0dca4d356214415414b565b0d2d9a408d5d1b234 include/dtEntity/messagepump.h +d9bd24dfd49b7960fe4af0030b07db1c51dd4b67905ea60a746486ffcec2b6e7 include/dtEntity/mapencoder.h +7052bf8dad130f11a0ca90ac4b99c0193ec0804d5c013c9de976e982779001a4 include/dtEntity/threadsafequeue.h +7a03404655a1cbfe53876ddc4f2b674fd7f8cea4f2a7840823f0de88891d61bb include/dtEntity/hash.h +72b6fdf2e69fb2aafc82c9bcc55598b2abbca23de372fa8a4a17ddaec1fb0052 include/dtEntity/stringid.h +43900165545bc2f58dc471ad6df44cd32c6c1b65295cb31d55ce6e277ec5b00b include/dtEntity/FastDelegateBind.h +1fc0ff1802c1bb408f7c92a9faa03370dc90875359868cd2fe220022e02719ec include/dtEntity/singleton.h +c51e323a7b4b866772b037dd37bcacb06abed37a7d09809ccd9ce37bd150e792 include/dtEntity/dtentity_config.h +af0fccd4d374417767b100340b67a8d8e60e46fced6a2fabd6a29f41013ad808 include/dtEntity/propertycontainer.h +a37d096e665458feeb9baf4a4cec9fe118749c162c2b9b8d83e81783b9208423 include/dtEntity/FastDelegate.h +4031bc03599cc5170208dc475598a08e3032e811e372f46ae6a63309db9cc98d include/dtEntity/export.h +a31be0ad4cd4e8459711c24a6f95a16aae3e17c3620cb05d62b279b7b3372684 include/dtEntity/componentfactories.h +ec069ef6e81d24d048086c1d1b2502f357727f18c6a04873a22dff3eed3aea7d include/dtEntity/inputinterface.h +910a99cc0a3b9707edd71ab23b34387d7187643119e5de2a41aadc94abeba54a include/dtEntity/mapcomponent.h +c0a7145cc66bce93099d987db2b56e676a6a30bdfa5dd9eb7f67f5bd9eaa1841 include/dtEntity/entitymanager.h +62542af7a60195130656c8301fbb90958662a2283bd3c91414f3c732e6c5d08f include/dtEntity/scriptaccessor.h +b7ed64365af8825f25071dfb79680b516127bb2e19836057c88487bd90a2ab4d include/dtEntity/dynamicproperty.h +4fe56800e56ff32470850f66c8d6d8ccc48161f4bf2cd29a50810bad2cdda8f2 include/dtEntity/profile.h +73f4c01b1d042385f38aac9e65e344ac300544c361f8ee6e40773760ee05428d include/dtEntity/spawner.h +5a2048cf4b86885b935b11511693fae5277ffa010587ad9f0e958bff86f36812 include/dtEntity/windowinterface.h +f1e3efe39a3b934a9faae9221dc7bbc0711fa903af99f2963faee69efa7de232 include/dtEntityOSG/osgwindowinterface.h +8713fcb916ba43c8673cf7793144ab99cf25083e14364b9e587132fcb84df348 include/dtEntityOSG/manipulators.h +9efa10d5f622041f2ae6bb65ff03ca1ecbcf82cecb3c4da81157efd888375b38 include/dtEntityOSG/dtentityosg_config.h +8f5f61c9dc8afcaac610065a9df59abb2d04f3e01bb1e4b98b91d95a4f8de53d include/dtEntityOSG/shadowcomponent.h +3d14380981d053894b50c04d369bd630abaa91de3ca149cd88234afb409b4d72 include/dtEntityOSG/matrixtransformcomponent.h +ea144f7e4dd348a8055b6cf93f7ab2d2064ba8b629e275820ed00d1d987f8a07 include/dtEntityOSG/skyboxcomponent.h +a5df06c916c6c7856d1aada7ad30be6fbb64a52bcad4afaee1f983f3ae186022 include/dtEntityOSG/osgsysteminterface.h +fc0575923dbb26a5aff98b75c611679182bac3284871a1e49f89df1afdb1e13f include/dtEntityOSG/layerattachpointcomponent.h +d0bac5bbce68a0245b7dc61d10510414caf51da212b307504e337ee543e70919 include/dtEntityOSG/manipulatorcomponent.h +b3fdfbf73131012f3257376197413618aea27e6ee1455b45c1fbc3be583130cb include/dtEntityOSG/groupcomponent.h +7ed7b55c32b9e6b7e97e8c65f0b68d513871d2510eaf8a8f307829c84a4f4a20 include/dtEntityOSG/particlecomponent.h +a38a57b8a6249db2c70975c8abfc01feab7e081ebae30e58282d6d6018c8aa2e include/dtEntityOSG/pickshapecomponent.h +13de73aaf7fea9a99ce664ae97701fbf67560de0ffa621fa0a1b49bfdf516b86 include/dtEntityOSG/transformcomponent.h +6388d185f519daf05b902c209c8c110df1d737c4b8a67c34b54761085400f2a7 include/dtEntityOSG/positionattitudetransformcomponent.h +0ec8625684c80c4dee2503049713ba211c7a8a797725a1a2a259dd256a9fe9d0 include/dtEntityOSG/nodemaskvisitor.h +b6dbcbd009d13ebb77fa2a8b0afcaee49091dfe2256a5f5ee0c565f481a37257 include/dtEntityOSG/cameracomponent.h +3832a4510119355eb8e5223e0f1dda4ce35b9a1893df2fdb596fca6f4b22bbd1 include/dtEntityOSG/texturelabelcomponent.h +e1018dee953405755612ffedb63edeab3a8607d9034f842aa31d12b4235023a6 include/dtEntityOSG/osgdebugdrawinterface.h +6789588e699e3a23413fa24610203cbc7ab330570bd8684099cd96257420318a include/dtEntityOSG/textlabelcomponent.h +a41676f8a8f92e5418b4cddb97c9c33c546c67e82b4abd5f6d3bcba407966f2c include/dtEntityOSG/lightcomponent.h +e7a38d6f058b6828405f85a2809f9627100b5897cd70b1581cca3d0a895a80ee include/dtEntityOSG/nodecomponent.h +bf41c7204151b1ee0d3694f79e1c160a47f323be3c216fd41f714d3d9230ab87 include/dtEntityOSG/pathcomponent.h +0a5ffc701caff5fc8a0f19289191a968794454a991406189b2b239b0e5a0b185 include/dtEntityOSG/osganimationcomponent.h +bb8443325f3c9771a3540e72e7e19c75b7efc31a2c769aeaf4e535c1c78083b5 include/dtEntityOSG/initosgviewer.h +a5429771833ae4182491afd334fe5339a8c2764299c03ed775bd6350efa79b20 include/dtEntityOSG/layercomponent.h +11294ef13d0c3edb95399045a43d2a5eef56f5e6f42175620c3abbaf1b732a17 include/dtEntityOSG/export.h +7950331766ea9f639a3754fd5ad614f88bbd23f6dfff07c2057c08c6d9e550f3 include/dtEntityOSG/componentfactories.h +a4ff0c401dfb0bc19d00deb0191dcc1c06a50c0b74a3df4eb61238196efa238d include/dtEntityOSG/staticmeshcomponent.h +bcc988d0acd140551743e27d8de9885ce9d3b7b5844b0b78eca267ec54d2a1be include/dtEntityOSG/groundclampingcomponent.h +8dad8e47fb56991ca74a46ad6d701158c0ffd9eda0099f433fa817a048ff9f84 include/dtEntityOSG/osginputinterface.h +e4c13fc3cb01c49ec18c8352a8e97599533c6b84b4ccf398dbdbd559415a1409 include/dtEntityOSG/shadercomponent.h +b920d50872ad2537b56832c36c1165a5ae53ee6981549235b8b8921ed1255273 lib64/libdtEntityOSG.so.0.1.1 +f53dababd2d92c96adf2f4d43c5c1b53acb1b4894f820e2e7a1226c230f1f8b6 lib64/libdtEntity.so.0.1.1