From 6f2ad90696902b6fa7824a4b74e2c535e9cc9287 Mon Sep 17 00:00:00 2001 From: Adidasman Date: Mon, 4 Jul 2016 13:11:20 +0600 Subject: [PATCH] Modification from ReHLDS Team --- .gitignore | 15 +- ABOUT.txt | 35 - Config.mak | 4 - GPL.txt | 340 -- Makefile | 68 +- README.txt | 7 - bin/metamod.dll | Bin 0 -> 210944 bytes bin/metamod.so | Bin 0 -> 223836 bytes doc/Changelog | 992 ---- doc/README.txt | 6 - doc/TODO | 37 - doc/config.ini | 90 - doc/html/Index.html | 65 - doc/html/a.html | 35 - doc/html/about.html | 52 - doc/html/coding.html | 396 -- doc/html/dllapi_notes.html | 569 -- doc/html/engine_notes.html | 1705 ------ doc/html/faq.html | 158 - doc/html/gamesupport.html | 17 - doc/html/links.html | 114 - doc/html/maillist.html | 62 - doc/html/metamod.html | 696 --- doc/html/newapi_notes.html | 62 - doc/html/release_notes.html | 127 - doc/html/supportedmods.html | 35 - doc/html/trace.html | 88 - doc/html/wdmisc.html | 48 - doc/plugins.ini | 35 - doc/txt/Index.txt | 27 - doc/txt/a.txt | 19 - doc/txt/about.txt | 35 - doc/txt/coding.txt | 340 -- doc/txt/dllapi_notes.txt | 702 --- doc/txt/engine_notes.txt | 2166 -------- doc/txt/faq.txt | 120 - doc/txt/gamesupport.txt | 6 - doc/txt/links.txt | 129 - doc/txt/maillist.txt | 25 - doc/txt/metamod.txt | 568 -- doc/txt/newapi_notes.txt | 55 - doc/txt/release_notes.txt | 79 - doc/txt/supportedmods.txt | 18 - doc/txt/trace.txt | 70 - doc/txt/wdmisc.txt | 32 - doc/txt/windows_notes.txt | 110 - hlsdk/common/engine_launcher_api.h | 112 - hlsdk/common/exefuncs.h | 50 - hlsdk/dlls/util.h | 515 -- hlsdk/dlls/vector.h | 120 - hlsdk/engine/cdll_int.h | 311 -- hlsdk/engine/keydefs.h | 131 - hlsdk/hlsdk_readme.txt | 2 - lib/libacof32.lib | Bin 0 -> 53338 bytes lib/libirc.a | Bin 0 -> 543958 bytes lib/libirc.lib | Bin 0 -> 373204 bytes lib/linux32/libaelf32.a | Bin 0 -> 69278 bytes metamod/.gitignore | 3 - metamod/Config.mak | 34 - metamod/Makefile | 454 -- metamod/api_info.cpp | 275 - metamod/build_all.sh | 5 - metamod/game_autodetect.cpp | 130 - metamod/game_autodetect.h | 43 - metamod/game_support.h | 56 - metamod/h_export.h | 49 - metamod/i386pe.merge | 205 - metamod/info_name.h | 56 - metamod/linkgame.cpp | 37 - metamod/linkplug.cpp | 42 - metamod/metamod.vcproj | 489 -- metamod/mhook.h | 0 metamod/mqueue.cpp | 0 metamod/mqueue.h | 0 metamod/new_baseclass.h | 69 - metamod/osdep_p.h | 76 - metamod/reg_support.h | 49 - metamod/ret_type.h | 69 - metamod/sdk_util.cpp | 125 - metamod/studioapi.cpp | 38 - metamod/studioapi.h | 38 - metamod/thread_logparse.cpp | 0 metamod/thread_logparse.h | 0 metamod/vdate.cpp | 58 - metamod/vdate.h | 45 - metamod/vers_meta.h | 61 - {metamod => msvc}/metamod.def | 0 {metamod => msvc}/metamod.sln | 8 +- msvc/metamod.vcxproj | 167 + msvc/metamod.vcxproj.filters | 218 + {metamod => msvc}/res_meta.rc | 2 +- {hlsdk/engine => sdk/common}/Sequence.h | 2 +- {hlsdk => sdk}/common/beamdef.h | 0 {hlsdk => sdk}/common/cl_entity.h | 0 {hlsdk => sdk}/common/com_model.h | 9 + {hlsdk => sdk}/common/con_nprint.h | 7 + {hlsdk => sdk}/common/const.h | 20 +- {hlsdk => sdk}/common/crc.h | 19 +- {hlsdk => sdk}/common/cvardef.h | 11 +- {hlsdk => sdk}/common/demo_api.h | 0 {hlsdk => sdk}/common/director_cmds.h | 0 {hlsdk => sdk}/common/dlight.h | 0 {hlsdk => sdk}/common/dll_state.h | 0 {hlsdk => sdk}/common/entity_state.h | 2 +- {hlsdk => sdk}/common/entity_types.h | 0 sdk/common/enums.h | 27 + {hlsdk => sdk}/common/event_api.h | 0 {hlsdk => sdk}/common/event_args.h | 0 {hlsdk => sdk}/common/event_flags.h | 2 +- {hlsdk => sdk}/common/hltv.h | 30 +- {hlsdk => sdk}/common/in_buttons.h | 2 +- sdk/common/interface.cpp | 150 + {hlsdk => sdk}/common/interface.h | 0 {hlsdk => sdk}/common/ivoicetweak.h | 5 +- {hlsdk => sdk}/common/mathlib.h | 4 +- {hlsdk => sdk}/common/net_api.h | 0 {hlsdk => sdk}/common/netadr.h | 0 {hlsdk => sdk}/common/nowin.h | 1 + sdk/common/parsemsg.cpp | 272 + sdk/common/parsemsg.h | 66 + {hlsdk => sdk}/common/particledef.h | 0 {hlsdk => sdk}/common/pmtrace.h | 0 sdk/common/port.h | 122 + {hlsdk => sdk}/common/qfont.h | 1 + {hlsdk => sdk}/common/r_efx.h | 4 +- {hlsdk => sdk}/common/r_studioint.h | 24 +- {hlsdk => sdk}/common/ref_params.h | 0 {hlsdk => sdk}/common/screenfade.h | 0 {hlsdk => sdk}/common/studio_event.h | 2 +- {hlsdk => sdk}/common/triangleapi.h | 7 +- {hlsdk => sdk}/common/usercmd.h | 0 {hlsdk => sdk}/common/weaponinfo.h | 2 +- sdk/dlls/AI_BaseNPC_Schedule.cpp | 1514 +++++ sdk/dlls/Makefile | 187 + sdk/dlls/Wxdebug.cpp | 395 ++ sdk/dlls/activity.h | 109 + sdk/dlls/activitymap.h | 97 + sdk/dlls/aflock.cpp | 911 +++ sdk/dlls/agrunt.cpp | 1188 ++++ sdk/dlls/airtank.cpp | 118 + sdk/dlls/animating.cpp | 318 ++ sdk/dlls/animation.cpp | 535 ++ sdk/dlls/animation.h | 47 + sdk/dlls/apache.cpp | 1049 ++++ sdk/dlls/barnacle.cpp | 428 ++ sdk/dlls/barney.cpp | 843 +++ sdk/dlls/basemonster.h | 339 ++ sdk/dlls/bigmomma.cpp | 1250 +++++ sdk/dlls/bloater.cpp | 219 + sdk/dlls/bmodels.cpp | 958 ++++ sdk/dlls/bullsquid.cpp | 1279 +++++ sdk/dlls/buttons.cpp | 1284 +++++ sdk/dlls/cbase.cpp | 771 +++ sdk/dlls/cbase.h | 802 +++ {hlsdk => sdk}/dlls/cdll_dll.h | 2 +- sdk/dlls/client.cpp | 1915 +++++++ sdk/dlls/client.h | 65 + sdk/dlls/combat.cpp | 1701 ++++++ sdk/dlls/controller.cpp | 1428 +++++ sdk/dlls/crossbow.cpp | 547 ++ sdk/dlls/crowbar.cpp | 318 ++ sdk/dlls/decals.h | 75 + sdk/dlls/defaultai.cpp | 1232 +++++ sdk/dlls/defaultai.h | 98 + sdk/dlls/doors.cpp | 1052 ++++ sdk/dlls/doors.h | 33 + sdk/dlls/effects.cpp | 2268 ++++++++ sdk/dlls/effects.h | 209 + sdk/dlls/egon.cpp | 568 ++ {hlsdk => sdk}/dlls/enginecallback.h | 12 +- sdk/dlls/explode.cpp | 273 + sdk/dlls/explode.h | 32 + {hlsdk => sdk}/dlls/extdll.h | 36 +- sdk/dlls/flyingmonster.cpp | 281 + sdk/dlls/flyingmonster.h | 53 + sdk/dlls/func_break.cpp | 1010 ++++ sdk/dlls/func_break.h | 74 + sdk/dlls/func_tank.cpp | 1034 ++++ sdk/dlls/game.cpp | 890 +++ sdk/dlls/game.h | 45 + sdk/dlls/gamerules.cpp | 347 ++ sdk/dlls/gamerules.h | 360 ++ sdk/dlls/gargantua.cpp | 1367 +++++ sdk/dlls/gauss.cpp | 623 +++ sdk/dlls/genericmonster.cpp | 140 + sdk/dlls/ggrenade.cpp | 488 ++ sdk/dlls/globals.cpp | 39 + sdk/dlls/glock.cpp | 325 ++ sdk/dlls/gman.cpp | 237 + sdk/dlls/h_ai.cpp | 199 + sdk/dlls/h_battery.cpp | 200 + sdk/dlls/h_cine.cpp | 241 + sdk/dlls/h_cycler.cpp | 471 ++ {stub_plugin => sdk/dlls}/h_export.cpp | 48 +- sdk/dlls/handgrenade.cpp | 233 + sdk/dlls/hassassin.cpp | 1017 ++++ sdk/dlls/headcrab.cpp | 555 ++ sdk/dlls/healthkit.cpp | 264 + sdk/dlls/hgrunt.cpp | 2518 +++++++++ sdk/dlls/hl.def | 5 + sdk/dlls/hl.dsp | 1637 ++++++ sdk/dlls/hlgl.def | 15 + sdk/dlls/hornet.cpp | 419 ++ sdk/dlls/hornet.h | 58 + sdk/dlls/hornetgun.cpp | 305 + sdk/dlls/houndeye.cpp | 1308 +++++ sdk/dlls/ichthyosaur.cpp | 1108 ++++ sdk/dlls/islave.cpp | 864 +++ sdk/dlls/items.cpp | 342 ++ sdk/dlls/items.h | 29 + sdk/dlls/leech.cpp | 723 +++ sdk/dlls/lights.cpp | 199 + sdk/dlls/maprules.cpp | 918 ++++ sdk/dlls/maprules.h | 22 + sdk/dlls/monsterevent.h | 34 + sdk/dlls/monstermaker.cpp | 292 + sdk/dlls/monsters.cpp | 3448 ++++++++++++ sdk/dlls/monsters.h | 183 + sdk/dlls/monsterstate.cpp | 239 + sdk/dlls/mortar.cpp | 323 ++ sdk/dlls/mp5.cpp | 385 ++ sdk/dlls/mpstubb.cpp | 264 + sdk/dlls/msvc10/hl.sln | 20 + sdk/dlls/msvc10/hl.vcxproj | 509 ++ sdk/dlls/msvc10/hl.vcxproj.filters | 154 + sdk/dlls/msvc11/hl.sln | 20 + sdk/dlls/msvc11/hl.vcxproj | 512 ++ sdk/dlls/msvc11/hl.vcxproj.filters | 154 + sdk/dlls/multiplay_gamerules.cpp | 1692 ++++++ sdk/dlls/nihilanth.cpp | 1850 +++++++ sdk/dlls/nodes.cpp | 3657 ++++++++++++ sdk/dlls/nodes.h | 379 ++ sdk/dlls/observer.cpp | 280 + sdk/dlls/osprey.cpp | 805 +++ sdk/dlls/pathcorner.cpp | 428 ++ sdk/dlls/plane.cpp | 60 + sdk/dlls/plane.h | 43 + sdk/dlls/plats.cpp | 2285 ++++++++ sdk/dlls/player.cpp | 4881 +++++++++++++++++ sdk/dlls/player.h | 337 ++ sdk/dlls/playermonster.cpp | 122 + sdk/dlls/python.cpp | 309 ++ sdk/dlls/rat.cpp | 98 + sdk/dlls/roach.cpp | 460 ++ sdk/dlls/rpg.cpp | 617 +++ sdk/dlls/satchel.cpp | 490 ++ sdk/dlls/saverestore.h | 176 + sdk/dlls/schedule.cpp | 1514 +++++ sdk/dlls/schedule.h | 290 + sdk/dlls/scientist.cpp | 1435 +++++ sdk/dlls/scripted.cpp | 1260 +++++ sdk/dlls/scripted.h | 107 + sdk/dlls/scriptevent.h | 29 + sdk/dlls/shotgun.cpp | 401 ++ sdk/dlls/singleplay_gamerules.cpp | 328 ++ sdk/dlls/skill.cpp | 46 + sdk/dlls/skill.h | 147 + sdk/dlls/sound.cpp | 1982 +++++++ sdk/dlls/soundent.cpp | 379 ++ sdk/dlls/soundent.h | 95 + sdk/dlls/spectator.cpp | 149 + sdk/dlls/spectator.h | 27 + sdk/dlls/squad.h | 20 + sdk/dlls/squadmonster.cpp | 623 +++ sdk/dlls/squadmonster.h | 120 + sdk/dlls/squeakgrenade.cpp | 600 ++ sdk/dlls/stats.cpp | 156 + sdk/dlls/subs.cpp | 567 ++ sdk/dlls/talkmonster.cpp | 1467 +++++ sdk/dlls/talkmonster.h | 183 + sdk/dlls/teamplay_gamerules.cpp | 627 +++ sdk/dlls/teamplay_gamerules.h | 57 + sdk/dlls/tempmonster.cpp | 117 + sdk/dlls/tentacle.cpp | 1046 ++++ sdk/dlls/trains.h | 127 + sdk/dlls/triggers.cpp | 2429 ++++++++ sdk/dlls/tripmine.cpp | 526 ++ sdk/dlls/turret.cpp | 1303 +++++ sdk/dlls/util.cpp | 2551 +++++++++ sdk/dlls/util.h | 548 ++ sdk/dlls/vector.h | 111 + sdk/dlls/weapons.cpp | 1617 ++++++ sdk/dlls/weapons.h | 1021 ++++ sdk/dlls/world.cpp | 742 +++ sdk/dlls/wpn_shared/hl_wpn_glock.cpp | 274 + sdk/dlls/wxdebug.h | 137 + sdk/dlls/xen.cpp | 584 ++ sdk/dlls/zombie.cpp | 344 ++ sdk/engine/APIProxy.h | 939 ++++ {hlsdk => sdk}/engine/anorms.h | 0 {hlsdk => sdk}/engine/archtypes.h | 0 sdk/engine/cdll_int.h | 467 ++ {hlsdk => sdk}/engine/custom.h | 13 +- {hlsdk => sdk}/engine/customentity.h | 0 {hlsdk => sdk}/engine/edict.h | 7 + {hlsdk => sdk}/engine/eiface.h | 112 +- {hlsdk => sdk}/engine/progdefs.h | 2 +- {hlsdk => sdk}/engine/progs.h | 0 {hlsdk => sdk}/engine/shake.h | 3 +- {hlsdk => sdk}/engine/studio.h | 18 +- sdk/pm_shared/pm_debug.c | 322 ++ {hlsdk => sdk}/pm_shared/pm_debug.h | 0 {hlsdk => sdk}/pm_shared/pm_defs.h | 43 +- {hlsdk => sdk}/pm_shared/pm_info.h | 2 +- {hlsdk => sdk}/pm_shared/pm_materials.h | 1 + sdk/pm_shared/pm_math.c | 435 ++ {hlsdk => sdk}/pm_shared/pm_movevars.h | 0 sdk/pm_shared/pm_shared.c | 3343 +++++++++++ {hlsdk => sdk}/pm_shared/pm_shared.h | 0 {metamod => src}/api_hook.cpp | 67 +- {metamod => src}/api_hook.h | 30 - {trace_plugin => src}/api_info.cpp | 39 +- {metamod => src}/api_info.h | 38 +- src/asmlib.h | 224 + {metamod => src}/commands_meta.cpp | 143 +- {metamod => src}/commands_meta.h | 36 - {metamod => src}/comp_dep.h | 33 +- {metamod => src}/conf_meta.cpp | 38 - {metamod => src}/conf_meta.h | 38 - {metamod => src}/dllapi.cpp | 64 +- {metamod => src}/dllapi.h | 38 +- {metamod => src}/engine_api.cpp | 88 +- {metamod => src}/engine_api.h | 36 - {metamod => src}/engine_t.h | 0 {metamod => src}/enginecallbacks.h | 0 {metamod => src}/engineinfo.cpp | 23 +- {metamod => src}/engineinfo.h | 32 +- src/game_autodetect.cpp | 89 + src/game_autodetect.h | 7 + {metamod => src}/game_support.cpp | 59 +- src/game_support.h | 20 + {metamod => src}/games.h | 44 +- {metamod => src}/h_export.cpp | 37 +- src/h_export.h | 11 + src/info_name.h | 20 + {metamod => src}/linkent.h | 41 +- src/linkplug.cpp | 6 + {metamod => src}/log_meta.cpp | 99 +- {metamod => src}/log_meta.h | 36 - {metamod => src}/meta_api.h | 36 - {metamod => src}/meta_eiface.cpp | 166 +- {metamod => src}/meta_eiface.h | 105 +- {metamod => src}/metamod.cpp | 51 +- {metamod => src}/metamod.h | 36 - {metamod => src}/mhook.cpp | 0 {metamod => src}/mlist.cpp | 60 +- {metamod => src}/mlist.h | 42 - {metamod => src}/mm_pextensions.h | 31 - {metamod => src}/mplayer.cpp | 73 +- {metamod => src}/mplayer.h | 46 +- {metamod => src}/mplugin.cpp | 91 +- {metamod => src}/mplugin.h | 39 - {metamod => src}/mreg.cpp | 44 +- {metamod => src}/mreg.h | 36 - {metamod => src}/mutil.cpp | 52 +- {metamod => src}/mutil.h | 51 +- src/new_baseclass.h | 42 + {metamod => src}/osdep.cpp | 65 +- {metamod => src}/osdep.h | 145 +- .../osdep_detect_gamedll_linux.cpp | 35 +- .../osdep_detect_gamedll_win32.cpp | 32 - {metamod => src}/osdep_linkent_linux.cpp | 37 +- {metamod => src}/osdep_linkent_win32.cpp | 32 - {metamod => src}/osdep_p.cpp | 34 +- src/osdep_p.h | 45 + {metamod => src}/plinfo.h | 36 - {metamod => src}/reg_support.cpp | 46 +- src/reg_support.h | 13 + src/ret_type.h | 39 + src/sdk_util.cpp | 76 + {metamod => src}/sdk_util.h | 62 +- {metamod => src}/support_meta.cpp | 43 +- {metamod => src}/support_meta.h | 50 +- {metamod => src}/tqueue.h | 0 {metamod => src}/types_meta.h | 37 - src/vdate.cpp | 22 + src/vdate.h | 9 + src/vers_meta.h | 26 + stub_plugin/.gitignore | 3 - stub_plugin/Config.mak | 5 - stub_plugin/Makefile | 6 - stub_plugin/dllapi.cpp | 119 - stub_plugin/dummy.h | 0 stub_plugin/dummy.rc | 0 stub_plugin/engine_api.cpp | 266 - stub_plugin/info_name.h | 0 stub_plugin/meta_api.cpp | 121 - stub_plugin/sdk_util.cpp | 50 - tools/getents.sh | 4 - tools/stlfilter | 27 - trace_plugin/.gitignore | 3 - trace_plugin/Config.mak | 13 - trace_plugin/Makefile | 6 - trace_plugin/dllapi.cpp | 445 -- trace_plugin/dllapi_post.cpp | 417 -- trace_plugin/dllapi_post.h | 113 - trace_plugin/engine_api.cpp | 1094 ---- trace_plugin/engine_api_post.cpp | 1091 ---- trace_plugin/engine_api_post.h | 276 - trace_plugin/h_export.cpp | 49 - trace_plugin/info_name.h | 54 - trace_plugin/log_plugin.cpp | 64 - trace_plugin/log_plugin.h | 59 - trace_plugin/meta_api.cpp | 169 - trace_plugin/plugin.cpp | 75 - trace_plugin/plugin.h | 44 - trace_plugin/res_meta.rc | 76 - trace_plugin/sdk_util.cpp | 143 - trace_plugin/trace_api.cpp | 300 - trace_plugin/trace_api.h | 102 - trace_plugin/vdate.cpp | 51 - wdmisc_plugin/.gitignore | 3 - wdmisc_plugin/Config.mak | 13 - wdmisc_plugin/Makefile | 6 - wdmisc_plugin/dll_plugin.cpp | 134 - wdmisc_plugin/dll_plugin.h | 45 - wdmisc_plugin/engine_api.cpp | 69 - wdmisc_plugin/h_export.cpp | 49 - wdmisc_plugin/info_name.h | 54 - wdmisc_plugin/log_plugin.cpp | 64 - wdmisc_plugin/log_plugin.h | 59 - wdmisc_plugin/meta_api.cpp | 169 - wdmisc_plugin/plugin.h | 44 - wdmisc_plugin/res_meta.rc | 76 - wdmisc_plugin/sdk_util.cpp | 143 - wdmisc_plugin/vdate.cpp | 51 - wdmisc_plugin/wdmisc.cpp | 209 - wdmisc_plugin/wdmisc.h | 51 - 428 files changed, 106991 insertions(+), 22921 deletions(-) delete mode 100644 ABOUT.txt delete mode 100644 Config.mak delete mode 100644 GPL.txt delete mode 100644 README.txt create mode 100644 bin/metamod.dll create mode 100644 bin/metamod.so delete mode 100644 doc/Changelog delete mode 100644 doc/README.txt delete mode 100644 doc/TODO delete mode 100644 doc/config.ini delete mode 100644 doc/html/Index.html delete mode 100644 doc/html/a.html delete mode 100644 doc/html/about.html delete mode 100644 doc/html/coding.html delete mode 100644 doc/html/dllapi_notes.html delete mode 100644 doc/html/engine_notes.html delete mode 100644 doc/html/faq.html delete mode 100644 doc/html/gamesupport.html delete mode 100644 doc/html/links.html delete mode 100644 doc/html/maillist.html delete mode 100644 doc/html/metamod.html delete mode 100644 doc/html/newapi_notes.html delete mode 100644 doc/html/release_notes.html delete mode 100644 doc/html/supportedmods.html delete mode 100644 doc/html/trace.html delete mode 100644 doc/html/wdmisc.html delete mode 100644 doc/plugins.ini delete mode 100644 doc/txt/Index.txt delete mode 100644 doc/txt/a.txt delete mode 100644 doc/txt/about.txt delete mode 100644 doc/txt/coding.txt delete mode 100644 doc/txt/dllapi_notes.txt delete mode 100644 doc/txt/engine_notes.txt delete mode 100644 doc/txt/faq.txt delete mode 100644 doc/txt/gamesupport.txt delete mode 100644 doc/txt/links.txt delete mode 100644 doc/txt/maillist.txt delete mode 100644 doc/txt/metamod.txt delete mode 100644 doc/txt/newapi_notes.txt delete mode 100644 doc/txt/release_notes.txt delete mode 100644 doc/txt/supportedmods.txt delete mode 100644 doc/txt/trace.txt delete mode 100644 doc/txt/wdmisc.txt delete mode 100644 doc/txt/windows_notes.txt delete mode 100644 hlsdk/common/engine_launcher_api.h delete mode 100644 hlsdk/common/exefuncs.h delete mode 100644 hlsdk/dlls/util.h delete mode 100644 hlsdk/dlls/vector.h delete mode 100644 hlsdk/engine/cdll_int.h delete mode 100644 hlsdk/engine/keydefs.h delete mode 100644 hlsdk/hlsdk_readme.txt create mode 100644 lib/libacof32.lib create mode 100644 lib/libirc.a create mode 100644 lib/libirc.lib create mode 100644 lib/linux32/libaelf32.a delete mode 100644 metamod/.gitignore delete mode 100644 metamod/Config.mak delete mode 100644 metamod/Makefile delete mode 100644 metamod/api_info.cpp delete mode 100644 metamod/build_all.sh delete mode 100644 metamod/game_autodetect.cpp delete mode 100644 metamod/game_autodetect.h delete mode 100644 metamod/game_support.h delete mode 100644 metamod/h_export.h delete mode 100644 metamod/i386pe.merge delete mode 100644 metamod/info_name.h delete mode 100644 metamod/linkgame.cpp delete mode 100644 metamod/linkplug.cpp delete mode 100644 metamod/metamod.vcproj delete mode 100644 metamod/mhook.h delete mode 100644 metamod/mqueue.cpp delete mode 100644 metamod/mqueue.h delete mode 100644 metamod/new_baseclass.h delete mode 100644 metamod/osdep_p.h delete mode 100644 metamod/reg_support.h delete mode 100644 metamod/ret_type.h delete mode 100644 metamod/sdk_util.cpp delete mode 100644 metamod/studioapi.cpp delete mode 100644 metamod/studioapi.h delete mode 100644 metamod/thread_logparse.cpp delete mode 100644 metamod/thread_logparse.h delete mode 100644 metamod/vdate.cpp delete mode 100644 metamod/vdate.h delete mode 100644 metamod/vers_meta.h rename {metamod => msvc}/metamod.def (100%) rename {metamod => msvc}/metamod.sln (76%) create mode 100644 msvc/metamod.vcxproj create mode 100644 msvc/metamod.vcxproj.filters rename {metamod => msvc}/res_meta.rc (98%) rename {hlsdk/engine => sdk/common}/Sequence.h (99%) rename {hlsdk => sdk}/common/beamdef.h (100%) rename {hlsdk => sdk}/common/cl_entity.h (100%) rename {hlsdk => sdk}/common/com_model.h (97%) rename {hlsdk => sdk}/common/con_nprint.h (93%) rename {hlsdk => sdk}/common/const.h (97%) rename {hlsdk => sdk}/common/crc.h (87%) rename {hlsdk => sdk}/common/cvardef.h (86%) rename {hlsdk => sdk}/common/demo_api.h (100%) rename {hlsdk => sdk}/common/director_cmds.h (100%) rename {hlsdk => sdk}/common/dlight.h (100%) rename {hlsdk => sdk}/common/dll_state.h (100%) rename {hlsdk => sdk}/common/entity_state.h (98%) rename {hlsdk => sdk}/common/entity_types.h (100%) create mode 100644 sdk/common/enums.h rename {hlsdk => sdk}/common/event_api.h (100%) rename {hlsdk => sdk}/common/event_args.h (100%) rename {hlsdk => sdk}/common/event_flags.h (96%) rename {hlsdk => sdk}/common/hltv.h (68%) rename {hlsdk => sdk}/common/in_buttons.h (94%) create mode 100644 sdk/common/interface.cpp rename {hlsdk => sdk}/common/interface.h (100%) rename {hlsdk => sdk}/common/ivoicetweak.h (84%) rename {hlsdk => sdk}/common/mathlib.h (98%) rename {hlsdk => sdk}/common/net_api.h (100%) rename {hlsdk => sdk}/common/netadr.h (100%) rename {hlsdk => sdk}/common/nowin.h (93%) create mode 100644 sdk/common/parsemsg.cpp create mode 100644 sdk/common/parsemsg.h rename {hlsdk => sdk}/common/particledef.h (100%) rename {hlsdk => sdk}/common/pmtrace.h (100%) create mode 100644 sdk/common/port.h rename {hlsdk => sdk}/common/qfont.h (97%) rename {hlsdk => sdk}/common/r_efx.h (98%) rename {hlsdk => sdk}/common/r_studioint.h (89%) rename {hlsdk => sdk}/common/ref_params.h (100%) rename {hlsdk => sdk}/common/screenfade.h (100%) rename {hlsdk => sdk}/common/studio_event.h (92%) rename {hlsdk => sdk}/common/triangleapi.h (79%) rename {hlsdk => sdk}/common/usercmd.h (100%) rename {hlsdk => sdk}/common/weaponinfo.h (95%) create mode 100644 sdk/dlls/AI_BaseNPC_Schedule.cpp create mode 100644 sdk/dlls/Makefile create mode 100644 sdk/dlls/Wxdebug.cpp create mode 100644 sdk/dlls/activity.h create mode 100644 sdk/dlls/activitymap.h create mode 100644 sdk/dlls/aflock.cpp create mode 100644 sdk/dlls/agrunt.cpp create mode 100644 sdk/dlls/airtank.cpp create mode 100644 sdk/dlls/animating.cpp create mode 100644 sdk/dlls/animation.cpp create mode 100644 sdk/dlls/animation.h create mode 100644 sdk/dlls/apache.cpp create mode 100644 sdk/dlls/barnacle.cpp create mode 100644 sdk/dlls/barney.cpp create mode 100644 sdk/dlls/basemonster.h create mode 100644 sdk/dlls/bigmomma.cpp create mode 100644 sdk/dlls/bloater.cpp create mode 100644 sdk/dlls/bmodels.cpp create mode 100644 sdk/dlls/bullsquid.cpp create mode 100644 sdk/dlls/buttons.cpp create mode 100644 sdk/dlls/cbase.cpp create mode 100644 sdk/dlls/cbase.h rename {hlsdk => sdk}/dlls/cdll_dll.h (95%) create mode 100644 sdk/dlls/client.cpp create mode 100644 sdk/dlls/client.h create mode 100644 sdk/dlls/combat.cpp create mode 100644 sdk/dlls/controller.cpp create mode 100644 sdk/dlls/crossbow.cpp create mode 100644 sdk/dlls/crowbar.cpp create mode 100644 sdk/dlls/decals.h create mode 100644 sdk/dlls/defaultai.cpp create mode 100644 sdk/dlls/defaultai.h create mode 100644 sdk/dlls/doors.cpp create mode 100644 sdk/dlls/doors.h create mode 100644 sdk/dlls/effects.cpp create mode 100644 sdk/dlls/effects.h create mode 100644 sdk/dlls/egon.cpp rename {hlsdk => sdk}/dlls/enginecallback.h (96%) create mode 100644 sdk/dlls/explode.cpp create mode 100644 sdk/dlls/explode.h rename {hlsdk => sdk}/dlls/extdll.h (65%) create mode 100644 sdk/dlls/flyingmonster.cpp create mode 100644 sdk/dlls/flyingmonster.h create mode 100644 sdk/dlls/func_break.cpp create mode 100644 sdk/dlls/func_break.h create mode 100644 sdk/dlls/func_tank.cpp create mode 100644 sdk/dlls/game.cpp create mode 100644 sdk/dlls/game.h create mode 100644 sdk/dlls/gamerules.cpp create mode 100644 sdk/dlls/gamerules.h create mode 100644 sdk/dlls/gargantua.cpp create mode 100644 sdk/dlls/gauss.cpp create mode 100644 sdk/dlls/genericmonster.cpp create mode 100644 sdk/dlls/ggrenade.cpp create mode 100644 sdk/dlls/globals.cpp create mode 100644 sdk/dlls/glock.cpp create mode 100644 sdk/dlls/gman.cpp create mode 100644 sdk/dlls/h_ai.cpp create mode 100644 sdk/dlls/h_battery.cpp create mode 100644 sdk/dlls/h_cine.cpp create mode 100644 sdk/dlls/h_cycler.cpp rename {stub_plugin => sdk/dlls}/h_export.cpp (52%) create mode 100644 sdk/dlls/handgrenade.cpp create mode 100644 sdk/dlls/hassassin.cpp create mode 100644 sdk/dlls/headcrab.cpp create mode 100644 sdk/dlls/healthkit.cpp create mode 100644 sdk/dlls/hgrunt.cpp create mode 100644 sdk/dlls/hl.def create mode 100644 sdk/dlls/hl.dsp create mode 100644 sdk/dlls/hlgl.def create mode 100644 sdk/dlls/hornet.cpp create mode 100644 sdk/dlls/hornet.h create mode 100644 sdk/dlls/hornetgun.cpp create mode 100644 sdk/dlls/houndeye.cpp create mode 100644 sdk/dlls/ichthyosaur.cpp create mode 100644 sdk/dlls/islave.cpp create mode 100644 sdk/dlls/items.cpp create mode 100644 sdk/dlls/items.h create mode 100644 sdk/dlls/leech.cpp create mode 100644 sdk/dlls/lights.cpp create mode 100644 sdk/dlls/maprules.cpp create mode 100644 sdk/dlls/maprules.h create mode 100644 sdk/dlls/monsterevent.h create mode 100644 sdk/dlls/monstermaker.cpp create mode 100644 sdk/dlls/monsters.cpp create mode 100644 sdk/dlls/monsters.h create mode 100644 sdk/dlls/monsterstate.cpp create mode 100644 sdk/dlls/mortar.cpp create mode 100644 sdk/dlls/mp5.cpp create mode 100644 sdk/dlls/mpstubb.cpp create mode 100644 sdk/dlls/msvc10/hl.sln create mode 100644 sdk/dlls/msvc10/hl.vcxproj create mode 100644 sdk/dlls/msvc10/hl.vcxproj.filters create mode 100644 sdk/dlls/msvc11/hl.sln create mode 100644 sdk/dlls/msvc11/hl.vcxproj create mode 100644 sdk/dlls/msvc11/hl.vcxproj.filters create mode 100644 sdk/dlls/multiplay_gamerules.cpp create mode 100644 sdk/dlls/nihilanth.cpp create mode 100644 sdk/dlls/nodes.cpp create mode 100644 sdk/dlls/nodes.h create mode 100644 sdk/dlls/observer.cpp create mode 100644 sdk/dlls/osprey.cpp create mode 100644 sdk/dlls/pathcorner.cpp create mode 100644 sdk/dlls/plane.cpp create mode 100644 sdk/dlls/plane.h create mode 100644 sdk/dlls/plats.cpp create mode 100644 sdk/dlls/player.cpp create mode 100644 sdk/dlls/player.h create mode 100644 sdk/dlls/playermonster.cpp create mode 100644 sdk/dlls/python.cpp create mode 100644 sdk/dlls/rat.cpp create mode 100644 sdk/dlls/roach.cpp create mode 100644 sdk/dlls/rpg.cpp create mode 100644 sdk/dlls/satchel.cpp create mode 100644 sdk/dlls/saverestore.h create mode 100644 sdk/dlls/schedule.cpp create mode 100644 sdk/dlls/schedule.h create mode 100644 sdk/dlls/scientist.cpp create mode 100644 sdk/dlls/scripted.cpp create mode 100644 sdk/dlls/scripted.h create mode 100644 sdk/dlls/scriptevent.h create mode 100644 sdk/dlls/shotgun.cpp create mode 100644 sdk/dlls/singleplay_gamerules.cpp create mode 100644 sdk/dlls/skill.cpp create mode 100644 sdk/dlls/skill.h create mode 100644 sdk/dlls/sound.cpp create mode 100644 sdk/dlls/soundent.cpp create mode 100644 sdk/dlls/soundent.h create mode 100644 sdk/dlls/spectator.cpp create mode 100644 sdk/dlls/spectator.h create mode 100644 sdk/dlls/squad.h create mode 100644 sdk/dlls/squadmonster.cpp create mode 100644 sdk/dlls/squadmonster.h create mode 100644 sdk/dlls/squeakgrenade.cpp create mode 100644 sdk/dlls/stats.cpp create mode 100644 sdk/dlls/subs.cpp create mode 100644 sdk/dlls/talkmonster.cpp create mode 100644 sdk/dlls/talkmonster.h create mode 100644 sdk/dlls/teamplay_gamerules.cpp create mode 100644 sdk/dlls/teamplay_gamerules.h create mode 100644 sdk/dlls/tempmonster.cpp create mode 100644 sdk/dlls/tentacle.cpp create mode 100644 sdk/dlls/trains.h create mode 100644 sdk/dlls/triggers.cpp create mode 100644 sdk/dlls/tripmine.cpp create mode 100644 sdk/dlls/turret.cpp create mode 100644 sdk/dlls/util.cpp create mode 100644 sdk/dlls/util.h create mode 100644 sdk/dlls/vector.h create mode 100644 sdk/dlls/weapons.cpp create mode 100644 sdk/dlls/weapons.h create mode 100644 sdk/dlls/world.cpp create mode 100644 sdk/dlls/wpn_shared/hl_wpn_glock.cpp create mode 100644 sdk/dlls/wxdebug.h create mode 100644 sdk/dlls/xen.cpp create mode 100644 sdk/dlls/zombie.cpp create mode 100644 sdk/engine/APIProxy.h rename {hlsdk => sdk}/engine/anorms.h (100%) rename {hlsdk => sdk}/engine/archtypes.h (100%) create mode 100644 sdk/engine/cdll_int.h rename {hlsdk => sdk}/engine/custom.h (90%) rename {hlsdk => sdk}/engine/customentity.h (100%) rename {hlsdk => sdk}/engine/edict.h (75%) rename {hlsdk => sdk}/engine/eiface.h (88%) rename {hlsdk => sdk}/engine/progdefs.h (98%) rename {hlsdk => sdk}/engine/progs.h (100%) rename {hlsdk => sdk}/engine/shake.h (94%) rename {hlsdk => sdk}/engine/studio.h (94%) create mode 100644 sdk/pm_shared/pm_debug.c rename {hlsdk => sdk}/pm_shared/pm_debug.h (100%) rename {hlsdk => sdk}/pm_shared/pm_defs.h (89%) rename {hlsdk => sdk}/pm_shared/pm_info.h (91%) rename {hlsdk => sdk}/pm_shared/pm_materials.h (97%) create mode 100644 sdk/pm_shared/pm_math.c rename {hlsdk => sdk}/pm_shared/pm_movevars.h (100%) create mode 100644 sdk/pm_shared/pm_shared.c rename {hlsdk => sdk}/pm_shared/pm_shared.h (100%) rename {metamod => src}/api_hook.cpp (92%) rename {metamod => src}/api_hook.h (89%) rename {trace_plugin => src}/api_info.cpp (91%) rename {metamod => src}/api_info.h (83%) create mode 100644 src/asmlib.h rename {metamod => src}/commands_meta.cpp (82%) rename {metamod => src}/commands_meta.h (50%) rename {metamod => src}/comp_dep.h (56%) rename {metamod => src}/conf_meta.cpp (77%) rename {metamod => src}/conf_meta.h (51%) rename {metamod => src}/dllapi.cpp (91%) rename {metamod => src}/dllapi.h (76%) rename {metamod => src}/engine_api.cpp (93%) rename {metamod => src}/engine_api.h (89%) rename {metamod => src}/engine_t.h (100%) rename {metamod => src}/enginecallbacks.h (100%) rename {metamod => src}/engineinfo.cpp (95%) rename {metamod => src}/engineinfo.h (95%) create mode 100644 src/game_autodetect.cpp create mode 100644 src/game_autodetect.h rename {metamod => src}/game_support.cpp (83%) create mode 100644 src/game_support.h rename {metamod => src}/games.h (82%) rename {metamod => src}/h_export.cpp (74%) create mode 100644 src/h_export.h create mode 100644 src/info_name.h rename {metamod => src}/linkent.h (62%) create mode 100644 src/linkplug.cpp rename {metamod => src}/log_meta.cpp (66%) rename {metamod => src}/log_meta.h (66%) rename {metamod => src}/meta_api.h (85%) rename {metamod => src}/meta_eiface.cpp (90%) rename {metamod => src}/meta_eiface.h (86%) rename {metamod => src}/metamod.cpp (89%) rename {metamod => src}/metamod.h (82%) rename {metamod => src}/mhook.cpp (100%) rename {metamod => src}/mlist.cpp (92%) rename {metamod => src}/mlist.h (61%) rename {metamod => src}/mm_pextensions.h (69%) rename {metamod => src}/mplayer.cpp (60%) rename {metamod => src}/mplayer.h (51%) rename {metamod => src}/mplugin.cpp (94%) rename {metamod => src}/mplugin.h (82%) rename {metamod => src}/mreg.cpp (88%) rename {metamod => src}/mreg.h (75%) rename {metamod => src}/mutil.cpp (85%) rename {metamod => src}/mutil.h (63%) create mode 100644 src/new_baseclass.h rename {metamod => src}/osdep.cpp (82%) rename {metamod => src}/osdep.h (75%) rename {metamod => src}/osdep_detect_gamedll_linux.cpp (84%) rename {metamod => src}/osdep_detect_gamedll_win32.cpp (80%) rename {metamod => src}/osdep_linkent_linux.cpp (74%) rename {metamod => src}/osdep_linkent_win32.cpp (82%) rename {metamod => src}/osdep_p.cpp (56%) create mode 100644 src/osdep_p.h rename {metamod => src}/plinfo.h (53%) rename {metamod => src}/reg_support.cpp (79%) create mode 100644 src/reg_support.h create mode 100644 src/ret_type.h create mode 100644 src/sdk_util.cpp rename {metamod => src}/sdk_util.h (58%) rename {metamod => src}/support_meta.cpp (56%) rename {metamod => src}/support_meta.h (67%) rename {metamod => src}/tqueue.h (100%) rename {metamod => src}/types_meta.h (51%) create mode 100644 src/vdate.cpp create mode 100644 src/vdate.h create mode 100644 src/vers_meta.h delete mode 100644 stub_plugin/.gitignore delete mode 100644 stub_plugin/Config.mak delete mode 100644 stub_plugin/Makefile delete mode 100644 stub_plugin/dllapi.cpp delete mode 100644 stub_plugin/dummy.h delete mode 100644 stub_plugin/dummy.rc delete mode 100644 stub_plugin/engine_api.cpp delete mode 100644 stub_plugin/info_name.h delete mode 100644 stub_plugin/meta_api.cpp delete mode 100644 stub_plugin/sdk_util.cpp delete mode 100644 tools/getents.sh delete mode 100644 tools/stlfilter delete mode 100644 trace_plugin/.gitignore delete mode 100644 trace_plugin/Config.mak delete mode 100644 trace_plugin/Makefile delete mode 100644 trace_plugin/dllapi.cpp delete mode 100644 trace_plugin/dllapi_post.cpp delete mode 100644 trace_plugin/dllapi_post.h delete mode 100644 trace_plugin/engine_api.cpp delete mode 100644 trace_plugin/engine_api_post.cpp delete mode 100644 trace_plugin/engine_api_post.h delete mode 100644 trace_plugin/h_export.cpp delete mode 100644 trace_plugin/info_name.h delete mode 100644 trace_plugin/log_plugin.cpp delete mode 100644 trace_plugin/log_plugin.h delete mode 100644 trace_plugin/meta_api.cpp delete mode 100644 trace_plugin/plugin.cpp delete mode 100644 trace_plugin/plugin.h delete mode 100644 trace_plugin/res_meta.rc delete mode 100644 trace_plugin/sdk_util.cpp delete mode 100644 trace_plugin/trace_api.cpp delete mode 100644 trace_plugin/trace_api.h delete mode 100644 trace_plugin/vdate.cpp delete mode 100644 wdmisc_plugin/.gitignore delete mode 100644 wdmisc_plugin/Config.mak delete mode 100644 wdmisc_plugin/Makefile delete mode 100644 wdmisc_plugin/dll_plugin.cpp delete mode 100644 wdmisc_plugin/dll_plugin.h delete mode 100644 wdmisc_plugin/engine_api.cpp delete mode 100644 wdmisc_plugin/h_export.cpp delete mode 100644 wdmisc_plugin/info_name.h delete mode 100644 wdmisc_plugin/log_plugin.cpp delete mode 100644 wdmisc_plugin/log_plugin.h delete mode 100644 wdmisc_plugin/meta_api.cpp delete mode 100644 wdmisc_plugin/plugin.h delete mode 100644 wdmisc_plugin/res_meta.rc delete mode 100644 wdmisc_plugin/sdk_util.cpp delete mode 100644 wdmisc_plugin/vdate.cpp delete mode 100644 wdmisc_plugin/wdmisc.cpp delete mode 100644 wdmisc_plugin/wdmisc.h diff --git a/.gitignore b/.gitignore index c4d4798..ad10d73 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,13 @@ -#temporary files -*~ +.idea +*.iml +**/msvc/Debug* +**/msvc/Release* +**/msvc/*.sdf +**/msvc/*.opensdf +**/msvc/*.user +**/msvc/*.suo +**/msvc/*.aps +**/msvc/*.pch +**/msvc/*.txt +**/msvc/ipch +**/*.log \ No newline at end of file diff --git a/ABOUT.txt b/ABOUT.txt deleted file mode 100644 index cfef91c..0000000 --- a/ABOUT.txt +++ /dev/null @@ -1,35 +0,0 @@ -Metamod -=-=-=-= - -a Half-Life utility mod - - meta /me't*/ or /may't*/ or (Commonwealth) /mee't*/ adj.,pref. - [from analytic philosophy] One level of description up. - -The purpose of MetaMod is to function "one level up" from the normal -Half-Life game mod DLL. Sitting between the mod game DLL and the Half-Life -engine/binary, it intercepts the function calls between the two, with the -option of passing them along untouched, as well as passing them on to as -any number of _additional mod-like DLLs_. - -Thus, you can actually have multiple "mod-like" DLLs in operation at one -time. I say "mod-like" because these additional DLLs (we'll call them -"plugins") are not intended to provide a full "game"; that functionality -is still provided by the "game dll". However, these plugins can _add to_ -or _modify the functionality provided by the game dll, or by the engine -itself - for instance, adding new server commands, or new client commands, -or even disabling commands built into the game dll. Although the plugin -isn't intended to provide full HL-game functionality, since it's receiving -the same information given to the game DLL, it has the opportunity to do -_anything_ the game DLL can do (given enough coding effort of course). - -This is very similar to the way Alfred Reynolds' AdminMod -(www.adminmod.org) works, as it also sits between the engine and game dll, -catching routines, and passing them on. thus modifying functionality. -However, rather than providing just the additional server features builtin -to AdminMod DLL, MetaMod allows you to add features from multiple, -separate DLLs. Under that framework, AdminMod can be a plugin itself, and -be run alongside numerous other plugins. And, as of version 2.50 of -AdminMod, AM has now transitioned to running as a Metamod plugin. - --------------------------------------------------------------------------- diff --git a/Config.mak b/Config.mak deleted file mode 100644 index 83f24a7..0000000 --- a/Config.mak +++ /dev/null @@ -1,4 +0,0 @@ -PROJNAME = metamod - -#SUBDIRS := $(shell find */Makefile | sed "s/.Makefile//") -SUBDIRS = metamod stub_plugin trace_plugin wdmisc_plugin diff --git a/GPL.txt b/GPL.txt deleted file mode 100644 index 5b6e7c6..0000000 --- a/GPL.txt +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/Makefile b/Makefile index 0b65d02..e1e0d47 100644 --- a/Makefile +++ b/Makefile @@ -1,31 +1,53 @@ -# vi: set ts=4 sw=4 : -# vim: set tw=75 : +COMPILER = /opt/intel/bin/icpc +SDKSRC = sdk +DIRSRC = src +NAME = metamod -# MetaMod toplevel makefile -# Copyright (c) 2001-2003 Will Day -# -# some sections as demonstated in GNU's make.info documentation +SRCFILES = src/api_hook.cpp src/api_info.cpp src/commands_meta.cpp src/conf_meta.cpp \ + src/dllapi.cpp src/engine_api.cpp src/engineinfo.cpp src/game_support.cpp \ + src/game_autodetect.cpp src/h_export.cpp src/linkplug.cpp \ + src/log_meta.cpp src/meta_eiface.cpp src/metamod.cpp src/mlist.cpp src/mplayer.cpp \ + src/mplugin.cpp src/mreg.cpp src/mutil.cpp src/osdep.cpp src/osdep_p.cpp src/reg_support.cpp src/sdk_util.cpp \ + src/support_meta.cpp src/vdate.cpp src/osdep_linkent_linux.cpp src/osdep_detect_gamedll_linux.cpp -include Config.mak +OBJECTS = $(SRCFILES) lib/libirc.a lib/linux32/libaelf32.a -ifeq "$(USER)" "willday" -include priv/top.mak -endif +LINK = -lm -ldl -static-intel -static-libgcc -no-intel-extensions -.DEFAULT: - for i in $(SUBDIRS); do \ - $(MAKE) -C $$i $@ || exit; \ - done +OPT_FLAGS = -O3 -msse3 -no-prec-div -fp-model fast=2 -funroll-loops -fomit-frame-pointer -fno-stack-protector \ +-D__METAMOD_BUILD__ -D__BUILD_FAST_METAMOD__ -D__INTERNALS_USE_REGPARAMS__ -.PHONY: subdirs dlls $(SUBDIRS) +INCLUDE = -I. -I$(DIRSRC) -I$(SDKSRC)/common -I$(SDKSRC)/engine -I$(SDKSRC)/dlls -I$(SDKSRC)/pm_shared -subdirs: $(SUBDIRS) +BIN_DIR = Release +CFLAGS = $(OPT_FLAGS) -$(SUBDIRS): - $(MAKE) -C $@ +CFLAGS += -g -fvisibility=hidden -fvisibility-inlines-hidden -DNDEBUG -Dlinux -D__linux__ -std=c++0x -shared -wd147,274 -fasm-blocks -clean cleanall: - for i in $(SUBDIRS); do \ - $(MAKE) -C $$i cleanall || exit; \ - done - -rm dlls/* dlls/debug/* +OBJ_LINUX := $(OBJECTS:%.c=$(BIN_DIR)/%.o) + +$(BIN_DIR)/%.o: %.c + $(COMPILER) $(INCLUDE) $(CFLAGS) -o $@ -c $< + +all: + mkdir -p $(BIN_DIR) + mkdir -p $(BIN_DIR)/sdk + + $(MAKE) $(NAME) && strip -x $(BIN_DIR)/$(NAME).so + +$(NAME): $(OBJ_LINUX) + $(COMPILER) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -o$(BIN_DIR)/$(NAME).so + +check: + cppcheck $(INCLUDE) --quiet --max-configs=100 -D__linux__ -DNDEBUG -DHAVE_STDINT_H . + +debug: + $(MAKE) all DEBUG=false + +default: all + +clean: + rm -rf Release/*.o + rm -rf Release/$(NAME).so + rm -rf Debug/*.o + rm -rf Debug/$(NAME).so diff --git a/README.txt b/README.txt deleted file mode 100644 index d876143..0000000 --- a/README.txt +++ /dev/null @@ -1,7 +0,0 @@ -Metamod Half-Life utility mod - -See the files under "doc/txt" or "doc/html" for more information. - -Will Day -willday@metamod.org -http://www.metamod.org/ diff --git a/bin/metamod.dll b/bin/metamod.dll new file mode 100644 index 0000000000000000000000000000000000000000..9fdacdd6137c97cac4118a8def75702ea4ce671a GIT binary patch literal 210944 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 Nhym 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%0A{8Jl3z3zr@=Y7*%7vJz!TDDT<~V_T~h2 z>MLfo+ZHpvs7Cnh1wbLK-B!|cJumA9c^i&qk7Hb#Xjj01U;8?84`nmvil0%@{t z^LK0k_CevauY}RG=ahM{xhQAP@~2i|Qo>{tNL;efrm)D}R_1O^iDE#j#1|^_gwZ_* zlUt%7?@A9^K!gH@o))-bxCXT=(j^1ge5xrmnGir|IQ%f{xT-o76e&&+4PrYIJBT4A zo(Z1qSZJ@vV1|NEOL$-Cdm^nF3W_KvGNS5NBtJvJC)KZrzJ`J#_Gx|TL4H!cCEri+ zZK@Iky}EZKgH?jUu`l_oW5;A@dw8rt$v-2e)s9G)e7eQ7MlIM(+N8+m?_nSBzx*aG zxP-{&qatT2LU`qTwOxc5RZv7&IqAbnpfxDss3B#|wDr;V@V7p?hhN@wE$_;kQgs9( z_bQtMTI=fo!}EHJmu=S21FyZ%G!3+x(W}YT)Z8nXX)pY`dpI-|(?qk)v@m`mHjTDoVlHthE%MBvknZT*_y> zLNBTKu7P98gCE%mbX{2DjFj4R9EL4SO^e8*gh)3_qaxqnL$WTgvsS=hyIoDYAT6|B z3b6YivQ}j)Nt3cwIo+sox=$qMEYg_gdyc!<>p01RfV0t%~AZ>KrUJzD6gq8WhQgKThw1G#*oMh#49dL3co%P z{^wXDZTr52uhm+9#?!I*F0JK9;@+#Z{F}G|tY3+{1#R8pE<+*)S2{*!flL>Bp@f4E z^UXnoQGuBsvK-hL^;uyhZtaUH>FU_dJw&mdBfS}xy0WLVrOa&&3OJ-7!o{xC=*oa)kE-lUZ{;ux=HPQXLW5c?LRXFg{xF`vB~*iqFU} z06Q??Ne(cToVmQr8pWn!s(H}--0%b)=**PdTB<;2arUH}H@Gf=omFifUJ~M7$H?Sog1#zLi7l((a(_eo}OFTwBGt*0?;o#1o+1U6J4LQchZCBrG)7yEtE` zgR_M*i8kq3=vP1A5Ng~;BJk&7wE;9p4mUVxY_+xT4@{WIIv~d2dhMYlE&cx21ZCBdW1k%QX%YsB8ni`s# z(e1Xk09Y;>&qc&aM*urHcLu8MiNm)edaJhsL(c3ivI)%D0chLj!h2Q{R%87ec!V~! zY10^E@i}uyV7cC*#+u68hCx&(7>PU%G-5kydP#zMahd= z%E6=er-7!AW*L7TP|9NMXx_uw#{W|u{u{Cnz4E>r#F;zfU`i$sh_Ld^644PDiqI0JyI(I>ro!Zzd%bo4)YxKMH z#0}(!S07>b^EJ_l{hcX^uY#zjzcW=IYlpF;N-K%Y)RZ%{V6SWwrh*m>_IL8CyY$#+Zh3gF{nz`S68Ero@>$Tl5qNVzfO)NVd3QH%G{}08ng3DBD?(a7hDG;`5 z?dl|#L%P^bJAqDdrplFSnJP09eoIp8@D-+WQ2d4oKk4_V8o)m5wz< z4u7DT7`&mZg0IU1MA)#bzx|3BT(!Fcp_I&qucu`GH-E0yl+4@sTg~53`HK?9{Tnf= z{&~vC=2tKheQoSk*OoD6YTH70t2>se?dpg^qjuj0mO#ighQfncJgtozuSTavjsGU=n&GhE z@y3@>&k#t1#u!RhZw+H=3urT?t!BFeUtyX^n&=>I;DlP)xiU7@gLX}NWV>rPlrY^T zp|R{70#!q|yFV>Bb2!+O6fD&8L3=pjM?Q@_H=WK~%+-MQuQB+~8)x z2m9}zx?Pu){dUa}u*W8(ysOcjI`|ddxgix1WOV;3?FY(4Uv*6qft`Hh**jSOB=3Nl z*lTt+_0P!H4(X9$&>jVnZWspbS0HKnFzB!XNppumrxZxqHw-$bKv~J4%sMGCCmA$N zfpU{UB?^?63|gW<`N<$%fu<#c9#o*|$)G0{Xht$VznJMDgxra>0fs6295Gbjpo$8eB2RFecca|La(1%%OSZ6&ju!$z z>~ItWYDtn#D(kV^kYlQMeX{#2}ZS;Vkz z?xMy@+!|$QUzg4Ltc_2KPVNp$9wY%3t6z(fLrIXx3=ovxZK<;ZdD`xDWAF7tWZaub~^FSYC zY=ivcj(ygSXmq)ohg9%eBKPC2Un8BAN(GHMO86M;`3J8;jk&~{|9hkugdN55z#Ifs z27|!Ii*o-VwFs>6=U6}54_JxhYt|1aei#us4;s(}23FC};t6tW8d|k=3M?;YS!kxp zD9R8n*hbVumw_YUbzWjU%Pi_7AFuRFqVX>dGPPBMAXP-?4K&-@Mn+ z*MLB}ocCq!*v#KZtrNt9_}Wl92|dCV&plnwskYAXkb%8EhU~1|R?0a@;jp)fFEU=$ z)_?s*ZeFYZEd3!bF`;auI{ybWN${0enTka<%dNfzXITf5+ZOYn7!P9~SYj0K6%Ff- zs$WU5fvHv2?JV(-OF?A@j0=~8a}?J8^kq_qa#!>sNKBF_w8$MA6Izu6#uQ5lsqp2| zRm%m5A@>Ys$itW%e^Gv-qs(+Bw5?^_JFww>Mw{@*BwT(zE!^&_!lNQ*GQZf_qwSuH z0DEn^(VpY%V9HH`_XZ&n@6d)32zfYP_MX`=a-PvX&HKs*OIg842-3z`49U+wRNuq| zvn6Y{(^(FmamsyOoOTd#+HgX47P(qxfkdk34?7b4+H$8$7{hA>#^YZ?ZewyO#g+PO zvn0R6x^&<$w3_%7N|wO2$q_Kin>^f`XYp=s#~LQ0_Q^W^KAFI7fZZR@Exa974n^E* z6i2soOksO-k*|!w^E^L_F|8}A%zw#fR^xZ==4W`-KT94`$?ftZjA|#P-rMCz7}ZWn z-M7mRLJu(Lv15uxzYsDOnB{Ca&L}d|GvIB10F*g%%Z+NUw}mfT4mo4Ut&gNxqR!C; z;;&*297V>RYa}3WlUcDgRCc(#V(o)6KY(0gj?TP`7nge_?#Wy!wvcC4tmUr z6~pDEfK994^<2}6L z-E{{%&V?TDk&Pn=3%JaEvX<=)hbh0Ko({C>O>jupym&XC*2rJU@hX%cV_UK4T1)Xy zw0`#jTS$4aLRvb_ZN=uFgegGYmlTWT8{xtcRYPWV7D)Kk?~8X4Y9zGQZ{s!2j6%Xt zJlot3?ZGD7cd_=+CgpPhlXHuW*Q-4w6NrNaw3hM!@u@HmRzww3f-C&UWvD`Pg&)R2 zx^OMS-n#mtj7G9w|#a+dPxChyI8U8V@^g>nj2rOxGSdh-ckl=eiDz%A0*{Eh8WNR%&Le zv#n*!lj14WTyt+W&N#RJg&qliKCR1{*LAZi&p#3x)Z@zs&iZG-?6EwxGxe3$l-A0W zuDPjs5UQjO{*ekg*V$U>>YAH2+bnkp*aoJzR%Ud~bHzPsj*bwn?+7Ht_`aG6Mbsr^;%HF9>H%Brd^ zJT7V<5T=J2l$r}d%bG|Un~C=iPcuon;zES%Aaab?SZ6P#+X5a=U#8EIqE)WOi?+Io zF4>4Gz|HZL(F6XBWkuz#ts@)XX}(dk%x`|ny7}|qP0>(qeRICLq-epvFg{|I$ogpl z@`{3-^I07UNCyyel?zK2$G6_o=x#pKblU0Iv=+Syj~Da^f7+xsLJLp9zT0Q*mNasp z2Ia9^R5qx!6qCBfnn20wpuI*iD?9!8Rif$OlyAb)J_Lq`Q;j24cSRm?91)S4Mc>5Q z;Xt7~kfnZ2jdk!=m7RV$SvjeP*%MD?W|$v5ZXPRmebQ^8rEWN8H8X>6bR|n|k4^dj zDTLzcDl5cYJA{VH`$rk=#YX3TSW#cYZlwy_TS*lm|C<%A$DMrw9QOtmUaBQY1=Re4kvQkiE>n;%Tyu=>yjwP=(0jEITuUo|k4ve*-<$w^t9i{OTcp$3mO{(UQvHoiwBqdkN0L{v0`5EZoE5u^Rm?utyg ztfB}c-27#FFr^|lwm2*LoXsirefa5wQ%q1EHD)?2{efG+W^m^>HSfZ#K!LUBc{ZR7 z8AD}h^D|%}Y?fOtp4grEoV7Zib&3FwR%x9juFS!9{r91aBUf;RiDOBs+Ezj+?etkq z_bckf3!Swv>Gb{y!oV-X-Litk*ne%H!xcm}^hsyeMf z2H4f^vu3k%Fn0Q_i^4$_WvBd_JEe!PI{yLj6dp_;!PjSf@>QYjLi=ipoiOmesZ!X* zL<))Dmf@dTI~yL?7sogpvleseKaHpG=|Ij#FJrkE7{WBNni$LnuLNf*rIJieVV>=Si1%i5&SYXZY6MV zk@k?VMC;!%2Cs&6H(0JeXbj#0dT(%n7BmSN>W)ysSX)I3M9wMU#i*v68JJ|Ai3O!C z#*by9IgB4K5ht>cn9w>k747;!hIuA3TR@OEuNU_&eT$GbuMj^Z%}c~x7PvB!jmK{4 zPNbD7_8U5#^Bv3%N^XT=L~g5PEic6bs@}VUo*&rnCJ>Lxp%$jiix z2mEg6K=jYHKl-NeV`;eKddk^?r{zE(r!AwnN*~n~lunKn-yF!Wy)05q_$|UKfE#D- z(U%)%zJ%)6Ghfv&i>aw)Pd10iQnwF zC6xGBX_tiwabmaTriX*FTR{@oic^j&HNg?`mCsgOXv<)>9H$9(jVi2PaM3o8Nm+J9 ztV}5}YMM$^(rjvB+M13wM{7_PA@h%RR2eOZ`;qTQ>5%xW{gOQjz+a|FfnqQdx_-g_d4upNYEe27E!&vnfs;TVZ3b zbSm@YODu2W>>V)hoGsIWqA>Lnwb5E`RC|DQcb6;uj(^e4jzJcH(*4jElrN06f-Pq+uSL8Aj?udLg7RMvJwr*QVod5Rr`gpS574dN`zIuimGZa zaINJJY%F%lxydci>{azjb z>kA;ox^&v6UJnN)JN70C z@>xFvyJ)K8l(DHZ6|^ptisAeCA^RPnvvwHPdaWgc8VPN^<;x@$V*5XYv?_p!vQ*)| zx{fP>mwoCjc4d2rhkAxvH-=PZIE!EV`ll|&pBUMSrkhp;+!bA_kI*E8WRmD1?Y@W- z_IsLcTB!v?H0T#AyUPBWR}nGrR}^0pSlx0|U*4uQomr_bsR*e#Hv7m%SKFIWSKC`{ zM`pje@rt(n+O7|--ly#vgopR#j(41l$ulWOd)=kkC(0KG-mzzFt&})q}Zpqx%Y11#@QKK@FZPZUUR|u`<2s46SC<+2XVJL zn`8+YXSV1I5)*$+Or2qY^dWU^@ZVc&-wPrS5Y;aBW2JdiY4NQpQcn{XCD%rF46UZh zda6t|3%hLpjOF&u7McFZ+W-1PT4pc9;T=#%J-GCQVWoy_&tOVJqKaE0%P7>o=(XlB z;MT*zM6k*nbRu-62%`tz&df}L!XT{)G~+o!cG<>oOwFa2Bz>@AEnt+g!YvuUqd zg!YWk(LD-Nb!0vPU0gs)#8vxS%0C;~S@DsDRk&SuJ(Ci>#$K-%-lKj2S$nt(?4D~= zqhjpMr-|$VTj@Tz49~%pVZ75gvtIwAIxkMHBeB}k*cGrwBLf|~H;`|fou!4NG7W-D z$ixiG#a4T=#~D)J9dA0L+|VV6r}0QOZ3(Zmx-TO|Pv}tzh%Qhi9HRu4_jgrp63gaWaR5qcYgjoCEPt=Dd*}2+tz`i7fZ$A9Ev&XJeNR>HmUwjtW71Q1J%+%{X zt*gFH?(xZ$*oq@jsgUY{PfW=1b{j*QMw zDO*S>yZHK!9}C!3Wj)xJ$O}A&iW^^QcE1_zhn=0n9VKaoJ8I3Rb<`@d`*=s)D9h(x zbW~*S1s$a-67M42Eqx+I8}F45{Ap5binQrA}3*A=wI?qmK-Av3{-a-}Lp1`z^ZDD~?O*c&q%!TXqo`AP4L&kj_JsG{$ zetQcEQl8wMCF(}RmN&i{{esDtrKjwmz48!9ft_Nf+)1s$FRI~~A)VI~^BzMm;6T7V zD=haNI5=Uj$;9Un?i!E8`NH~ttP;Zrg}+^HUABsr*{DXP4oc)7(ya!lVyrM#wzlh~ zN-Lc$nPvuhZ3VfapA6kzIiuP^<1Ro&S!sS|;n9KjnO&v%9^6-=b75LrL5Quy%yT4i z#I06_luFIgdNwFtGflZH`fpZPBuL>3pTfWW7g$DZHi8^<^vZQ6c6OiS(cah zAhfuSgi_)tv*uG+qD>~*qk&3c>CpLdJdkU>@&#@^vn&Vs#K|}N5E6<^BN65G*4M+n zP-X2$bY9U8##^tEz@NG*G{bsKlFo?ygUeT)@m0w3leOK>I_5R){Hja;J$%w^a@y|p zTEkisO|yRWCoG55)WF%vITa2*!mkgreA&}r6@b5!PiC_ge3yZ$UoXXm_C5^ILY1#w zxB=UyBvQJHYzE&dpY@zf&;9WnRGu^M@&4iBE>ZN1HfM^>F~f5)<0Ao8GF z(c7`<3q`6VY?19$B_3Z*RDZ0du)SMV6U>>TrVhS&@+qnD`RacSog%dN89qaMpOws) z&!guLhRX9qUqE%fkYyL;hRUaf7EO;V<}zv*fKUaMjTf>>3W+=oU_ce(pv(0yH}Bm; ze&8j382Ew_mfE1pq~ETEp0>x4M@{@C+>#}T)~|%dZoeFZUyzPa4FU17gb(;9RCB&I zN8S(OWhRwxmIR*2WL2xD00uIP_C77HJG3n?v@JinF{})FQHTUXnw!B0sk5AuCm!ZQ ziRkn=_$|QNZpG>EheLjM@LjrET*VNA`%e5@hCtva#kH=SE3=zk%A?1M_Wn?+FurK- zlj4psftKf(<#c6kQiUW^QibM!dWEk0zpK!9O5zpD303D7?R_j>p(oB)Xqu|f^rQ+& zq@)V%W~O{f5B(4@?G{#<|C1g{OH^oDsCs&0+D>QMR>gM8^0DTrTZG&K%hS!E%*45M z!UIsARitL8KGwQom8|R*DuDR`BmvE^EWg6`TS(&ym5)UHWlU&MX0$jVL;mVYCdkY1 zm#AgKC<`sLE1H`Kf0pnI0y#g1P3EL?BaR;ph+utRW}J`~%NP)|dWCsVXi`N*sCw)0 zgddQFiagtU3ExH+L8*lYL{C$uq^ML_x-`7TM`_Td5aWdy5D}$g#z!!%2u?l12ON@B z=BhQJ@-@c&F1HqJ2j(&z?%7t2AYe$nE*)FMb|bLeLDdN3ZSaF2yqBI$pZqI*Ie{a0w7sNuWK&)Rszr_ zfV}3SovHC8q;*8K=Avf>kU_Cj%MshO7JWTbldZ# zjbH8+A`8rt$YejnS{Ir4xQKmaWx~!@n$`A*h>f9Hh(3I=Rgv3ks#+&Mh;mw%wT$cy z55tTWnzI4{Wj1`*tV>`69}r@mC_t)$n1tj6h8NGV$uu)@VmECpLlFvOh>df?S&w^< zZ20VL)^pJ4m5w_7szl1L>jys0-#kfNCW+^V<}9F$9rO9&=yKAeIQfwV!M+M_YmU&s zYm6!AaLKfZLkuiCwmURSskHWpZX$Qnjh6?;!qRyFmWpz-=b6iaMQ?~XVGm2gyg)`p zTY7nG*(8PfpEH+3fE+wY!R2jblUmwQ1tqekf&VVf(_O_Q0zV~rMps1)MXigBJ8~SN zr?urEwMTKU9m823{ZK)ll{P6;3+~WtLo`%-sDBKU$~@6cTRykx#ufS*sb(Q^jpzq# z$Z_Z%1oE3^T@DGqFFG2Pq(_U&geL@U-y@Oes9PxA)s?ZLf_feZyf4~*^|?h0a{_J( zpH(~pTTw^#s};+!zeJi8)5l52sP>k}oXU-gWjrTeF=x55@N8%5Ak&EA177N($H~ZP zT+X0SxjLt~jUvs{vjw7y# z^O0?EN)HEm>^z`jvYQxFrAiK1*Eo&So@BBzl^wM(FvB7v#ah>>SmG5~_~^-m>BkY@ zu!)k8!)>KmgZ4cLMu|mlm;4Hi2#C{m>!X8R`iOzUJ4)ewj@Aj$I&NsaY_JfX`m%Gj zy;M~D$FgT};^9%sQ?h6B0c#NJq;TP>LRimxyuS-%Jhzy z_0_Ut!_vgP+avmAnIetaE>!hu&rcP_o+%qg1BS4>HQ)W=&!Q_OUh_vy48ztjL=kn<(5%no-sahZMbgWb>mH^?kPCZiY!lxXf*6MdpdgE&JJ*J8gHe`l3?Xfsylnt5bO?x5^IkV(r#b_<}IOPO#S$`x* zbP2zvT#xm#ax<+irPw@2*x&*SSu8$)LNq4`PKsEF0e|K>$8fLyTqEQ+-25u<*u;u zmAl5uRqk3VOS$!yN4a-fF6FMb&Q(bZb?dZpw^*l?yVW|0D^=JfQ`>q?ptkAMmz1|v zpzX>loMqNd<&}Gd^)uytM7%#xUct3kk0`IGSg}IN`$O?=Q{E@VyHRg)%NWP}106Cwm9OZpgyrY%(n0Ql__k?%{Zj=DHRU}l-j|g3lz7{fw@H;{Ad0o)hmQ$}7Zh_+q3q zxrJEU@Tw|{-e_yR3J}g$>kj3W?cKUvd9%d3Sb1~ATdKT5f47R1R~UM%&nR!cc&8}u zH1XyruV8tt(aJkRys64NQ@jI}QlnYoJ*B+DP-MNSyd~m&O?gYj`x0JNWqEH{dsV;! z@%}=2ed7HO(N%$-mqQ;*WcN+m=s6t4nNv%xupfI^NB#Z;bHcBwkh zs;w`slD!pGrG0YKQ?glaf1XkjTxufIAgW4x0isqDKHntGngnvSJ;BwMp1M%|2I(!& zx5((QIqz<7nzBBZY1+m(Z(Wa-@&l~|mbemjb>i&Chia-#9rgHvd)mrL*I^!Uc6o<3 zVSQeEpq|}t__)jX@X5%<0ANX@*R%&-X3)&;!mgjfw&DmRoq2D#hEq8-<3ETt&`mmr z7ThELF5CZI{Mz$>P30I(HzKa^CRZpU+~@-2+&K0_ZQB?l;tp?e*J-b5;YRlW?3iEz zzN9_>wo@~Hfxk|>chTwarqj5qGL6U#-10nr?wJwZ1W$r|zfz~o)?WA2X^ofi)hl27 z@DDfzrNFWfkzVRv|wN10e8Y|&tN(;)hZ@%}&OP4$xUman9|<#RZ1ceGkE zJ{R6}&W!!bd@)p%l&^dx|AX$F6 zRl;#S;ywYahrd(&O*tZW@V4@l){2z2@>KF|tw_b#gwd^XKQx>>eLWmk#Y*9hXLP4Z z9ey$#>tQ<%nxdtKT%ibU9S$Xrd#S(*{+95!fWK1yius$#-*o=W(r=s$l|FP5*TS`M zPvM@z?ZfTEJ&k)BcMx|F_Z;rIuuGn%4riZpFy0+zOf{N3pWyEqm3O{p)#}cNrNx4~ zP5ABB$05}5f*zqe5^=-&b?3rci_XOdA^-d!jQ+=mKR!pfS%+vrY~XczdjCr)ndFri zlQZ_1VDURYm_raTB=W=4@Gsy`=dZ2YIps)eh0}Of_1=4`_kNL-wbU&h=loc`n`*qL zMxiw+=EF(xXaOyZkJ-CU<2@N!?E$Wov7{8_-9sG?^LLEDUj8ip`uH2I{d5ecx+v&2>Wsj+r4QbU3 z)?@~Mi)C@v0BT$f=-#>#e(v${vuO=K+tw3sC$PqQfi-Rh*4Vf{tgc<*7n>;S*1!(1 z?u*ef^NzemE)M@YKnF=FuQ7wQ&$_=g@E)3}^{deY#yeuPIX-kTJ1hI@EeNHfwA!g_ zG6Bmg#Mrh^? zB1kNGfn$t?T4L8M6V~*Jh3)8Buy)@Hicc9p{7NH-5G>Y+1P|1Sq*Xc#{g%LKlDt~* zfwmh1vaa!BM^;|#w*=l5lt$pNt zJ0cQJ)*8lXRo1sk)?(!GPm<_jJMRMu>Ef<4-9o*f;J+7?xsMFaS3I&1QuY;byrVh}#8)XM7z6^qnX6oQMlBk%PLT{p!!mov_P`3J|mJ$dG?2;&{F-N=(y|>oX{J zI%3@YY2j6|s587R#d~(!VL?x1n6AGsAtF~I)tlQziZw2IJ*n_OWu<7P|G1{^!y=LS zai}$ta%w>a%;&zP@)ChgeKNNyiwB<&JGNxbk!$_N5g3}7ai7GB;|RBlB3xV#i-l6SA&TQZ60xTe?HYSKy$(qhG(R6lWh2Xg% zoPZ~a7NhAb6O5vpVFmkkm@=?JXj?`&fxtUvGH|v1ozB1*u_iK3G&7Gy1vk1UQUU{_fWql_u5N1R6-D6- zPYCfkwOXpC3_|wR z_^kTRP|qG?|1@Oao|5{UL1@%ClN!*d&&a1z0)tosr8di(8cwR(^d@Q(m#57-UmGDr z%C%i4;IGuhoe7t?d<%XF)DE|AuwjBu3XI^}HSi_`+p2*#6&2VGg*VG7^kDbEo6c8+ zmYbCPkdTkFARkYYOz^YNoeNfLOQL zc|n;%kUAmcD?6Ln9i2v_FyByZxp}an`SJ?l(zL4csk66G$DWw=lQvtN&N#(HMt+nn zsm4E4iwGp^uAvvzn%)lj<}dTeU>3|b!+o=u#}+r7))~0A@>b2r$ItK{>o}8U>--EY zM1<;unH3f_u5G0gT~8scFqF;%ky##V+;p+^pq=q^ICh6b-X~Zvm#^SHm8u0_!YyiG z)>~_cblI%vQ8LO;Z9hENS~d>M{(OD>d|1W11`cCX^SJT$5C<7L?W1espq?Y|BJ8-) z>36NFw&tVRgg|!qz$B|w6)HQQm8QJ%)Q@bUJVgJn;3CU0@}KM(3r|BQPw09soj_0Z zg_cafGRoiv|EpFM9(F9j^CM-V6}f_ zEzw&S3AN>>I+D9s@R=+QD92J{o zr;fbqBNcdwlX2Chv6(rs>?NFC^c}uwr1Dw4Y+|(-Bcn$mdmxOn8HPQm4L=o~Me2CU zFuKtlm6Dap!>95uGa1DO0E4*#aVYX#*NE9VraXECXx!VC$edAr zswCj{q*8_}n%0&<#?nVa1%q@YQlCN|7Gc(Z(Aq^poZ6CJuCN3!oJhWATX@T97kCx@4urC0&Rkljg{D zK05>>*IBbWau1VDnZUW<#NI{s!fKxjw>}jM8;o- zB5N6b=K4j@%KRg5=Rv_Jf69zMre=Jv%=p#zjE`5#9MpDa$Q2Q}CIafb9iq}MJ$j{C z)@!s6G4-dZd}~rA<1y3_N+J;=f1yovp)odoB?A4P&5$jD#o_a(3ZeQ_7Q&dsLePS; zd}J|bE!**t_XP{$Hp=mju0wD%;I{iATDZ*iB&KfJpns&A9f@^vhOepdTxw-&Q!Aub zdtj2Rkh^95j8z?+lqoh3SvRObcU$>vf>gs^H&U|xA{p2%jP54n{MSztb+~Z(jHoj+ z;&rr_P^6nFWjEQMw#wVZ8Tof_;&8Nf;f2HN&&cl>gJ0Hyuiz;>9(hfi_UJ_GI}$$2 z>O7w!xL%#d=PCQPa*OI0M3+Ui^>7mtlUHSEuJ9j^FmCaPMqG>-g{%Q=joZoi0~L|yGAWCm-d+*H^XMP z@?3vu<^R-x@aUgv#1aFK8zj)Mh*>qLbOG8~Vse z+uc>Rc*$qOzGct7W=lIN8hrN)A2Fwv&S?}o0oTxjeA%sce?tVUT~jGXnn22u`<5gcow-Xu(x}? zJebV+a3)w^zFu%w^_iw`+HIyU|28X&9yj*8KVfbc>;|bam-b{p&Oy50 z7v{~jc85TSHBD>>i`C$mKHJ!uKRu?Wd-eS3o36oXu<7|_h*zGN4c^MVC~&cDH@Nhd zZtE768qaDxY+O`(ZD_RQiB&Y(0+M2_slJ=b%c4h5yECk06i*>VJc`D7># z2;&}u(fR}2g!+FuG2-g~dq1iE-zm=|eM61)n}26hW3qD`#Si5EQYSB;X(;{wK0)A0 zmf82sxOo(&a^R%gc&(+Ml?~Q<0LOl-U1)JaJ%hTUmr-HNXVh3JKOnnKt7tm1G?jZDJlivgr zmYq+lO{RF@3j2gH25YpSUv`L($3Q(W;QC*a489am$|vlmHv#j-Ua9X9@D3@&4infh z1$+7e*eL~jCKDP$z^GA(HtpBuOM#>%i^VD=qF6-mRW4y*HVXq z*b#mwh8Lcw^os=?wEz2JOD$mO{n%LN@z;+?v=Le&1W{Mm?@y`5hwX_$>o?yc z!a?dgrGu9bN2~}J)cRA2VEt6WKoe!6;vVSD=y_l(D|mm>K6X>B^#DWPs2FwRSgn`C z9!|#W{d5i;Dz*hMSI5nIg7w`(nd<7X`XF9YRCr3Q>K#oG94r~~T3)v7yF6~UjzulV zkmR-@V~;o>4YA)8I9+2+Nu`Zv}mt{t==y`2f|{#exI5U#P> z{>@(8YnU%$t#aVld{GIq&wPoKa*8O+4_smW2eq&buvztZ%|3f6gwm(197I$?YY_|f zQVyoftQu?X1?9X>821`+1aqwz7PGA-DoeF=$KNUV^kpkMw{N|HDVGw*?kedAh260Y z(A2~Y0ktjooC^h}Q|W3BM0Z>1=RiPcFC1oFANdF~W{{n0=g2_lx6Dy?&#uNvb?8%Y z*us5H2bx;R!nCdKw3S|$pWp0BX~m7s{FJZN zv18aaGIxmej!sjt@L>nwKuXc*U$YM3-?Y{32&x(OxCV@#1TKOyG=>_p5}ih#Afp=- zU+!3SGcyN-(OB!D83{_rZFg||FB5&!utNO)YUT*H*8ZYro}v@JF zVrrw|wAuCeK&<}T3{L_0?Z@GbaAFTH)o6du+3`3h%}3l>jrQlkTv(s6h}0#8pc`(| z{{YDaVg^n*kB$2PwT8j|#xl0i;~Q^+_R-uaRY6?)HOB?2y|872?yJ+#+Qx*NMf(?D zeS8&>fNY751*C<8SXG20V^|^BKTG8dHJlUjlU=9ks?g#rtAY!OKNhOUeZ0Que+|W` zX5g=}nDf|k`x(q}9~cei(24wNJiROxC+FDc4u-ult}P(@}uuY#;*!N=Bk zWO2-}KA@(I09@(Pb&mSXFSH&rHPam*scN4+5Gfz}L zt!pnXIEHDId-Z*9GIao{LREJDQ6BuWBh z4!RfSJ5qL%;tDi^VL{GQ?~wdTCBHjPItbX2$V%Q0SC9n#oLoi|nT!I06{%&C4L42_ zoKTo|mQZDtFghRi@rJd2hGa9xvliUT{3+s5+afBVc!|4VUaK${WqC&r(xCy5ceLwr z_DO}eDVp3PduGca%FuSFZQ{T}7AQ@RyBp%}dU5NDCfDPNL|NM1c&a4kJ@FWRaVu-0 z=$^a)R#oMz#1K!tOXYt#v5fuGC1GAX;U#f5S6qt7!VO$Xgd9Aoh>7tSal!0#y4Tu+-LnaP-FixGy9xO#W`;J&0Li0{hx-3-h*4O@cypxa__-y zmwSKLaEa1~r7lh0-);TCd$93c@9(y`y$2gaB=9fm%H74za+zDs^t<{jRhIW4Ca`XB z$WVN*J-W|(gGaniv`2T_>bw55ihcCZA^(i}5}7YqAQ==*38Dw)1X0fzTKOvWlS3=_ z`!lRHU~ffntM&blr!3c-p&N#K$wgrrA!GWH+@}E%^#4TfXk$t9FN-2zj5fSDB=a$Yg$NYOHICR9k`?5DB+--L1|Pd37i(lJtw! zvoaP-x?-vlaT&c zmzIwQ)u1+1rm#bwxP1#QZ5WGfx&jr0VGETVi>BK>A1*uWtMcE(!!kC*AFF?rY_T2R zW1r5X%QPAeI|3u+;pu2yb`!h>%9oRrZoP|y(>-z^g2L z>(_(wFf{`wte?bv$E+VIUt+6RO?!=oR~@$gMZXiNM3Z;NXRUU5l8UJnEx1#T`EF;^ zP1gjlhIvT3zoN!kApLk(kL;QB21Jbl-CaCm>%`)s#_<)=_s}KX87ezuHppaK32wZ$ zv+1VUfqA67NK(>8sOD5X8BHS%0zVnWGaCLbktP%AZz#V4$M`8RjD|xFJq?lig(sVC za_D*8WhbOcs_w%1o}Q?=K05NzKj;8xe&w##9O;n%97uG?qsnK^WOmuNKaWyL+Tcmy z7KmsC%q79M$Ts=J@~`Fn^MV||wUE6#IW#!qCWQ_A#2bRyfh%KHM{laR=RuZ#R0N9D zS36%=532|pa#W)Z(w|}Wg>R0L!(A`Qrdy!C66bVt$5b8=&TeNHA{GmCMB(4Mj*NnR z-le&XPNV&dvn{gl<6zZMyw?HZ|jf~up=6!Bo2Rq8ZCdF9mf z4sN@pU?^Ia+`>l~>_G}#k6JeTw>}a9Ma#ls3h;P|!*j9I~+7}Z%2;900V}eo})!vX* z0b2pjzJWK4V~!B8kS(;Hn+VG}AC^m4LhK!8KUfM9d<&UzvG-%3uX4yx3B@0Y9(i4f zy&p&H9li#*8FC>oz+!22it1Ik8K0>4fA+x(^mdPVbX z0A1u)ahnr~oN{+y1p00rfv%EJdTfkT)=bw&%*xR-07Rc**C@vbFgU{ZjGh#17oz!r zxpjB_8aZLVcoma$CE8hApgjmq@(B_Dg14VZe6e-Y<+9gUcjLsF38pit{WHMB)E-pl z6tq3!U2MlIRq?puJ0c^97d)=DzQgsppi_x1?zEqg@IsMeZS=o|1uEk?M;asz^5)o<%6YXxQVBib&0(w};DG;RAaX%tC!Uk3*b= zFp2?f1)7kk-v!i9-Y_xn^GEqPAwO@(&ujAYs?U<=p$N)XQD!Z0GnyJEw(erknqpz4w8Ssyg%kZ;}B531*atQK^gqiVcBiP=TN(gb4u&1dbjZ$%O6WID63Sdjh3wwhqX~D zM9Y%j`#I;{WD;rXZ+E}1-Pdb7aPqm&Ip?0g&pG$}dCqg3D8glkKWp%CSsapr4&E1B zYwrvaR4A}Bv}|Kxxa&!nhr7H-s|J$^Xyy$6M=TyWs3xtUCuF^a<|lX1wq(Cp-rRlTT3dN@8#0M)kz1aV6{o70@~Oq~zVR}5 zD*bn27KxPjC4qRhi1;7*JgZTmC$K&cx4)RWSmqYstj4@B@Oxw8x?$6 zw(%bA+r`sMw6b6lAD#i@nYW!cpU;X~na@wmXl1w&zv0k!8I|R;Mb*xri2?PZlIGv% zCT)$SC2sirT$u}fLMrZ%BHwLp`NrCO!F@dK$%(4AIz6ZN7r8 z?pAr$O1eYSTja}~dXzDA8QDAPJS=0G%p;8tgbwu^1#p2pGx*btZmzRNH;ms=((RQv zK1L3zQXa0Lqk9DpahDkD1x`l?!QzA-BB7d?MFDe&B!ST3ejNL_EteOxWH^OJW;LAZsrdA0N>)9Ne4VSj zKO|Sp;ap_@sK|R?XN1*_PWLKf#D`yx>#j-}@gY6)XslTvd5OV|rQP|Z1xT*-TBk%? ze;|uI`J;Hj$vthj1ecu;wT+M`(H4&^g|l@83lPpQ;W5cVU2=1yBL@BW!TdA+n|MYZ zSO)R_k!o&rE#)DzA;$412xG)2p(9-IY!8ngWqm_v4GHbNn*ooGBz`ze%|i(OQt*HS|B9M=5tBV04^@ua|z^5(}_3%_QMJuvJA z)g>V|Kj?+5EIHvl%CgL7$z+zPsOA@-mi^fnMDwFFI z)BQydk_Vku1Z zL*0El&xBlMQ+*M`;io7~W_HUCksJ&!~@X6w(hc3O@e8`^q z>cY^gOpBELoWLh-k-j$w=i$yr$&8fS{kxH6Gy;K8G0H|5R9#H57&d$WZOeQ(de$>8 zR7XADVb`oGdwJEvsi&4we!~!x5}Ecxrc8Smh1sQKsE&FQ#JW$UUH1EtXYcYO%zg|x zt0UaL!EjSbRtZ~ZDUC#{D%lE~TOxXoG*?@+=zTZIM5JP{Sd+|yy~#x9081^?$}_wD$08XhbCOL; zu3hH~!&B0;@)CzIu=*ZWZ~|X3byNe*8}ic6lb(GYtJHQx*I^|knG(fI(!VsHpBeoX zlbc?+MP?Xte%fC9IB8bFMm}cGZ+NF?Jz2^gyx~336DnJR*|GGC6fX({g2f%IV{iB* zrWJw0aiNbwho(NVi5tMP7+$Ws(D_q7dl{`Qja}dW{`ae5mv(*!`kM}BcP)Xgmd10z z;uo`LX8e1%}PYd~MzDIyZ?M9dXs@C1Xy-wev{8 z<8+{0Y0;6DdW@I}_f@jN%+7$&`y*LPx!WI7QIUYs0^arl0)wQ1M|&>X^Fhv_B?0bp0qwD0DD&kd##BvBo5;2tyxr$~ZOirKGRi$gm={_-spn zLTs0?4nEB$!D!he81!_|d6@f6o{r8a!xD+(C~JtJ#`e(5QeIUKmbezD9<7Qa^N)s# z{j3M*+$0!vnbNK9KzP0XG3yIBoki8VG=1?N1xg!y|yC^k5= zg&yv3#1?#{rK|Zp+w6vSL-{ANsZU9iuFli_sN=w zwywbORN$?;0?pd%uxhW@Q^T89)t$Dgj&$@^+}BcHvMO%)SnA2jt5g8R+Apuc{Ij7$ zuf9upFYCDUI#RAnQrVh5A=X8kx!H9I z3ZJh{N30Zn#+yqrPp*sC1s_%F?{&(>x|zdMNKw+(Z%JvY)WIPctu(?=+lKruY@2$S zh4A~Ol}rcok5xHdeOKy7(o1d>Z;(ip!chL1S3BU2e!LMl@tKkrx@Q6@%Xl;H9!X(N z=TnkGWw*i2$f;+2+y^?rnsb7IV~V2(7N{!8&_`7DFBYdBq8ufa6y}f3!W0fZs!I{O zT#B;!N*o;As0tCiHbH!TaQhka;L)eWD)T{m=HeQ%LQfd)zIfNOh_FkAyJpY85N%bq z$lj)pQ~jw;AE)_mZ~8dh|Kp~QbCSM1jWC-&c0Qii)LGWVm2FSniAB}m&UJi)=Ts$h z`auvz7PO`Yjk zo0Ddtlbv$G2V?)h-q1%uybTPR6XFD&nzT{UK(doIvK!db>Ew@&An4pp@JxMgARv|r zoqM+o%acI;mx9i{I7te|nbBV_(Z`$7&od+cjTO0yhx*m=#Hojz$FHYklD_;tBW<&E zo_L4nIh{jQ9wjW2K#eCo8Os}0w$4d7b22CB+^6ezNY&8Jo3S&i@;0i{uB!4CEUV%> zM+yw#GIy$Sd*>^%Bs-)t21}K}osl@5PJee(=Uq*xws=xzm67l1O8z$4i|n7e%;CSS zWd=L<`^;FL=e~taUm%d?{OyFdxbrayci7@N&E3P2Hq}5x@)&G?MB;ZwMoZOXtUfs` z>4m`en~$`|eX!w50g~wJhikqij>fZ*>$c>7|AhruN8-hQyjgr7&5`QO-w{MF!7kAe z`Z~KE&D|+$ZrtL$G=0#zLEP8jycEjcJHIL=n=I~)#6igV{cb$YpE5cyEH4}Ie~ep8 z{^13z#dj2hi>{+thlqH5=Ec}fk8(g{ua${fPlaAjYF zV%|E5=jRIOA)4P?A!j{@LpKb2Zr>O*{k?_V)Md#@o4QmxDra)k`ENXijx--EYP-Tg zh`qtUewJ{OHlD*q5PY7s&Y&>QJkQq2^1QJA{g7ai&vhs++ z-rP&s@s`J-QO_p4z(1YSsrw54L0rwHtyck^Z4SHz~Pq3xu~Rq6cr09 z)U*DdL;3qcjXOflt=tKcHDAYs{Z~VQ?V;kc8;-=bQreBDgT?z;eR(`{(<}9N%jEj? zw)aMdj>WaMb&gIr$QiogeGK#CUO6B;1i{AB38z?$#jf})Z>@hx{!}WrxGtU>ma*@^ ziQF@+bI_f~bzMZN#2=Hx)1)+FL)!E7bJE$$vdlFb*lUb2HuM-xF-9OOPc63kCAKg2X+WMPxVw@>NR7(`mwYf}qxEWI~(yZy_XyPf`r zo4d;cH=?CXspjD5jas&Q2dTSekz?gHa{n#O-PwNaMF(s7YUINmNmuXocesVfA~#&c zq1`6orkKlt6J*&j9T8!~0Jtx;hh8R#Hnlg=NDJ06GLNlI4&Nv?w=L()-q|U9+|JR6S@#UZh90&dV#+RYIC)$Tsl8wR z1R640Gg|`zb`CO+`Quu$*)1t4Xn8cYaACMr-s~ppEEvWg8EkZZ9gC*Sw1Dl%;I!OO zW6Gu;QoMOETyo{u*bZC$=G>T;+}J92LHH-bSdEvxiV^I1Z*RMDyy@+Zrnb7x@kg@a zjEo+oE}aXMe=SUra0s=y1Sl$W(GT1|$V+b$XlRb@<~N&v-Lc_q!{}PyeCUph)&$lM zx&n8I=Uh?26`ElS4I4*)Z6q9%bAqfKM&#bvE0kko$dTOGyTsGUTu%ARQLrO1XlAAz zS|cQ`Ig23(6#)A&Ylk*ZGm@S-D172hHh#)VI%|EGgDepDJYGmqF0_qtCXYD+Ix%&NG6=NPFr)>HlN@)Siw<* zhG+OwU-AdS{T`hL;zjyabnV;doP9dZ>HzH84qkO)4VkVIG8$E+D0!WcnfoTYW9hE(`IT zr*VX*|DJZH7UJ3OPc+sJ4gcIwt!orRayqqxT%;NsI@;Vi6wOJrv>%D9YH3~$qIUjD zxVdo@LT89&A?xu<(l=TQI7%=zjk1m7PQQ2PcnFD$ikzsy{-}9MT43;zxU?2u%%)c! zzh1O+>0|Fr8wp9>y*D_cb&7M8ynZmQi#AHUH2p)VN4Pq=!uU&0-Yg3LDo0f+Lzp!! z^J1qqCi~-#40eW!Q$jNmo2I1u)8N)Q4TCSeAr)0swlwoq7Nxj#`1b~FbyzeRXDqT^ z9Mps$Va%icJj|Vhf+Bjq-Xt6ro{KeaMb0sz&HTVWl2PVK zBod`WWp$fP%y00ZWD#;mXU1{u*k(G#y&Tt85MGC3mfPjHOt1aBvfuL3Ll{H zETJvsE{Vj(bM4C$P@F_(N5M%CJPRB7^2pw@oyAJke(*e9o+ z4n?ZXbK3UsQ`&y1wlCC`hf4IQ%7Z7Q+8B4xG$KGVl*~Nd`K^yb^?jN^Ii$fvRD%V&)S*)nP>8-BLXk<_-9d?E-Wa}*=7fBFmg(Bw_!jh$`H z-Iv#;W;&A_Z{K*_KWs}}4o9Is-kih9e>k#T&I$%-DdA?tkSP%c8ol&_lj40 zv){nY)=?c@e3(%Mo5|KDBmJ5jLkzpb8>4{6t}Vle`ufn5Rv$C%n19F&u?+lfOY98J zMo*3mo$mH0Om~WXED8KzQRu@tP1Dl-pO|mOZ;748jYxC044#p@S$tgNNb_Z5Ib9Pc zM^>Q7s!zVf8XxH~msVlMn_=UqqU{!tK4qc_>qx+L&{a=Z~o?hUGE z+x>{>vezjlRU!E3f0L-_|8{OHjs&dUR{hdjYA-ani2tB#9@vmcXrOt0oOkuqS= zbd#KxSQLKdArVz?u|2>YPI9L#to`WnWrr43AREIuN~8%gE-nhcqnIX3RBfAb(8L&Kl4g$7#iF(eaiiTYvEj~|A190{-ow3a*h1) zz^kIAkKOvgS#d`rzpLn2-g|ysQ7Rc3B$sD&aboXtEjd|L)0o#?KwXLR zV%0=}ZZ)m{Br;r+7ZiCh^f{6Bk=qVR7O0C6M1zf=Cy!QbWTFSL~z-??g?y&@m=HPD$ z9|o=+Q;P4N`JlHyTg27M_wVCwg4o711olFw%0n^m9b@Id@0htJHh0EmzJyf5)R@2p z`C|*UMOJe>W)&S>Ih{%5I#IyMlsPu^Ausv!VPtm5_goWrmuz4^8Z`sl^p@l~##JQ; z?Pwj2MT>IjvFigLwAkiw?dG#>BKv|pawyYE+p>LeEtBUUDRj^tc~2>}R3n5@awZ_- zl>_s#_Z&=(tx{^?@To zCqs?haTgQ1Sg&BU;$XtZIEGHfy%Kj(RxrAPsF64q*OTyZ&}WM~82lo#vZ$-bJSg%5 z=k(q)cZ#5y^GL?=mbw^b{(}(j(+)lxF1A^`6e?!G+>$twgk+xdGBn2nE4&XecCb9K zQ56bYAl}CFaTlB2T}E6FDN*U7wX9q zZC${;7xzlSsX?+96vraxW$oAhi(sZ?t}uT2qvgSzVQN%#;?MfT`*d^v-_<96?Dp6{ zqEB30uc}Y{>^NQ<+j2(S!AAtoW0%6ibWE>~@IR(cTtY`YuGg=rn|gpgag~NYs88Gs z<3)nni`k9YiP?_XirI)+hd~GRIdo9}7xjrtWT76(bO+`<#<)Ym?$aS2{oG$C^?ya5 zc-eS~SLqW^=8-bHnm+Lg(n4K`=WX>o@5CI&SUSM3s!v>e6Q1SgkLVLu;YRuU)B42C zuv3V_fffv@%r3F9>gLb-#Q$IE6KCo#lYx@Z zW31ky9>C8QpjHoXA7_*}RU^|eSxZ=Rj+I>&TQ?nlT*fmfcgd2)rlH{(^2TkE6RZjp zwmcdWI)sm#w%owY<7hQ}WfnS^(;wb!&zimIIFh2p$wwGA`!}4UfbfG1Bvz zrcCu;y27PrcLfIZ%&|d z71)sAGd8>{-&Gbc^}45C8RR=2`apkyZ$K!VwL*V<%LZdQW501~@jr4a+fCOoZWE;$ zw-(rL<-kvUd}MLUh8R3$yvc$o1HjM+ZSP;-_D({=hiz{sB(Q;-$beZs$qAb-*58hZ z{)o7Xp_eusl@GTJix{L`7mRB__iG}8Hz|4$Da^j>iUb81FdW3C1P8=qPtR;D0%K0aA0#~xAIHM=y-)VAk!tnZ8 zPB~!LcQEg>95EEt$e%u9s8u7&-MOL~IYp^P{?8ma6xGOftr|In(|eU)Pm94Bmgd-SVejv-{cqV;qzbW4PDdM@>h zX_Hp*OvmM}%l@$p;D*b=%ZH7u((DHceq zB?VPnb(O*GwY^8L(>Z=xQV>pIS|-va`?zOn8nE%H1;hncG9}ospi%~RvY9#0Hj3n-jmsv zO!mUVM)&l*AUm;D6UeCFS>j=JJ;eznP*Q!N_P*-GJ z&stjnItnUcSj6jjb`*1brL6p$tgEBPoFRK$OWl=ztGvsZ=$NZ68_sVg5q%Tdq-R+c zKTeYxrCK=(AW402+14?y9d)(~zb8E#uxF3y;zW^9N1bO*ocR5N!Qv+NhD${I``{xv zv1t(-e;urtu=N_4Cd%@T63f&^j&{hVVMgobhvK*bK<%8%M)y;)+cezf*qp-^*5yZY zZ0SblStgpY+r4QkZ@^v80Zrw>1WHoWx>B0gJcCtMU`RzgtLBke<;{&vhW|Qr9&tBk z0;>w?6?SnLj`wkpw^pP;w&d8VMizt{CrCS26O(@?q9ZwRgCe6V9DN=h>GQBtdtl+d zQ?!yKJ^Nbd<+jcgHjcyb=v!#~&5KHw;I}K-XMOLebB}OEi!JY{bDQkguRfMvdC;CO zr?2+Pp8cT2e}DdbTw7Z=V))1{F+F-m&DuMXUTouDbOZ;S&x`Pb2q`oqT{`okh$S@t zc7?a4nP0tu>K zL(ccu;%B>hylID-i55+`@Mv(8NF43+?FrI z2RGF#ht^Pl^l-9o3WpAoe$*YBaT!SkwA5xIsIV*4#-#QrliK6iB4@HWIO8&`Br*yi z^*(QMdj#tcI=Fe9(PMe$AIM-RurH+I7P*Cay~$wD{3~*XHPnc3Qul_Vv90oj=?Xeq zIhBFZ4+Dvd)vxrep!)KIRoxba+d|7kbuzL5nYlMT0xE ztTlA>(wU4`_^u+W?%YQi&ImPb+*sVjEuW$a{E!l3XgyWaI@H<9F*Fflc>h!+;e($1 zeNtzL9iylAWzmGnnPpPD)SpxyI#Ql+kaeUkQmn)nx|GZqD=COE{6>i}Fuc%W3?G_e z3>SmT)T4+oe8Mpn=^rj4_#k2o`Jc=(#TY(OVhk5i0;I$kKBQb#kAgUhPu~16p>a16 zcZfK&^Bq)B1oM9bQ4va~9|ZBKct6y*9XV@RS-5za($7B- z8O-|x6mo`Nl(Q!+Dsa#z=}X^$v$Ej;nwE%WzrmfIAH&Le*dq+x`234X5{J_c-D6%3 zIycI8Z?{SWb(O)<;a~Zf0WO!Ri03(M`Ji+ zHHJjCN{j#-PaF*VF(MZE7pgeWvTrfU16z^5Y3$&zV9RvYp|%AZ_a;3{&oLzFNA00( z7<*^SbQC+l)1UM%)a(p4T$XOXyeB5qh)~ovxuz-{%d7JU0dD?hgl9s|JuJM<$P<|v z=N>kx{!$n?U@|Z~m-J<&q+Htk4hCxzgo$7M6cfk2skoH#O!xr43@G+Rq-jT}ct@47 zlyDwj%EDcj+0`Fgd!39jk&gL9*a}TV^p!A!sAAdl1NCgOSJEaC_7@g2C1qf-w!k_S z&MX+`lgK*s@kTX~uS@$dTgM*iE!4RAqO%JjpIM=0=*J5EjP@aIB7$honS@iP-tWoZ zBeh@L6?h%l9(t5+X%uMdrdD9U&`VjU|AnQyh^KQpmP$Ow;_E=SV(CX~N5QV!4yOp=d7j4r;Z&ZfRkWwy*C zHfP5j$+o3$UNT7O4&#-o>ldTvgCjZw6>j^jeZz0B&=xXUtKx%=J4xGns2g9-V2^`{ ztX0b51|L* z(7}KmjTe!G_W8U@0HpVA-sPjHn`l6?l!cgO%i}hp5AjWc)snt^jIijpLoc;79wrG- z%c3bqC^%<9qU5}*^ZAy^%=HsKz#{Y#HzP|*6WW<9I1e*P5FPsmGGA89lQ*;e8~T|n zoXTk`IghjHI5!ODAMnTIa!Oa4$0vB~_QmAJ1x|2#VDW*_%Y+vm9V~7Q7I(BHKgil+ z=jayOy`(w;{VRJA7ikNpP^`-$oK8eyG>>$X3)wrMci~Ii`GEBJWUq1O7EWk)#!kOy zoij4DY3kHK{E?XS*_ki=0{@C_>|SVJig@( zJ+qL_`9bpLMa&7<;ZN55ko3;jD=_PuS{+n-vfi#|gp|>GvCZxubfAfXX3F=XL9cVM zE#4oSaP(rE%|B?kVH1m3d16Szeb@5D0P+R4u8d1<2DW%U5<2xyY-kx{UiFX8e9b>H z^L2kh=Bt4b!;KY81QUlFSpY9Okf$W3xaDJBdUWZAk9myorzni&g_i=?DqR4GTODIV zZFp9bsUnh@+28!45e3g|=N#wyjJPWMl07!`FCLHI6E9%fV;6|s;}D49N}ItOj!W7K z7a=P7Poj@B^qS5cNxYp-g=`V?Cz2_DB1ydt|70LCEaBydyi4vj{6=hWy%e}cLPKsy zg&NDquJt)7giQx^JT~MI6GKSW#9w-C%mdO2eY2$au-lFh>lqmjDdfNSqnr^be zP^mlPqRz#mDi7xPoQzeuIH_}SQgVUP>Cj7Ke&+u?MI{Lz1?q(VEHHAzNtN(x zK%ydvCspF#QHi&cMQq6c0jUgtu~dSUdPtk0w_4B%5R`1cJ31~tF6oDKhH@3b#?}TY z?q?(zRpQU6BuJq@qY@$IPC-byKO-?)MIUPaC#ikP`|~8ip_2WHkp)V5k2K3$N>(RZ zm3dXxIH~oesfYYGr?svZx$XObUL)nLTwYA_JT8PgblseMda!clG&*!W`ub;9AX z?4K8~eh^NigqAEJABju~K4U(fk#f0OR$f$DdHpI`dHoM%MP=l(<)ba(B$tm;>}KJy zX`P^5+9v2Q8zqmii$bSf5H>J5|26*@YC@_= zH_+FlfzmXjfl^q~K;f>?sSWSQ?zEpfz=dZ5gA+{= zxiNh5n3iYW?`IMpxUMApYm&;+4>NUr0Xd!X00;hlN0$>ws808o}Oj)turH(LV=8>eW6MK4k?#Dcs z)XZ98PeGN<4CGk?(eu)c!*G!B%Jy-g!l->DBl10=SyA*?RmBvB$ELE(#bl)*yoWUc zoe@8mhJ_O>hehG1K4*p(C=H!V{aIZ81@%R{tP~&9#JKwR`g*MxBB?pQyC?iZvai+B zE((Xv$hrqP@DD2tKMp|}5OnMA^zzjy3|C`Af|g**)c8^P5}}EgUpV&~{Uwr>pp4_8 zBQV9hsn__2wq)6|n-NmHR9J!xT9vIJ{66V}7k))0ARJINH2gP+8KJ0&D!V@QQbG9C zFA?V9GJ4yRknI6@@!yGzRXOugxzKQ_{6(P;O4J+abk`-U@dn&-1&umGxdYED^!ZChb%jks^lH8i2PRV0V^Rwy`FQClNf#LIW58r{nvBq zDGGBvXWDRUJ*VOYYH+<;&sp5(eiQDIe57_l-`Fi|@n&EIhbj<96QqE1@R z+W6i@9hP$nDG9n$wVuNjUqgF?L(jrh7I&=fWuW+%TvV;*T#3|7ib$`EmXdRvh(*BT z@!Jq)d5BmLM&qb4>d769-ft{f5WZJic5~s!m7Yd++B@x%n4X?>d`rfP%E>cSjZ#Z! zAh#BD%DNv{Z6Ro2_sm+bySnsb}obOLr_P+m3H2H1Gi$Tcg)RvLc>|WcnQ)_+z<4;Kmgd;DI$h(#I z@0#Af!2+-L{*>|_KkZb~6OU0B`jvB?U*wsa^-#86HMA!%*1W2R)qxH`Aaf-C_Y5kXlH4okt|R#hXP}f|Ff>)Mu``JO7mg;@NCsk(*fPS`R61}QjU+8 zM5XB=D@_j~Mlc{vmstl@*M#5FcTM;tNt3!Jd}!}A;mF5CxZscr0;sP0&?GHUb2+$K zAXJ5D*DoN`i_jk<5;CX5u`SZDV4X9I!qZ^aC57P(0Fl2XE$(CTVN>^o|Kw%tw8R)+ zX{Oz1>1g#Q%x;>-r*H;ySwk)v=|vL!L=mh$D=ljWb&eE;}yd=C8CqUtf}hsE)ci3nS=rluYZXT!JXm-cHDE>{cqR6o3ju+9qE>__WZ`K+l|A-P0DN1{|^(2L$ z)RQEKOHTK85H}8`qr4b-m?d5Gg|CedJir3@!tf$w6KQ!}k!)1Ga|a)nuZ&W{dj512 zpzHf+5{^yHPYeui@%BV+Mv_HDhlg?{7T0bb4;M>7Xc4B^rIgEJ=a~^XAliU+)+>S}dOvmJ57GtU~k6|`rc47Vj^8)5H<{ivMjExay zGG;tx3Z@9-#r!qqhnRyHnb@4gyob4fF=FD36wK!_4`5bc>M>u%?7ayvgc#-2GP#@<#CV}E6} zY@_I3=fg4f+3&{Ke~6o9XW^R(kCn(X-$8@5eIw-pW&M^=+#_nbF$AY9xK{(W3fvY| z`U0+MM^0+0BWGdJG{?MJzr*dR4Xmng)VOPEy$ue3t)sNIrmouUcRNa5)zxC*^LyQ1 zZ>@Kt;kYBtUWchMd`78JOS!uFH_<3Fs`+OaIkjGAeWky^TU+Y(`LN)(bz!W12WB^B zAEwH18EM8GqX4(ZkW@`Ga*TOAuO_@S;~`^VuYHjr87vHVjQm=UQ50|+CGIk#s3KtG zdMk}WmtWke5OzLgDOdz82`S-knW8JOp&Y2WO0bZ+AX%WiR|ch`G2ic_bvV9W zA38h_q4wDoQI`S2?X$7s=?h24C%*dZ<`Ao-HJ8vQutm9Nwsp79T z{p+{`h?8uH*)>DK9~?WJ|PqJ3Ct>~EJ%3COR&#C&iP#*7_z`yJ!&{Cw(!w270_@47o<@;&$7H)ZOy%<1<(@L*Q< zjGURy+*x_E=R7nwf8P9p1q%y{iWikEUh?qLN0vRhe1&UeX_>oxRYhgh>gpO#ZQU2V zK7U}%+WLmazPPUO@%2VtNvypHQ;pe-*@4-QIfglh>Bb~3MurJ98M7EujcLMc#q7lF z#T>vK!<@l{G2NKNC9(Dim@JI=Ed%}XjM<6Vk2#EK$8=!C&jl0h569ZaVy0k2yF~db%lD0Cpuhd&vN75u+r4^OcWezi8ZdhfZ z+gBU#5(_<6U9Hze&(`1wcwB2-mDR45)v8fMeLsA4u2N-JASL1RNx_u4J(ZM*q2jbs zTI^Zvsa@-_veXxk&XkcWX>-?;6Q41=h6GWxWX!WVs{Bl^q}%UsMV0VuUq6yET;r;) zEOWTLs{%D{k7}$%6iHTcLVaa_fna9nkg5^tr8@8ax9^Z7`6 z{NCDX2}E;&PPZz1VxuIauB1#H)$Ve?LzRY9T5pF$l zh4hLqO0chnb1j|}7O#|Hfs~>O!kB6Cwc>wx#NS}duC8{ka#cH4Hc(7H_ZI?gk7A0_ zQlC*=l$$n%{0iQ6?_8(ky?Ea2ocS}IY7Db@X{=r5wFkhVp#70pyIf;e0m|TKABf0_ z5x*?f&JjPO0vsXsV2ap38f(81tOw;z+GF6&;FRUD_EF#-P>xMs07r}c3i=h$aK+kh z1uDSXz{RDU0S8+_X|o;RW8h`*GMG}v90qiN3yph?bpG9q`p#kWst%)^??x?O7C+xt z58o#T-=XAmcKJ`ns*cM~&+7{lqP4>>uvb|3tVF^BQvGB_2<2=sIkj-n%Fft2|tM|0F$r z#^ZOAstVHO1LZ3zAvs93ON}0*^KON6Z*MrCJ>P!fka4MtvXpP4)P>8;yA|$zz2VBZ z$8FS8Co)=)FSxu_L%CH$Rbrw;lX@y;r0T$*SCxR*3^}@7?_%Cz<^Ss8SMa`zIR8{Q zef1;ZNLg0%rh`<~^0!u{T9={Jg%2C;E}SHFBplIK>+}hVU+*?1_onZ&m+Nvu*JUN8 zGD(%Il$=nKA}e)Qi|?M^`06NGsU3&OLw;zff8krnqtrpAim8t?`a-nQ|DWLt8LO44 zupRvMsB~AVxGR~5=oTwE?2E0hy!!a%vzM3f%G&>AeEs>yDp{-EKb?9hPm8Cl^y{+9 zh-!;D)PE5^tvp;UoU8Re8OB|`^_NX4>Tzxz_{UQuZAVgO#aly(=(-md8TAVfOP$Lc zau{i=puD7akd#SXN#7u`iJc3x5+0F0Rooqnais^;eVz2G)xB?M4w~3omsVNy_0v`v z{ONvFw|U`F$&19Sd)S(*@Qf8t#-AuJnK?*k`HaG68*_P**|fA;X$R7?*6<{yq{~D4 zOnF0Q7cvKteob;Nsgd%KzCqf}8WlocSmG}2^J;wl|DwDdw#AXwz0ncRNSTfB~&Q|;a-oKzrNm6fB#mg z(9)C-`Rc48e5q5bz4v{wXEM9ZXJ$H^+3nT78Nx;Lj9FK8D}uk~!)Jw8akcUxxtCN{ zs_%Jp3=Z{STR6boNjil~y~eGy+hNRAg<8d57a>d|CIdlznZNhh>av&7h(m?8ni!>r z^cWAQI3`lA6M2&GtY1DUDpjG#x2;^2<09;YYxGwm$4KR$gPyH_4(8%(rAm)A$ItP) z8NAEL_in!6^8J?js5UYfz4fhN8OC@|pt|}_5O?9tYWT|fvB^AGwz=&_++bsHtlj2x zItR(`o^-XIWsG-BDOfxt-ncJ4y`*3WgG7f6X^r?56)X5LIIXMa7mp8Ph!GzT#Pd%` zBe&X@UCjtw{PUdab-M*;x&4b=)vSH-TxdPd_Eh>Snb|z%&hhfZjIoe8CQ~kFy`l5z zT*E-!SP*DZtQC8@8m9Cz}GM0;Bz1#Gwo$6|9tBWdY)LK=q z|0v56SEWC<);qv+4wKiFgy}PKs%w4j0j`oaot{1i2}kVv#bH_w2t(QCRtJ0)1$qKq zLhju&0_EjyFEb>{jY6ASxsu6hLrI0(V+aJ}AtbfY(dWm;uy!=LO95INave zu9C9sb(`(cb7uUv}Amw)QWwaPuaOwv$PS-Lu>HsJB!J6ZXWMiQ0x84YA99svh2jp8JQ`pG^QLLlnLW@7Ji3(u;N;PU0D=dVOPZ;N{Vi>T+X zMm_&!)HC-H^@jQ5sOLoDAS_w&S62}M|EGTrdd~j;#?$ZVfBo&RPUX=P{;_`>jZgpU z?|*~Q_b$50FP3$L&+^ZD-|>IC?seurU9VRCj~~DppY|y>{|y`vv!VB2 z%xC;rH7NL{n7)6pF`w<9_5RiK^#8{;{*Us%70(~W&zND;o89Q||Fh+`&zIfkd)7}e zF~SE;8@|-Manln|ZVqkfA@`D-~86McR&4| z@9uf#d*9#tgCG8A-{1ekKkonWPo6#S)93!_`G0=l#n!fihYtVCk)y|szx1;cKR@|$ z`>9u6J^in*y?*8wZ@hW-mv8;53zX5{9xxT$2TlMFfN5YWI0-xk-V3&a_km|X*%#;lr-ETnW`tefgJ3t91sWS- z?NUGSU=C;pXM!nUF6aPff#bp1U^+MloB}=sW`Xm-Ja9f(02Y9Y!A0N-P~;6Nz=y#) zPzKiZ;CiqLl&iZpg0bK>Fb>=a+CY(Q7zFNt9t`dWhk&hMJa_^e3MMXsAHXxviQqYK zIM@YV16~G`!1yo04`4EQEhusn*MTBOF#>d8pA1d_uLq}qBf*(q3RnQ%2tESd1Xh4I zgMM%n*aUtK+zQ?T?f^%FyFmxI54;t89=r`a295zwgJZ!Ca2$9ZydCTY?*MJh@B?TE zKM#%qQ^E1z1aLB#2F?X1fs4Vr!7^|%SO?w%t^@A{H-qJa7(J1U>|=0OeN1YH%J{ z56%ZSf(76w~Bo_{2=z=Zm|dViTz~S zr`UtX#2!2?_ERV?p~3S)Pp7ahEQAm1#&SOAz!FKQ! z@GSTY7zTd|UH}h+#+F$7Ss)RVZvYAg?I*yo;EP~7cnp+pj(n4*L;np}1g-|_v6pXL zHFT-aq*uQ6_0SZ7u@P(pw}H=s^39hqz#eEPxC7b-?uV9dO)K~$C}RK_6P$pi2-R3X z#s+7gzXhHH{{rj+<=b=_{6`Q4+V<~*@{N&iTQYPAlrh8*a4fWZ!wx{lgXz%U2B(8R z2lK$aU=es6TmiBsVpN0Af%V|OfE&U6;5P6za3|Of?g1YH_k*oqEBLA)@eKt}K%WB7 zfWHLKfvwNRm<*l<9pG+o0{8=P3ivB;|6(Z7t}12kl@!I12m;I39c+lre*hRVG7k7JKOXz$|DP zGn^sZL~t&&j6Gy*BV(Y&(0*_VG+mET2K^(j4wSKnj0uN>>!9a@GL{+-ZicP`>!3%2 z+o4@x82{IRyP#>ZY7ChK?uC8|JOC~LyYVLt^f2^7@C@Okf$h*N#Kpn?0ffQ*qI1TSD81Z`iAwHJa0_ICqz=mu~H{>Oo%pjUz0pvQvaq07O^;Fm!e z6Q+V$&^6#(uo;xG+5LjhPk?#QnP3_8MzD+b(!o0DzXjKUYr)N60Nf51gYo#g4%`L( zSKwZ-2s{9O4YcDv0z3@e0y>E2Ua%edaWDn zcfgt8*TDkbyBT~0`mezXa2Xg+J~BW*^kblmp|ijy=q+G6^b~L#bQ3rQdMdaRdIPwa za7TfApdSVIgC1}N_MZb=p_hXxymt?H0(u=Na}@`826`n}f&W{;bI>b5JN_qwUC@6A z#{WgE{fpop{M`XMpew-%U@bTWj05w)cfiHqHn0r*CRhjl1GoL0%g@7ZmPSp>p1J&FFJFGLU#C%rC$cZ{^O^HwpYa8g7Ote8Nr6V~ zPxhqcS4ocKCsIE0^O^Cu&3LNW>y)4D{K~J~OsB}K$ghGuZuz;8%#fd(ojCc`nCWow zhWu8W@5zq5{A9meej=YPztyJy)n<4;_8a9FFvAsD2KkBfl>9_qN`4~EqEV+`_A2F9 z(_0?ey~ea(W#&)Hc{Tog#3v;oG7LJWnkUkz_iXHiFVc(|?AU7FNHd&@BZMDB9{yqV zuE@#HL?T|oajR!1&$4Hk#+wUy7Jf)WqItG@_Nr&G7rsctcCLC3@SKOlujUW27w!|e z0C_IrS@(Ea3~Er12zvWbas>C4Au*iA($l&q#hH z{lYhCQ6ge5c@h3eBL#WtS>7#D?+PDDyz;K_lB9Dc&$3Pw#y$F9xypng}aXB|3JR^KA&%#&2>+&q&3%^Ub4a|%1zg2fDRr+6d!c&%UU4rQJyS<=s-1=2_IFv_Gjw-4=9Pvfh^bNSl&c zmRwtHOG1&_HQ+Fv%NeQ^g^#6-bh+24GM%T&Ncv_8b%6>)@{ptWPvkVDJ|rE|-%7~x zt(Lx4_)N-Cw;AnUw;65kQSVx9M#{9ntTUbB0&JprNVfsqZln1uN9D1am?XcFHr-Bi zea}$k6XL`( z_;mVo9;~TnB` zy)L(WRRg-*t{$$mBF!yUxJ9aNb-0>mb+{t=BfOw_P}11H4nzvg;u0$?krlGiILCYz zeqN-~>r-Dx>#JeCv&77cu9LntkYmQLTdb~a>mA(^b(&|Wda%ku+KT4CIqH4wr^w_v zNlUh>2kmFB+2$nfht-)c9ggN??dKuWUi=i8?N!3bp9J6$Dj$hAjna|)%2+v#zpK@=#3k=rV|3m8s(!$XnI^FGHh1caq&g5o>!`LXg=1XdFxryq@Q*A^mC<(TR&H+I?&IasBr2O zA830$64lQl9cqQCc}Uwors`hvrPPr4(dAg%`z(@>mc7U!_C5FcFN?C*XXJD^y4>~i zDpjWXxkA;Mey(9`V}&WQrPi|^L2ExEOW$YT7jK>73GGL|fR>*?l)Xr>ioJY8<%EDd z%lJdyl73t2Ud|rKvy7AUj7X24^ejO4!FuMQpLKm%&(ikvv;4K5t5scV`xY)0k1igCD%x1=0asq)d|ztxJb^f*kX#~MFrO5Tw%=4zE^Jx*M$`Wu;pNh_2% z^mtj%&h(f`^Q#``>e-hb-|0~GS3%E$WNsvRkoK*|E7Ibv=NeVVdORzCt$BvXfLikp zU1xe+rDv*oTxI!@GSclqk56@6dXA!JvU-jpa-Y_GMbB)l@rj&8k)K6t?(d^D=UVd{ zJsZ~Z8~H2!yXHU1mmdFU{?pGoo%&h+iXR!9>)ErOqli?n*z51Mexr}pZ)sY_I??Vz zN4v|HP{*$QOX>8{GT#yjS#h)YQlzJ43~h}s`|P9pVC~-rpIyzrw(sv>=2%ua$g`Dq znSY3+t)xMZ-SwA7&#x_B5eezOXPFP`RRukt()BI!*eU$5DP^R&(3D4>$+$*FHk^m%cqfvYGinj$MOHH#Io~zzl1fim z?OLJdx_qWxL2X@t&H+1-5uLxX3X$L_DNb3Z#LbeNRRJLWD^kOZqUNjdXfflMvG^O@ z)bvEth9(xy;+|-F;!91*g9ah#ylK;>L9F4WHx)E(MrwKd9a9QQnv5YL>|9W=nb#cS zn>IJ`ma(E@MMXtLeEg95y1KP>b^YX=IkV4keNO6gNT0L$9LblH{G8Kvc{ozfNqP>^ za|WLy^qijO;5=vMIV#U7c{zN~uZW56M0loNah5!n(wg*o(?r$(>benoJ^JArlA6x7 zc&Hd2Q#dbsp5W|xvYsF)>vngIS)l9-sspPyS6NnB=DEYq0Y*P+5&W*@oUld2cba3I zZ`wHD_&W*DgEtr(q1kHXwVdK~xaumE&IHpV;eM9zmKW6e`~;f6&{?>=u(-gvFvmI5 zsSZ`@!>c4ny!0Lr_L<>ZFA~qTuf^Jp?W~1^9n<6N?Nj6Ir!nd1o~gJ!&W;yD)-zi( z4SV-D@yk#4LmUqncH6f!EtWzjoAgj<7NzZDO*+A((+9X`nY4r_{tE`UmqpRLh~ID0 z$!2^TqulH6H|)Cx(EFljNnh&#x;=`P{GBst$!|L8>5ii1{rGR|{EEBKqXy99O=EoAH+(((TmA~;(?pd_Y$x*a~H*)}8VA2jV zJ&z1Ed7h7Qm-4u5(pG&WKBLP^_Q|C@N13$6FB44K ziht$+dhr0d+N7=aUO&Knqe)BnlE3XHZMCO81KgiCX-S{>KVi~VdO8O9zYygv`8B@R z#}85-iBYuFw93XmMW`MGHS|j(T6>-yTJa|J_lv z#J4Ys&XV>KMT`G4CN2HH}@r$o_`-kDLfxEBqeS47d$Kh&GFq*v-^Ym~dZzblGvC;j`QXerObCT;P@8IzX! zko=yH@-OMTY|_?vAbxLO{w2OqQFJ=*kB_3oeX>bg{5>Gt}tnna4G~hD`AcXgRh(V`d0Bo#fY zx^^Y!oLRAO8)lf%R$}M&_p@PsUR}vq-<(>HhqVym(KI7Py#8FTI?-F;^49p~x!2BhuW^$!L(w`q%SzUBR27?=ywo{m9cB*t z25W07AJgkQg>~fLMK$ylh0$vlRUEx`X8Jh4yxb|OA0__$<@u;86jb~K=CbNhPqxM71x!KbF*2Jt1d>xDC)d4FrSj~QiZQcB8F1FxCxN?_ zJMZQZ+YHV(!&z2*vpqh)3*}U0R>b0jZY~(ZC((Pm{AZMVm#3l#hL z9yx99l%wRTe$AvAQXz#E0YB?=(#(v)3Rxr)enXP86!3-t{1ODk2+bG1%F^{gt? z@=qne;M%{^jG&**>daZ>@>+cY!5TtS7F3p6HnwPs^%PCL^>deYp+lDT?DqQ23`lrR zwU(QUZahN7j8`S-y>Ir(kN3+}>x0gira35zb6EJj(Z;GPA}`l!d$} z-H8mQdc!E0KM&O-Dy@{8a3Lwu?iCHb%2Hon0!eehKsyOX+evPFn|5!SmG&FTLJ}<6 zXe^qra$SD;+Ni!=p0njSr@~#jI%?c9(_QU%iDwy(;;!gokI%AEGy@rPj3W86^vb9a z9Gd=$~s+URv7XjGz0Ay$BYK6DG!XR*M;QF^413G@?Aa|HmUwyeFi@@lri~H z>!aZ{c)AuvuEn03+Oo=W(a73c4^rW@QnE7eb7Cy2MO*1|$(b5N&sC!$)YeGc+Kr&E z;?^5B{YwRvTxhBR#lH8s0EIJ!Zg@hg2bJ_lyHaBpp0h>SYJCX<6)C;BZuQNX?aOh| zG}#-JQHSCcrR#?A4ue6uomF^T49IaYypzd<@UF88{96^7{k6}QqFHOw_i>64@bUS;;*jBLv*sl7T^fEgZpVnb^Dd>VulUsyIx6)lX$$;D=J_O?F(J59tNznt2|O4YTHy4$;;S8 zwkz>(W?S1i?vSkDaEGIuZ;Yc(H5{O;;j7?i0=-^zPVgp0WO-NE_l`J~p$5O#uTrrb?Kw?r zU9MAG$391?)-Q!RUnv;c8h)ipqF-^C@5p4Mwi-qI;_fx)J(S+c1`0%WqNUvAeW}Xm z0Ic_w{U3T!ziYBb-`l)P!Y1j8c8DTmk9+N;GPkJw$6C$UPz2pCe#JU{L6CkQtx1$1 z!&0hj%-rhQ)b~=~XU%gJL)ZoN97mY zX397ZMc&HBH}Axl-v5ziM^yuGyXRy_P0Qz(oi{#uARoa*I7g6}7JH zNoGOz?=P&r@t$dSWk}iFoqkuwr1X0xWuznLG4bxZ>N2Jn`E)+?1jaa@V-1FW$T5DL z?@ptHRUpSqmzqP;2vxsT;rG`~n>1V|-0bTHT$h zJ__U`B^@8()3?qEpb*{hP~{qyMLZstAuU{9Hp4cq$GYcI>ZdZ+Ce9oN?@_etPqp;9v(0$fPMXS_U8O5!# zTuMrJ&XP|3Ns%P0=v28$7&*0d4J-mw_#NX*CFJzG((t3QE@|VrlIxWDGCO>=<^Hww z!{u_D25J z3RA6gJNWFD2dXDXner}0;wYJ2lsCV)$dNs7iK8TY;lk{BMN2YO|0n$l>wY>kQM}Hm z%|Y3Uo<_Kn_bH`(M1}HrCws>1xwDIwNCt9e7tM1P7CLh0FLY!(3bGd#&CV&Fo4wFc zP`t2UexY-sdbf~blJfe)MJz3rD)P!L0e<=kpUU$Rs+EqAz#$@K)fpEp}irZjL`_5{aTQRyhR&R7*{zI&Bwo#0@-?*D7=ZQ#2a z|Nrr`8zhUB)DYg$G_~ry-{<~*wN*>2rmY*@*w(h%w6@tztwbv!Bq4+(NhKkKKBST) zgdy}Hgb;-x3Z?(^b)9qGd%xEWKHvZU@&A2)kI%baJ2%(;b-k|F^?E&D*Ey$qYCzJ! z`Sf!70My08;?zJ+E#)ByJasnusuuv(it^OJfSv(96buHt1qEIS1cv1Fbi?~Wlou5- z(>FB$#wx&@`-=^ zADA7`X2${44XYk1$?DG7J+_9%IoB(h*fRE4Mb3e!D0)0%3(u+fX%`AVyyS5GzJku;B2B5Rb6A>d$DeLT-ARUI_Kd1|QS1Q2}`|jto>v zTT}so)l>ysQj|#$DB)0luDZ%m^YQ^8o(&Rtk0}72A~@3YKSF{j2Av+w zoliySy8~ zi&^pEC1POeyXwH00>-|?wkVMLE)^qGSXNtv4x(YAdg144qD|-B(cO_@c@rkMw>US> zgb8_+r0E__r-;%qm<->>L~d4~o8I(B-1hPdU-v-4zWhN{(^Zsd;E~T*sHLzfu;SWL zV}`{ltO$<`pJAl&;65_(`rTy(o2}khv)pwvvY(-|7uN+Y2=_Bd1I(QAZUw-@$JIhf zB^`5YX&rqwj2H~MGQKT?6Sre&z*D_RjrlvY_+aq~q~;}h z;m69>#n6g;gEP9aeF!@VhaEEujJIpKG;gbWAHw$-b@RfB@v-z)Ogggu;Fw8JVd*nM zevIU5ue@V-GG2@gqml7gFqxsmR+L8`))FjVMTEK2a^$5nU<|_CtQg0+>bWZsO1*D9AzQGf3n2lcW9#kY;%aVe zK^eol%7I$J1mtQXaVihNsDbwyDT@evf~t==1mKe%z&;Y?#iG@M<3+qiw2t+Ja480jxRnBuMPI~%40J2bQL4Y420$0JCOUqt_Z2O#CrGxksvQ~6 zZwXLIuXq+Qz_Rtyq`S3sGxJn5T4K>82KHg?pkcuC4;)8-uwEp03-Q$_Cl|5yH(gh= zYhbK!Wx>1EGrJ#qBmx7=U>$n5exTC#A?5nt5sQlN>vQNcCTk3a4PX~Zagmh_H4~q6 z#E~%La2cV$QAl+BzgY;z7U{4H16rG3YhZksV$m%^3_sX!)KSv??Lw<3xk^KccdVXN zRPCt|#BPv9SpC3j_;@Ehh|=_E2zm#jJT?G3aa?hLuS@3DvbyeA4}C6xIY-}TLmG@f z78)-Drp3bsf|d^?k`l8Obz(swRE@3vx^mJ z1(GXM5e=qf#2xS&>Cw>DfY%cw3{?=!Kx+x6RQ0%0VhBh*Jc9%N$D)`@Sf+PQbxy8! zRV7dF?nW+8>H!9K=>h+Z{gd4pQB+Y}P0#(XkI%98BRy5Y*V~(?4=;U8O8DxWn;T2- zkC_MXaAPWJ*!^SFC!8NcMw#}9=>n~h<~}7XB%NwJo?5KVD-~23a1ne0m2N3WOis3L zIc^lLa7u9%f@v*}xUXZXyOwTXgd5J>M~t8S0x{bes#FN)tjh;fe+u;>T?`VS>mFXS zdbq;Q4@8-Ld`U^zP&v$E*!vj8>e@@0sT zA5R`qI@tOiuXKyd0=bah7WQ<6^DzQZ+!bz+0i%Tqj4pwAGqQ|}@Qql%JcyQvT#uIe z=;a?RCU}MkD?QK`phchZ%9^U`+=>hsE;M*~Ma5(AiCb>ufZn-1M-zykb3T$l>!5cZ z56KN;c93@stZHDtfqiv9+||0n@mbrFX(bqAqm}H8e7&y30X~3lNpxrB!|u=Xgd)mC zRmup)aD7(jFV0mcs`F@wso$INofqsfUNLsQ_3DDf2D7&i z`)1%EA=So}Ak{|mGMNGyMhqDrc=$SG0(3-d6r@t%7^-nu9Lp-eSnFF2g&!jl^Wi%u*h*NUgCxTr^O`Wj^qU+HQRPhqgcfJ%uCd6<^8 zJ%H-Ok_V zvU`MlIc_r6=MhuG^V>4Ea%J@~`kZ25KC{W_wTX2%EdlK7p#FH!5FMlcBY1=vYfKCt zg-4pl^92EM5Y;0*;lV@Lhe37|-3lWkVUW!8e^7sRCT{Q=!D5rdpt=$mh9AqolVuoV z9kbqh_;(yM>%vJ`)EE!3uqbCZwZi4g=yXv{L}E8ib2)vKG=wq}?pRd}zc#)YPUj>E z{O+Q)Frt1;n`oA8%0;xm`U%*w=N5kyeHVR7HYL6!?3#IgQ7DB#9&CqzfW}6dh&K8I zM2ipgE2NoU9O*LDpRA7kNHrNtU&-}_ulMY=r} zNfDxJs<&%ox~}v{=m}+Z{QEy<1A0(gzk#{E2M_ECuLePLXdnHsF3}JB|41@W9}^Zt zlP?bnd>)#YH`e>~aCIJm@^HJru%UH>K6^%3k~em2V_75vb)*uycOO+O(ea9E;a6lhx?6T?bo|Kj2cu-aQ{3g0*u{(CwI6%iTyN~L zs%f|`S*noVSn6AF8}S6I+pvPFax}ppqrs2Epk6i#i0QcT{Ql^6tg^iP!hPbmu+SIU z1f(9lud~^L>`sLef}4vc6<4vSsmyCz+XPm*Xso+;fYtv$=mTndnD;6na$uGaMMBMp~1O(lsvYk*sz_U zM^+bFu22Zq=a_TBN8&gxD{|uv>ovEVnAc?zKJMp=P^MwBXJO!7A!dxMTX<9o*p6W1 z2p|)EGzd>$fTi7mj3~!jl&Ile;-6Pr-OUtPieCjc9(&j( zGT7BySRN4otGm~SN&AQn(OHj%%Z$=r{wjr6&oJ+^g)zD@MqoVr=x7~ejLR={TI)mg zbm2A+okbTu5{`x5+gKakQ0L19GDy=)um?Hf24zUXgbg>2SOhqFgos$2+6ES4vWDg@ zT}OByIhb5sXzxom_pb;Qp&R~qHzxY`-B5`_CARhlMkaSD8vW1HHH|dp17Iz8QyAJ5 z-ar_=PmHiv(}R6&)ZOgfy$Ab`3)6v*aAdMT^#BM4n~UZc<{@n}0>)B|Re&nnR3_HK zlcCpDPht;r;I9xuc*|DEE4iAoXFtX}xmBd`gN3n7Rgu>fZeo{nMkb>`2A{YtK-a(z z3q@KPJ>K|Rd6c_$0ux{VX*vS`{*$!6*PLwD9==Mz!J~_7`pa>70|wAJ{!$zlb8}HR zgq6xb<8UmPP$Y}paV@&nrILHBQ{_AgpnP!N%{yoPI}p~1Km8+Sqya~cE3v&96XE-# ze2$-%Or8k^Rd`sF&2%;)QrwA5&O<+av-Ob)0RtAkXW76Z%l7`Vvckf&kiP8d%QB|r zM5rsCTno!RS19|j-Q~rNlXb+xLGqMsYIFJ5YojMaSzRLYF`6tera(2T38`awY-9D` z&xct`O$k#j@-!TFs~;71O{Ed3C{Eo1^+)V!>kEU8cGScU3F_J(?-RITdWnusc z%Og8NU-5kA&~H7p#kXys0aA`I&;u#{NjV-qVVW?!c-Rosq)KBHh<|8nh_5O{@JwWR zFqu4$1DQt*Rl?2*dQzqa`#oX2xqEpL?Z}E47)%rl?*-cjd}M{2wx$G9yovG8tIP(B z^%Le9w4#U^M#zMVnPQU(oCwhJn)<-6FYOD3TfyrN+6x%fRguvEhq28o6WDG^SdGZm z-%stw!#FfG%bf=i{i$O~40}TTB&<8D@K9|16xIQNfEYSK-3@E4^6|$9_^*guB;A~Ws&ma*mHtGa>y4u zt6j_hSRlukJiB*YP177{8n1|c!4zN{GLFaBv;miG6r+xcXn@NyXcG+xBrW6hWOs{2 z6o+HEiky>23NAh1HP3}Z0HKh{j5K)hTV9Rt%cKVUC;7n4h{}icO;4uM{$+k)(cC1! z+?1XK`>Xn}XS`jfPeidSG1HgA=?TD%#&jZ>$7^@Lzrb|D3{HxkYuu4A15hzA+Rw^f za2JJtgxp(E_qbK@6Gg*F#jJXkMd~k#B177^b>Ewq50%hC@hJT zRYt(=!!Yv~l^strVf{VCw>To$md#>lTGbF6o_@k6K?W<)EyJB4N7kV^${LZ-S02K1 z2g7)@44Th9x7en+7w*p^`PDNJ2v@=L6|f$?j`SKw(kW~-M#+#Sb~>^jJXN%Ld^e-W z{tpz41$f)US*R!tIqlAh;4|vcCRLVg-GWW$V)E`ru81lS?gK3S2n#5Z#g3nrfNI(v z6@G*YPFDApw@mqE`w!O~r*yZnk$diFEa*27=oCyzYNlr#qetDxZK%_u@@%R*yl!mc zfnO8YdTu|s57Nd28Ig@k zb#~1%_)xuPeMnvQ<2G48gqyL~N_gpuIQNkh*QWN@IG4}dD^mO@e>j`4Hy-;ns>)!0 zySqBwXH1Zm^h?)_Asn7|1%>flvg4Dh=^u`;R(#wykb;?m6_MJ6{%)R(NkI2zw`Q+L zg^fjbDBq*x7pO!SG7ab1EIDO7u=lVd>ll@nyIOm7YaX4|&Ar(yb2K)(PHsLCbvkM? z%Fy#mg!_l}TU4D~NZhMa^XRNj?#;idlbcUOosOD}^-~4>ArTM^-6I~wfgR~VDh3MR zh+T2?dIfeQIEFZwuIX5e^`Cg0u3cWo9*ZFZIUf|s?l~lf!aVW84H?*<*+2d+I2VP- zxDCn5qIk5;jE;B+EXqZh^c-IZ$6xFhA&PUw$W2BdqO{B^oZ6SMEkhjOdOBZ!7@&XS9Q5t$c zvxZ(>;KiR%fI@MT-OKi#<&B8vy7sA~yvgdW0=_Q7dXV*_KbO&$-KaAGxzQ7#t`-Pn z(Su6vE^ZVC5cTCYNtWnduuTv>&hxn**dWsG%jWbb;WI&i~3a=+!B z?;T5UJPBzlz3V#fSdU{1+@I|oDS!HfRgiI2cq}&Jfn2Y57}8Ek98G>K5RrIEI4#T~ zcw|^OV0T(ukP$r_%y!O4r5W7xtgzP%uONVg{(yMRZH{Xa49KN;6Nfq<=dNVNMKdgu z#YL6<%o$KwFcA}#n1_5{Y_l=BkX)=UqF#O)5>q7e{A;}X##3l%Ln=Ml?1BWor?%K_ zE&%$fLM)VlqUstPkVm+mj_6~`gIreRmZa;g1WV5pqlGFOw4xhwk3wvFP<0cNZ>uR-fWD!=M?~%>JMQk|8~tjZbtq z`j`s)t3isWBa6@05e9n0BkMxoY~1O}#lrm>xZ_A=P+jR4?j!OORW&spdox*2(uf@C zJ4LAHIIX6aRpH0>a^lE*(GmH$dp{8!m2@kEN&$PPKa?(9#{jTzT+o5;gWs4tKAax+ z$k{tGxtb7i=J#dio|Bqxv1{4^=S4`tv!>8*s|zMyggcaLM0=T?&5A%I>~nTo>u+%& zZ#qqJHkUm{V3q~ByWIrj$3*VTD_l`d=4D|~4c;I%o>`ic*vrle@TMMztE#A&KwG;g zz~5p@=df+FnFz~<=TFD{@-SOgwa7xYe5TDQfSXbmyH6vqp~WKtz94iVH zuU?qg!&6xB#e+aVWRGvB27-bfVHzI!!}c(8%9m2o>(|)Fq8#A zxBkuUl|}R!BsRx(<46?w+nE=`ttyG(0y`=9BY%G$K75$&Zt;%(^{zAN3-TQ2UvFy` zUUByE!{u|M!yB5VKX~Es!%aRqym|RmVs!Y{i2R>G*oV!+o2MTtMW=6GzZy9@ym|Vk z_2}?T5#>|A^>?Dfw>Jy_s$XwQym`FP$msH>HtUb`ilW1hsBdv}c;t9fKfN^G4X5*)aqic> zc|4)|`1v%}M29z@7dK67D(8i(o62e4-p{W(em=iUj}DJapK@nRVk(H*;CMmPN~?|x0Q@Rq+FJO7*0V-p_+Q9bDQ;VDyw(ed}+VmXqMCwR04*E>Ls zpjC76&SXg1O3+RaUAOx^mb(BH1f2-V0L5^z?0YZqoVR!}cXgAK#eD)Ga%*4|q#mNH zW?(#**DQIOiWLcE`M;|V;XJ$P+P}|^2V=Rmpbnt!ARCkg$_G_~W`J%3Edi|tZ2-Lw z+6CGNIuUud1Eqj$P!?zus2nsKG#|7CvpiEFcs19@;XaVRk z&?e9)puM0!L2VDmau~4Kx%q z7E}+q2ebyX1+)W1zcXSnpaUw3YRif<+2a>IIqu2$oHBw#dQ%v5t-_w}lULXQ5|;(n zy!(=g$%r{7hF+}VU2_Lw5Z`@&Z%xTSsCkI-W4x!cdH(j%F@4z6m;>C$wh&`qY`^MW z1$Yf^Q8B%ck_*N30npf|w5poD`3*5*sUGw-D+Y*T4=0O}PJ0cw)0^tw2iTEU>MZX) zuym^@H!P0cV~96B4jM~0xcB4n!n>$D``tPW#x^)shXd|)4l~SfrzdwqM2^Ufc2lBe zgRuu5wQzfm`^Il;PvFXh9QT8N?dhw~o>+IakDES2T22@t})+Y?ZqfqI1k!o(m0DO9?v=_ba@*e7WJOV*5M|w8Lt&F(F;F2X3 zM{i-oa|?Ld3hxuHhONQH;~ot!h5~QzEXL#GRmFbTw?Gx?(LetMjj!RUhsf)9se}x? z-$cLvw9 zioI~NXJu)1&w)ApxN&jeHs@CO9l=ee)OaB^Y$$qvU(aglDLUicVZAuG*zL#b++Ja- zdKTP)J-L_J9oMOlTS9wk=-rbo(Jw>k8A!&H1>=gj5{lQ8dRC#b2K635=T$6qHrY;G zbv)jA7{Q|#Q#`MEG^()BSS@RcJZ9m3rqrya^n&cS(Z7VUHSefGHx+{vsi0w8QvBeW zvLWTzm{r8JrBHYFQclGE=(k%Ucop%R;Gx&?xeqocbS!;XZrK*@&u))Bc8zRQW z=aUWbx$GHLz)Jot?&bL0vTAR}y+Y^c5{w?8lr40Hs<>C1>55IRZHz0}DCE2kvk=aUJf+2v@nYvI$|7{j8rZ&=2kSt<+x>WOdw|C z83&Swc-tjwHM;M`h#Gl~1XF%UcYBvlEUl_2r>8nx(Nv9^7BCrnw4hR#cL-dfm#`x) zdu|>(iSfE?x{EvA;`c+@RW; z%Gw$xTf({I5C`-wFY*K~H=k-k{V@V?JF&6%o;>hXME|f}^Sg`NOD(3Wi1@uG`?Kff zxa{KM@x<^&*`=62f3Vmv_6hUw=D|?67U4b{>b-s!g8RQeuLr6U@g0wd->SCwPF;I0 z@oUhCBz%La9hdk9j%jCdiBEwx;`+j~xWv0b31{P*Plz`S$DcsO9qv|rScoS$3sQ)>j0GId(=#-8);(9!euYTTR8Sg;S!$)U2#!#dlq!TcR0E>-D|{oY$})72J|P+ zzXt_yej4ZxobLghgYyK?0i5p!orUw0LBHVqOVE~XP5D8sXZS=!7qZiqF)^(YVq#8h z1?m_Z)8_oRnA0zai)ou27jwo%aWU;uV`5IzVq;qCv2lq8jwa$*v2m^K*qGCM;<^{E z({Y{=8`HLTY|I&bkfv{3O#95(xVHUbW7=ID7k5T~TxZ3_wHpu@lQb|k?u>ktH5TQL z!?6VU*CFj>iIV6`3~y&K8_#Y zxE*Ehh>JV@GTkj~Psu4l*Pi2ve)A3hjxgOB(-{ZIE+nsyAO2h9S_11$h82dxIJ0j&jX0qp?!I>T<9 zH-Zj;xLni;ln6=!1wcF~4U`Qk0@Z&`i*L&`Qv1&{|Lf=m02TDEhDibfP0h=ExhBXS+I-AM!uB zrt+GXS#n-e{z;d|CN3&R+bYpN&C2!5rz6#!<_Y;%I+VpGcJ%^@kLpR${11Q4>y}y! z-T_g*ewKb5|M*YuA1mFl@;O#~|Gt0p)Bpc@Z1+t};@=^^jx_eP_pu1ax#C~bH1D?t z@#i7_v54{{UOEfB;g?0n+WFW|1p43pi}{ORY_ngS_iNtnzzMgX8F`Q96WKWRFyx4@ z8h>>8K0Al@QT*q>?2P|e`W7AI5;H+G56?w4Xzvx-pp!s%f>wjx1^omfq1FR508|F@ z(-;UNEf8=mcNges&^FM|pw@`Tg9d^ocxiB({V2VE?j9Sbk-;8w@bF=>pULh_10BX1 zS&!p%#3x&x?9Tvb8t91MqS&e+KdI)C81t#6*a@!f%GfyRYTS9V?g=*#z&rZtQ{l>Fsca|WHc=bE%D z?)>16^ixl``J%@crv0{lQO0-E+uSmJ#=p|mo9``s>u|sG>NdWcR~HE{?fcyA z%X_Z9cKnde+RghbcTVlK_TxF9{C3|Td#+w_N%{j{P5ff(PZ#x=IsL+nl*INc4m_6l z#mk$1&)BnU+t2&=e0K4aJKpMDy!Dk^PhI-hqBFmEuurSv_6fDqudAK-YUY69y>>0T zT{EOLPkxs(VA+?Wt(Qj|H!Zwv#Np9P8y^U4$bD$GQtw(IVB-1%hObMv&` zkDmL)Tl1Vw7i|7~?Q=%3;HD`~!H`Q|y!wfpscoLmb3XXK$IU0MyY1RD{>X4TIS+lK zJ=FQzY0JAfSFL|~eHuOy;_N4Oe{tQ?IAin7-n~wG=I&bMqwczJMTd7T_$c&!zquo{rPr_9 zFzmyJW-ML&bm;SvCtEKYe1FEJ&nBiO_uGX>s0Zad_U8EHTP}@Xvf-1BSN*Yj^SKMZ zo;70Ft>*gdYtBy^*uQwpp=)k={KR=zwcge3ll$L%XG{FYOSea^s`ZJmXfaLbSI_a` zbFOg+zH>Yjcqph6v+fCM$YBjSdJd}*vjJYoCqPHfkbW$i34tF%qvKnjyMzW zuNd)bxN6)Vfb$xz0QV~3ZR^HmV}&e5NPxvDK}b1=H;*7Jz)i%l3Sp&)i?2)J?^yhe z&H-OnX?7=oJn$S9VozfER&ljRUGB9YfRbwwT7&CK))ud7qPw|j&*siFUEBUD}i#QKBaaCP+l$g(Je2~EHBb)6Hw+LuV1L9 zl**R_bVb}nV;$MY-Mu-(A%Bt~*)07;#HJDIg%YXV)GBwZDV*kDE!tcY#edN}L}N|7 z5gordhcxGp6fPcVaxj*7|1(Oa7DUz|2VuQYmkd_dp$M-Ew~)BXm2~jMBOeZ&L_J62 zQpVcT#P27^uZlOFx(Q|eD?6;t!R~x#yl@XYgRq^z>O3U3PdBwQUgLnBA@nJyVyiP= zwBOmWTeUO`s;i49(3jqjL3y>+880r;s|!o;RhjB;cxnLO-o@v+x?v~1UQj)u`@~>p zyrrfbUqPy_8R~w3%q+ z)fxK@#uZnG10#d!RiL%>#iuNK6)|2HfxlMgf@-|JxMF;9Rp&r$X;1b^4y!Z!vOwoR zk8nO_k7Ji&_K2#J*(2OIBsY8b{e}yS&j0JbL>hPa{rEb520x3xjqenU6K)pgiw}tX zGP!FS4(&r`pH}3+SpCj{6sXg3wX8Q0OY~f+XmIBV-8u zgn>eiFkBcdj1k5OWx^H0MBz%IUbt4cQMg5zC)_P86dn|o3y%s<3eO5_g%^d*!s|kV z@SgCY@Tss%_(u3%_*pn091>#1lf(qEwb)KPTMUTFVi&Q8D2keBi|JyfI6xdM4iiU- z1>#t7yjUsLic`dC;!N=dagKO9T7RFoSX?Hq6rT{E5uX<~h%bw;iEoM9#D9yQh+l}i z#qY$Q#QowyF-AI3Iz>v9&XCTM&XYPx7fIbEK~g14>LvA+vZPC-q0&exUn-U^mnx(h zX|i;+bd5Aix>>qSx=UIht&z4%KT5w!hozI{psdNgS*DJRw_bJaPJCv`Ky~+XQ47H1Dsd;LtTBp{l3)Q9Slj=J4C3U-c zf)>&ot+zH%%hRsV7Gd1p)jrg|(N57j>)mxxck~>6xL%}B*Pqna>o4nX>YwUA>H)(r z1{&o?tufP>O`t*=h78KnS-j0>@?-g#{9^uTem%d9|C;}uj}LYVD#4z?g5b2^ZNcTi zSA*XMPYI=l287B(w}h64R)yAuwuIgb9SC(1OreiZC(IOX79J2b3ZDrr#8br!#Z=J} zM~YX7SBiIn>sE@-iW|kx#699K;$iV*>2&EFsk0Q645_y?NV-%ilqN`%q?ytjX})WAan-I{78JL4HsELf$R^EFX~Llom=WrHyiqa=y}2>7(>lvXv1^o>HWgD|O0M ztmp4l9#S4x{-vx_URT~zK2^R^epU`CC#kK~v(;p^hpMUR>Hu|^TA-F=JZ7l3sSDH< z>T300>L&G7^<9k07wT^HCw0HtM(dz;(bBaXtw1Z+uGD5}cW8^X$F;TEtJ?e87uwHS zEB!1zMGs+|iuJkrLd>##`iVvlqo+}0Of%*g3yjB%UB({c0#h>knC0d)bEWyb`I))L zJlQ(kQmvlW5Nnz>)4IvJ&AQuKWG%BEv!1bDwm!wY++!WG;_Y_!Id%_QwlnQPc7a`D zPqMGJ=h*kzkJ``JFWOt|ckQq2ef9zSpv^h)P75c&Np#veNlphR02@EW8R3j`COA`^ z`<*q;X6Fm%04dxM7ISfE#h=fI_+I>Kej~q^Z{+v!2k?=-5y2aRF9$yfejofZcxvd} zP%z|#VuaI#R7e3)P=$+yYGJXkO6Y`nnkSZvH;GS)ABa7r{!+G-ClyK6(lpGSd!!}O zQ_>5VJv*eG(k|%}^yqJDYi*=fp-t50XvyI2H2pkdzOl@JLPspjl?P{_><5A!LQ<%I zC_gkcG(Yro==IQ^P)kUiLU876;a$j(UxY-={#V8A;tI)!~m?N*2TPX;yhaH2%>*Bj&rkbseREyOLb+Wof-Jrg%zNdbwexs&nyk=k~4$>~w z?$K63e!ii7r0vvN=vk1Uujt$Lz4{5p=|;#}?={M-C?j81H@O)x2VPLK~~1@nRx!5f3ELvqLt zWrT`Cb1{z_LXGIDJB8OEZBG;1i)E0QH;7xrH_+~HAPHMS4hAGyN|OdlBcyRsl~gZX zE8QnODm^Eymo`bSN^eRZVYI%M_Da7=e|qz@6Xc#Pr^}i00C|`^N**hZmnX?nRgOyT9#u{aca=WrbS)r^} zUQk|9-c+_JpC~^mr>bq$ZmOa>YCmM61=NXt!ziY7b()dr^B6l5>x?Pdlich&kC=Pt`N@0s3WniC(VXp|8#rZ;r7lt-GuTto7Dr>r2em_I77G)$VEcwX^J@_Go*& zJ<*!K?vCep>(z)8X#aZG!;jD8S zFiU@O_R~BC(>4G+i3eYt$#>$r@d7`BFXT)3+5D~io%|B;$6Ndk{u};JzHRV=U`kL5 z_6lAc91^@NSQMH=!DP(p%m~TzpJ?Qd}dh#j3Me+$uJR?~5Ob zJH=h%x8nEWKJkF~rx+`>kP@UeQah;wIQ&AXi^NN!q)WDxA!SMf!SBPRQPLP`tW+jd zN)x3i;QX1=jaZ}RVU=1aEtZx`E3sNVgY{~Iv>9tw1JljW=AYvk+Yo8?>OyX1T2 z2jqw3N94!lr{#ai>#?rAD!(DWD}Nw=EPp0{E$@LI@r(S2d{{m~IaxVPp;>f}aslR1 zHzkOfWMC%s#(FnM8KPW@6|WF;YJyU&Ov0)+9qZmr&^hii00#zo)PQzM#B> zdG?0#w(^1Uk@A`HrLsr)LHR}bO*yQ@sVA$g)YH}W>N#phwX@n)4XToAU>5eqJRGFv zsFz|k7OLaa3F;N|j;xrwzc$I!qgl)wM#Kin+W{ zTcWMdp2q6hpnat^YAy8+I2(P!v)LK3ghH|p=}JF(9Gskg!WN8oUzGx)7Wl&ZtOLFHR8=SX22B8p5{<^vD-lxMv3gtmtxK$7)@ZBHy4rdst_v1eJc zt-01C)+(&mYpspe7VAxGoAnX2>AhB?wa+?W9ke(*)#>TvIMbYGov&yinR!&iWH8 zWiPwhUT$x&-?tN;RA>fwI*&QuQoS~C+$`w(XJGAF&%ei?1dTBzn2L2q45~phm>H}N zE(>l6z7^aN{4DrY@Vnr?;2%tqB!o^6-5y#48L}nxcId;<7my@}Lv4k#g-${@NE1is zD~yDVaD#9wbcTl^D_#&b!5(-=_&4Ol*TN6bFk6XjVF8>kUL^9OB0A709%Zw98`k$7 zY@Y8H_lk{drXLhJDW1*sM5(Qm#AbUZDMivGhw1G%VKzU3*?T|=$p!L6`C90cPs-2A zFR=Ocmi)fFOWun$Y9DmTgK`dL&s=4dvI(=}u+koUem%H*t9mv#bOdyirP@o-0c2ud?5;ciHWo3mwDh?c_R_IwjD^Zg%c+mO76(&pEF;?>e73e>hwN-sypHu=otv zdC&4M^ZWS|@X=!jtNk;y$w%H6w>Ic#1|AKVhj-Eawv=LQk@|TFS#oNS1;I)^;w_z)NBesGL-$@F= zCK?P&=uYt8dg*kzqby^czgE5n@@k{}Cey;dN3X>wrz#y3N4ZQXQ{KWF{+*Ji7O7V; zjrk1iM(q}?$F22t`b7Ooy;1)~Ki!yR+zd_WH^Ve@%mU23Tg*qH1)px62mSX7=)Wti z=P+;Lpyw9B0=?3{-TuOE^(z!I{B@!Sh3W=+{uZa27Z*C}`lr!9u=J3|_oe_)QoJ%d$|c zfkiV{ybBi1Q{s!zleUYWg3tDgCrPJDsjv?(hBcFqHDiKwlQb9B;6mvktP-oGm!K&% zU{&~8`dx~VTga!unz>L;l?Ap2Tq;+|b+BaS!-{zb7R)C3b#UFcknbed+d+iiGQ)f;$O?@PJp@iK zVK#>Zo8xNm@3UC@+e3q`k)}$wW6s|%Erk}lTKW>B@~ds_nH-TB;V*WX;m9))r{5Y2BbRPSM}eKhS^I2N}bRDd62X z#t+c%&oXbve1974-fy-6=gzX`Soc{ES?Aixwqo~(USDlrZ{KS_WN)?`qbxGX>5utd z;Y@WFIuAnUe*%`+de~xbJ0Cb-IzLmN03FL}+!>zD)Ec@2<>?Xa0!f!}&T zYbaD6QF^N{YF}zsgBRwYec$RWq5t+X?!c(OVEh}a#wq5xkZG4-g`8>L3>|kntkl+4 zFRXRp)1jBD8pl zbFFg+TDt|SAFLdXHb&5X{kD7;;1px{8~NM$=P>^5f@cR;1YZv}1lwc0hlU;xeHq#t ziWL$d!)8Kv8V*@g$?y~j7|K=9JDyQ(*lOcomH(!#)pdi$W*xZl8*`u8U|mOL1!B12 zIBe#>#7cWg@W#+GL6dA?47Wf7Q?Z_=!q%u(Z-tK1pdE&tcbPs;&oBmIMoctR=n4a@ zp;j+@wta{F0%Z3<=QhacPaWE%kqiDkfuF{&Se;!$V?rgsQ))s}n0%fC3B4fn zU}#0?iO|0wrC)`P{RvjbZ$dwZ4ux6?=djhWRHzVYfu2nlt{3JAcL)n0uU809V3phe zeYyb_Ea}pX(4$*HgFaupRXhYu_ay0DaDF+o*sn0=`y@_2LGB^T7~##zxvHrSh1OQ3 zPF3fq_o++Nr(r|AslE?P<2&_qEknBmE8ErDBid>$Mem_s0(9vB^r-WU{;+?pHm);n zfkpnD@sjbX@s{zO@w*WVuIK{W)-d~-gUwN9nR$gd(Y)TAZQf@tHXk=vn=eCSinrQZ z=UbgE#Y(p_tsLk|WcP}g7sDabYwRiZP4)_C9Pzu4h()p3bDh+*# z!wfzqv^lgjv^{j1&>0wKOQ|KSy}qdPwXn&TXpd<>XeR&{>!;tZuLc$tH1fc?&zpak zCqi3WYqhbr+K26@oZl$V>=;sOxYNLCEBKcnXa2-mnh-oa*fppJGoW{k42}=33pN4^ zyHdCfHuI;#cfzkiN7x&01Kau;R>c`o53B*SCKf}|ESBDo;$!452C+T;irf=w<06q8>mS-X~*6*P~#F;J4M6(-a z*JW7$)>-db33f;OSJZwwqy)og@?*HQsQ*ovBP)Obv?M(-xE{#Nq2S4(e&DwIpm!aD z-PTgb6Yc`v{2_D|`vaxBO1xiOftBnB@hq%jY0?0+;8Cf&lCMlt7Q)_^phIS9KkDs` z^MPdCWqe?KX&f|8GG+5#a|!UN&Cr8?$B3ST@f0oF%EmmX13I-4c=4B3C)>39*kkNc zyTZQ8zQ&#p3Gg%|z)SWg_HMhKbCFZ$aFsCx$#CaG!k-lUHF$q02Uy})!d@W1mtf^h zl%ACvpmY7Av{I9Rjn={5uQu)jlG12&Ks`pGCJ&iiP%-f)@sRV2o!$cP$8w4_z1Pf%X4U zVA3D4^}j^C4k+*U(%teRAQx}Q7I2Em$}9S6BgN`&z`g&wwVJ z70eFiLK=?><_8CdMq%Dpu{nQB=KZCyb~DIDMDMJ12D6`!T@0ABYD2u_Lpc2_JXF zzG4>8@ex4Zip2@AnkT_#z7{wf;o=L$rQ##v6XL(bb>b%I(QgBr`;^(rgohszPhcoe z5-{5fq^_`%W!T8+Qa^@+j{@l8w#AR^uIDYd>JV#F!^yeM&UXWb$Vf z*5P&LOXgNsZJ(G1EVO)BIseA|?`XdY2{Q=#2Dd1NYm1@l55L2&LI-gWuy+x$0$Djc&)N zE0E&_z|bGkp4awkZS@EBTw}B`&bS7)!Sh&edYB{3XH0G<#tm~Vfxm*kivNW_4Tz^6 zyc~MZL&4{OV-en&9vT;#i21exnCDuo7w?2V3+;yg;!o)N2|^noNeIAem5P~X!DE#r z41qN?4SGM#xP`EY_5zhU2XkbNI6^9bUjK^J0la(@kjyO@haRXud2(ujS58-ED`n~| z^(!@?T?kz<1iWH8R?mUPNaG7g@;I|KaD|mv1vi*)nD3b%Lw0^={%RgJPXfMww$%+7 ze;QWAY}kln7*_Edp-;&q(bpFfW&%w!|nW2rLH=$2ZyIVribQJ`lCqwP>g+IkJF|S{icsU!q z{s_i~{8Po4pHIUpauHCT`+(iV=(XUX>w#IH1iN*s^|AH6HI&NZ@GctseTBD!`B-TP zZGTKOfu#|`zXx+)lUK>_C?6^_FpdHJG5r~!GH>gn;q`dTkj*=tH|2`QgLwjEA{TEBvM*%^3nBu0zG9T^Ld}33bKHxp|X{DKM(L{5g1Sgq*yLiy`o@QuqHSa zHuh|^VFB8(GPoKo*aVwo8zkGV;9lSq2ZQmUgiza1hfpVY8pV(aA4L`r=TY!fltD|L zigwNp&4Z4-B(yTL8nbv4=JB@Bj?gY>{`*1)*-WO@vlE-gCY#5(!YJU;WkL;lb|#Q$ zT0fTvE3ta61*)`F*aq}@7iRZ9;UH#s0&t}cVkdYnMbQM>oCU0Tlvo6uxdtfnOjwcg z#09{YSBk5FEz?@L4S3ToU`_krH;xCM+!pv!C+JY3WPV1})p;j;pN;APmD5^iiCU5t0Ls8aw@t%}ovjVm^5J=@)atZ)Nb1Xw>5u{pSB0-HQ_qIAk&jir5^GmI?9jQuBNkzI!YZJ; z8}u!D1H5cI_1!>?4(OcG0v?(q_-9gp@v26ek!fTb!;O5S1b9WAQ4h;}E^L)WSnF0{ zo!ek+0XDbY*lFyB7J0zn%oflWlCa{XzfmTTyws;$Xsr& zGS@(UZ!sHS^X@cvn~gw$IUvA^R+1I4QY=0!#fL-FD1qOn4jAw(;J@?X+glC{cnwg$ zEwGTcTRVYdHNsBjfQ2Li2MO3IHgBtT8a%k!u!i#C!>t4|SP$EIF0|)GKx9|hYhW8~ zf#$N^-U%(b5&m2bzT8CkaRcz-^02DYoJ=PhdQCpC1a2XEl;QHm@dh)1j0oN1CN(k!#a6NfZ2vto1 z*Q?RA0;QIOC`sLvIHQ@R!;Ck}#?grN%V4nR1ISE{!0Sq-ZY0@As*yw^X-1Na5LuF7B)v#tWrE{}gX2rU@pa(%`QY~D;Py4( z_ATJ{?cny^Y=6Z;g`|2CxIG2ju7cY$!R^Dp6S;PtiO^{wFb9pLr7 z;Prz*4-%MemIA+{s+-{TEb#g$@Ol~3(`EsGn-A=5IVA8JNZ>7yz}q2#cS8b`N3sPZ za1tbN3M8-!37iQDJlq%sUM~Z$PX({f2Cpw*dL8L>Tc8_nH+F#6_k!0C0+CK&`dx~d z3SKwC>sjFSQQ-A5hS|-6y*}Su0A61SUSA7d-wIye0bbwBJRU7zKPO?0OR-YH>n1do zENi$m3cOy%JRY;)?U-*Z0I#nEudfBKZw0UKVBU@c@N~2Q?w172F9jY@6&7M9e4xYa zQQ-A5@cLBn`fTv}0`U4u@cLTt`d0Az4)FS3ws)Zg_AMk~&q50P5~^c@*R#OuqrmHB zuqUSiJ)G^#cNRdeSP497EfA%x&UR?AyWu}S;2fkicu_2SheHb>Xi4y*r|_w~%A2tM zv-sisDELgvu!CwUc2Ldc=kp6-C9dSx0Kp;e`gUMYyRie}0Fa^UUOhI=K5iI{cUG1HPT zyM|*Osl#ld9YzPFB<4vRj#)AvGh-9h_q~`6DVPN%koV-JXaK(-P?8|cRq%G5Iu9JZ z23&kVO#;sj2cMF)fVZ&Vy>lqj!x2010eFt7H+WuTJ(33R0`*EZpUZkCpD$v)Qwf`e zdZ-@zhp3n4Vg~~C)FSwqskc_auBIN_z;9x`)&LuOm$z%=AU34N2dVE8gKb&=1tNS% zgl5&~b>QQAAkDMD%X8slCw^XJEIGnf*#h2fFt#!N-ih5ayTRj)#y-a9oEZMUs4xlHQjL)#$9Tgf=Leh8xv=EZW4bVikd;4y7Lozo)BO&QbzH9PZlXT`8znO9xG!v52 n+0aggAE8svWzu>PqWhN-dnRa2A6%F2|VwX#ZnPA0?HFlNm-7}j>?SBSR7Iz&=UO$mik z`B|H!X$qxCgsAjGon=ajmejuY`}1)-b2fVE^?tuUm&^B$*6X;Q`{UR1@q9cV&*wSM z$2oiL!LCu=s#K|Bd48%{)hvw)S6Eg%admPvJFA@)Y}K$rt!u2S?R-ypHL`0p`%ztk z0L#v|)A~!gJi=>O*1?UI)HnH6h2c_Xxa8@>t{@xLd>YjDKx4*S@$*SvSOlUS^*4E9d7r#_+Jg#-u zeTkCypgiK`p+7nn_sip6dE6}z&rg~>Ntegf@|Y-(sqz>r56@2*d6FuR5%TCOk4f@q zDUS!_(L)~kQ%4?m$zz;6hRMV8GeMs8lt*KE+$WFG^3Z-wmq#yoWXR(xdE6-v{fRMH zW5gtRTqlny@@Ov)&(C;y(pnxm*4^ciAdg^q#L2_+(?*^|%0rLSV0rYB$4&B>CXcT2 zh?a*_9{0%OHhF}~Lx$h}36p;(%i~59S{=nv@)$@wQjFsH5RApnsOSM4AP+sJ{}(@( z{Y@jaNWbE5@-?}>JeqjrU+(q1^3xkgXed^Zht4_uxmg}M=R!2#N9STAd0a1#Akvzn zhdVq^#M|W&D31tvbdX1Fc~t%huawZ%EB5tzu1{~3M=R3ob61{sB5sOxQK=`7-tuT6 zkACvdpP>dT8U4g=JikS}RvvnudH)QO;7StuV>3)ahjK`>v?Jer|PDuVRulioyv4SN((JpEJ(YS7<{#U8gp3d`anV#+Y zS(jJJzecvVoBrtjJW(lsidP4;e-BCdlV0VcB|o~vT*tJ2sl?v-?n>>gkv2R(+TI7! z-Wjj{mZTt|5m9zhirdO`1$QO zuhhR7$sgmDKTGqkl=AXF-QPS3XLudoN9>-Mf3!cp$@XVleZKwMr2Y&pT3Y{6Y5x|l z>&KUsw*PCT_G-#}U*a`io0z8UQo6mR(q61rd!?1~%cMW^y|!N{=>D{qIJLZfp!KJ0e@XqSR!7;4=1;HGpH9;Lp5wAj^6P7R zUgMc3`D?DIYQN{u`gd2Ve^mMte2q!e{Dabt=SRn5l(gsh36>{e(%vxHUaCCT^35x? z_oWt=@tHyX2O8Iw{!2SrzNk|9_bZLhwUx%_xWEmn=1fSi5=M<1 z<+Kt;2v$Omm|h9Plhcw%j!JhXr^WQ@oHBk~a!lfVDaj`9;yDRPlM=Oo#FSA}q~JXh z68h3Y=aj_s^yGBi=A=mpsmW>S9gGR=P7SDKR}cX>6)Kb&gN5?v`GqX*^7MNDI?gHGy*s*xbZ%_&*re3S z6;j)1bZ_#+E>Th4GR7rov+35@#1w79-kTKJkKrka!-uC?6VpaHldX(#DWk?+*w1m& zrwcltmgGodP-MG0Cc{UiS!v1AoM;aN188qc5-fXHHMjey3CZ2Yr8?8nW5#z$(Xo~8 zrzbnD3F+ff(_}P9SV^Xz=}tN1G6<;|GSDN)OHWBoPPJt0lO_(A9k7qb@Ran)VWM7@5#_BPySV6~EhV%U4GDpEo1epQjCnl%a)1h+3aXJySW@@6-VWmpH<)9>t z&5-@p@?$C`$wAk|v8id}oia|AoK_=8>pV|SP99^8keQugjTj|!WxO?ZY@*C;IZ&FP zK5At0*i`3aJ#O+m(Vk$|*o<*n=&s%a`g-Q1nVN0GZ?Vj?e*L<(DSz6pYg?Z8_t>WW zEjn|1*)zIxVv-{{YSdUcV*M^mYi;!yCo?O<-nQgh{q+{T8v4aoRB0FM9zLs()e*n z$udO~E=ppCCK?;b&u-NsdGY`n_8DYYh|9r z#U-@8sh!n1F7ED5JrY{q)V91p8%g$5JD;j0^etA!|8!-_^IuhYraxMuiv94h|JD5J z<WrW%lKHnVyy~!TGP~5J=?9AqGf#Kq5oBvhraxI zYH1zaqG{i>VV++msaj9>u&P~8?IEwd`uf;P9(6~JlH2`S)?1_n*l~4hJFnkbKE|uO z^M(a-yYFj#Oxh=}jge0J7$3(a_zG^q?YIxW!XNPu^nKIxuOVKGH)90$zybIz{*2aU z_7j7#72b|LZ~!Kw6SMINd=WR|CVU&W;XXWsU*K^p#Xs?~w@iPp#1L$acVbVB#vwQw zCt?;phR@>5n2+z`Ui=bE@OP}S#q_T}24hRS9lK*JI&cck!a4XfK8LGuExwK0@MHWG zkK&K$^EUm&8?Xa*#IAS`_QrTj#BrF858*6ah>P$=d>QlcE!>VD;wN|z&tSDevmbTw z8f<}sa2mSsRa}o>qZ@z5E4G^Un_+9b6MNzmT#PT{NB9X=eaE!ti*@l9?2LVID2~Br za0~9j>P3tLHpNyr2uI>roPaOldfbX1;bFXdo7v7y7=aVXE6!yV~a5g@MuVWE@ zj9=h!ylRJO{|@YllW-P3g`4pm`~c5jwVjMFUV|-g5KcoEZp1fn8=k>x@6#?`gDr3{ zPRBX89zQ@gp2naLOuN@&3+#!pn2eL~VSE|a<0jmLU*XSKb(h)R6?i?~icvTS9XJ8A zFc%l&Qe1(naTC6cAL3s862HaMcouy>H2tlOS7TFbj$wE^-i6UP9Ph{J=)zol0oUQ% zxC;;AclZlhAJI>|3Y%j)yc_Suk(hy*_!z!`>#zuS;D@*u58$_0jA!rNCp?F>J~sPv1vbN0cn98tu{a#>$LZ+8 zTzmo7;oGv z*dLQI8yDab+=%bs9z2Gp(AsCV*ATDAw%8GS;UFA|PMnF4;xo7sH{v_E8^6F~SZhD? z1VgYj-ihP!NnDP*aUa(Bl>Nh-urDU!6kLn%<1bkAfN7^KcE)(jz-3r~d+{r*deF2J zh__*HoQm@>4_D!9n2*P?+9A_!W4r-x#qQW2S7Fd+rrzVY8sEX$hfV&I_$$^rV$!d{ zyDK1;ltmU z_!(S*3%)h!dH5o(#js;0zcs%5gNer;H|F4rSb$&PIlQXGly8R)d;kLaX1Ven2M8d2F}L$n2SqrC9c7IEW{nS2M^*=bmK`Z zMXRpaPhSkcKn%uEY=s@L8}`9?9EoW-4QJ!y_$;o%4fr;`kNfc`9>+6SrJmUjKfDsJ z#g-V3o$+2Ah{JI_PQh%PkI&$XxE43#cHE1fqZ@z0zpz$))Bgt81aHLl*b#f;08GRb zoQMzMT+GE~_$n6QHr$P$;W0dke_##yf|;I=bukE=V;j5!Be5S2#ZlU=i9g_J zw5~Ayz8tT>rWl5|Vkhi{ahQbTa584$O8Fw69@kfJ9lqVzq;JEW_zTv&#^i4aHWuLy zOuN>kKZm=q6oZ>I1E*mjeu!V;Pk0)ewleK@z>XM+kKj}IG8W+5_%mMK+O!vdfj9_9;scn2 z^RRjwQ~!EwfvqtTM`9{Y#vELREAcD*1Fg1ZJHB`i#^M;9j1S^k`~dghLA4NS6GbIyP56P#v8CT_QL-78#d`~>V@HL*bV#P zFigj6d<1JnnsyrFO?V5&U_4I38JLI5u@HCQw^)L{J#-0&#A^4N_S#?uvf`AFsx1@fPfe-7yvu za0E`lEOg;BxC~#yEw}@BKzoCDO*5yDhLQ#^VT_fOByHF2d(!A!J$MAa!V)Y)pFw83weU*30q?|~7>8r@EiOYs}DB) zYm7JIt=J2PV>(X4Y+Qg(;|g4jTd)Xs;HT)u6Ih0q#hd-@>ew>Q)aWU3RF!k$W zT%w6bU@2a9pGl9!k@yB~$1zE!+%$XxZ%;Pqeb9l2&>CU#_v2A~W28yn;xHb-8%LXX zFJ3;z#FKCly78(MlYaxQ#X|fVPhiclrhGl@g(0V>_$7Xa zC-CS5(~s}5(L@u+;{?pa`S=7rjnCssd<{2X0T$wR+%(B-Z!4B!yU8X!4kzNnxEeR% z2N*oX)Jwo3JdXJfnEcPM##9s6#i2M6w@x$pqox~|V$g#oz5^%X6LcH1 z$FcTIlOKrJVMk0u7ao0x{$v`fWEs=&p==Yc!#x=Put`tEML27gN&gT};kC0(`aL)n zAH+qt9FuZP`TKDqCO%@)N8m)9iZgLG&ci418C-%Z@Ks#pGVQOy?=f_aNxuWfU_O3| zzhbqyrhEuyKWgF=*kYcE@4=n855L9-=9_ZQ;0D}{-(%IsOu1lu89%_V1tz~Mj>hSj zkDuVs$4&X^xC6h%nF~#R!zYX#u`5PlKOBUK=)mzf0cYX@T#V~+3+}@&@ibabn*I#K zM{pi4!dLMV{2WuCGWDn6Jlue9;iz0wZZf`yAK+d*gh%mv{1H#%Ijp(Jv>S-c@DA*R zQ8)-QvG&uZ{*@SpeQ*#yfOByH=HVLLi67xXobrs>P8Kf0E%-kEgui2*JX5b3hGQg- z#wnPEi||=|3Af_McoY=Sr79TU z;FWj{UWZ|LD@I~J9FKEw6&B%s`~h!SX|~@NV{s@ZV+y9@6r72(@o`*<>v0Eui2Lv` zevQR=692$}Ri>XI7=hh!IzEMYxC~#ywV01@<9qla9>fz^in%YDe!Poc;Vmzl^bXhw zdtfxi;!sS+6r6~&@o{_w*I@w`;&%K9_u~=#27kort4)6|!@3xVP4IebiS4ihcEf=< z5*OfWxC_6-KQQ1G(~ohu2i^D=Uiqpi*BEccTQLgn!?8FG*W%aM?lsfiFr0@^tu^Td zxD7wX(`cD!z_e@DLtDYlCUm7q7q@u@&~he)t5g#8+@PHrQy|ZG;{0ESBM2ubXmRFbN&_ z2=2yxcm}(@Ve0op2X4eocmSK{oANi~U3d>p#20Zb9>seuqC}%}r)|{@4U>#Euw=18_Lb#D{S%F2rYWDXzjb_y)d%2k>kB0|VYP{k#qr z;%?lBhw*DH#*_FP{)N>yn|1^6I&6ihn29U!V?2Vtp!Jq%uQuL@4Yru{P`nB6#fNYf zK8kPSDXjXoX{Qc0#2{>jH)1>Ni{mgIr{GMSjq~tHT#U={HQa`~@dTd2-_a^G{jQ01 zuptIvGrS4!!h0|gN8u!#hq<@}S7JUEVKM%N^|zY-#bY8ma4{ahAF;|irk+1G#uj)R z1{axf*I^j8#oO_2jKtnJ026Tn&cwy|z&5j;`Iw6d0dSsve7wn0BaUc%E zk(h?lF$-O|9ACn<_&)Bz19%e8;GcNKPSgJ&Y=#lo34357j>K{JEB=8E-#6_x!4T|$ zy)gy{;y8Q|pTs5j0=|!Xa6f*AKcV%3>Bp7W6tBmg*arvTU`)lCn2Sqs1@6MVcmR*! z&scSr=}#kUhN0LC`(Ydo!8FXor*S#1!jEtt9>Op17xeki^rsG9jiGoOM&o@r9;f4c zT#6g;J-qrOvz;*Pi?Nu9BQOJ}U=BWti*YHg#n;?t7x)WS-);KU7Q?XK0blVaTRXCJ@^ZjVxv8#U#;+N?1lr-fs=7MF2NV@b$kc6<0tqXp2FX- z+Q+6JSKzhS9NS_y?2ECOgyYePIrt2Iia(;yUbEfC*bLj_o!AdYp%b%k10KURpO|)U z#d~of=HXjdgkRuy_$&JEGws#ER(K0WVJ1F`OYtS#gzw@}bYm%2+i$ja4PKA!uoLEB zK0bNC)O#L};3@nK8yz&|hT|x7Vay?uKM8Om3#++J{Ro_jkKz{m0e`|X_$Q7lHtjr#g}CPjlYSVxA2;z!cmR*!SLnt& zN=*4AJcU(HnDjur2Gei~zKb7YG5(3kKbm&N;xc><-@qU7EY|zU)Vm&c<6-;-Yo0Xa zZo&Z=k51f=pW$&V!}>p)cA8@c?2Q943!lYRxB<80Nj#0`(C3ud&gEDSufnEyJ+{UO zj7BF;!_{~K|G>JxnC-R1&KQqr_$aQ$t@u9vfWKjlUroFHaR|OvYSK?)o8L{Gi!b0- z+=t&`?X#wQV;qF{;}m=d7vL*cfInmXKTLaVF$PEDJY0b{oipX5a1c6hGCq&%@iY7m zf5obQn)U+l8VtkRF%k!0GS0?aT#rTg1^$IS|1#U_gDE&0H{cie4L(q2>dip?e+kv! zm#U3{7>XURGe+SMOu}(E1sC8F+<=?#UHlk}@hAKftH~dF(EioI>#!Bxi~VpYCgB9k z#r0T#2e4LEvz_L68{UOou_yMySR8^$I10yO20nl@aTY#?FXNk7h#%k~JcA9YnSNh| zO|dz)#!fgC)9^ve#vGi7OYj9;hXr^5zsD0;*T?j$DK^J=9D&pDd3+i3aSMKeC-65c z!|K(|_Ud9&Y>tr_heL5H&cOv(guC$o9>Y^uhBa%L?bpU@u^rxqJuw=GViMku6LBU! zjPvmcdn|%ev3b&udmroAYOwV za4e?dbex5Y@CAGo-^BOvGdzlaVIBFKEB5b);&NPtT`n{EJ+O|SiR)ui`I`w^zZ>?% z@9;QY>u<`P#U=qJ4)Ivm#5Z6)`GY0e?nCl78tndEW&B0{#)ihzNVHl1P7>Q9BhwAuT+G9jxEk|uGw#4$ zco2`E8%wYh&!O+b>^}x#5QbtHhGPUqVid+{dj}A=1NjMc};~dPzJY0#ZF&{VM4%~$Y@d&!H1WWN8`sT2| z7>Gd_ieVUz5g3V47>Dubz!aQ>Q*k!V!CcJ4mAD%7aWn3~U3d_Wpc_lD6wjgWBkVs0 zVi1O67=~j6Mq(7kVLUo81t;NDoQ-oZ7xQo>uEu=aj5}}_9>gQ)#u6;WbLi`0|1l7Q zFciZu93wCiqc9HR(Sa#A38&(0oP)WThbwV4=Hq7EfxGY^9zi#jU@4wM-#P3*24WC~ zVi<;F1V&;M#$h}ASL7aqhT=*AK(#dGL8m;J{;48l+h z!*GniNQ}Zbj7JBi;3S-ivvCgQVjix<)tHZ)aR=_ggLnkpSc0W^4t*bG|1l7QFciZu z93wCiqc9HR(Sa#A38&(0oP)WThbwV4=Hq7EfxGY^9zi#jU@4wM-+Amm24WC~Vi<;F z1V&;M#$h}ASL7aqhT=*AK(#dGL8pZ&)`48l+h!*Gni zNQ}Zbj7JBi;3S-ivvCgQVjix<)tHZ)aR=_ggLnkpSc0W^4t*bE|1l7QFciZu93wCi zqc9HR(Sa#A38&(0oP)WThbwV4=Hq7EfxGY^9zi#jU@4wM-v#VH24WCKykYV?Vi%0W zD2&D!jKg8_2LSc{%z>#m31{GJoR5J&ntGwQ8aLxEJc1>d`;)1+67z8fI!>DWNjMvW zem3c07=ck(g6GihlqnyCVHkl?7>_Bae_ve3BMPH22IDXu3kR6;+i(Z&!acYT58_e$ z7Ts8aC-GM-#dB!In(g|aFZy8sHo!m(!e9)+Pz=LX*bc)n0y|QXboh(p)a<=b{LKk*b%#6Bt~I0 z#$X)A<1ieK4otyRbmAnOiZd_^XX6~4j|(vu^Kc0+$CbDm*Wd=s$IV!X+i(Z&!acYT z58@F#ir=CeOYkIGgE&6ui+&h@4KNUcFc?EH6vMC;w!?6Yz>e4jqcH~KP%f?i{`@-v z|Bk@FBk=DC{5t~wj=;Yo@b3uxI|BcXz`rB#?+E-m0{_1qfzmhRZ^QSL??dJrL-2Nt z#t}Fb7vM_Vg8T3Xvu9NRU$=^j)SIOToRU2(Hj(XQvOa3mV zribn@I^^$9YCKB*UZgrx{yvv_P`*E{e*b~Q_sHLM-(}1`WNajVZ%Whe*8LGDqL2Lj zCXHW_zt5y@O_X-T+mnooM;jZCH-4FJTrfJjhRFB!HQprO+f@^5 zRkgiV{w`M44wkjeA?f14vBu$3jgw{?=g9X%HNU-I@)a{Cix;^nJd|J07@rPK3PwV!YThT1gH3!#f^nxFN2%XLkE3`Oj>mkgug6#NQ*b$E z=<$~HS219LiLb}uShm5WPuOU@QU3opwB9Cc{f3E`pntxJ?|aLbf!X*3zJMF?UEGh! z@0j|Na5m=RO3cR{c+e9UnfizEIR1f`%kSOmeq4<$umkpx-)qzS_b}^_iGx2gF2;I? zO*{+z&X{=XZ^q4f{kzGsK2^J0*1Y3lFL}t{c~kqfmvUlRcjK*njLY(jXYsCAO*~7- zSIYl_-S(RJFWtVRk2+%9d)jykXK8;Ve+4?^_XRY58-4YBkvI;wV2pfURMThR)?cOH zadO?&`7HL)`7DO%cEqoA|HXS6NjuJK5T@x-6TZn{5`KLXS6UhUsBInT9! z;xnbj!+5p)K8~i3LHD&1*RZVDLyU=`#(6gw1Dc7AEUQ@a#iul1+^qTHb($Y7*PZK( z8#Q0zFEw8b*ZeyytGVWj2Q^P{y}n923!TOt_%+@!!KBCF z1K4nqNe{z*IBK#3Jg#Qb$|X z6~m1kaTG4b!}y@~Ps%UQdVZF53VrqbllU5ZUawCQr|R`x+>ZOTd~eHoSj&mS^g0(L z=TAH1K5TJ^iKFrAE++1XZS*{sdbNfak71QzCSHp{i6+iYF)r2PB=xqX83*b6B8huU zA%BMPJw0BMenpNk^EKo9SZ|GqV=)hpW2?0$|IkL`qI{#T&VOmQ>@B0e&VPwVY%@;4 z)%#8S3%38%#8dEXtaHGm_rsQlOdO!ElhW>VtajAIVaJTW==mY}{p9zD)yGPWA7kC$ zO`M2H`aW06O~lbROMU~(dKcTbGVwgD-rB?oc)E>=d$*+?HqqlP?Uep%yjNdmC4L%L zpD}T@-;BL6Q2Qz6?!%|GA6HmbvTk2&uiF)`)9r|-@j$eRPhmhG6Q9N9eN9}opD`W} z#hLilfyTM$-eBUGjm8xi__~Rgq5m5uo{lGQM7~MijcpE^csc%tX@^XDEqz}m`||*v z#N@*!{d4T9$6d;O__=Y~7sm157;pa8n56ST$|bh1VpX}tvYa>zm*E&uZh5Tf_!zEK z`&!mUb*g3ktk+TT8a+QpSe9F3F-haGaz5#GR1DK`?j+ldGrskTvFKytG@W;n-(Aby zAlDl_ft~fZNcvQ*FK)+c^|(kp2|v|#B|eEYUN!L#=+N_7@?Y6(Jfho|_ze2(HSr02 zY`=*=)bW*aZBH6+l=qWWB;Gzi;zY~(3!~yqoQ-k$Cf-c!l;u;{Lc>kGsTCdc4IBdOfUVS+Qz{Wxb5?>JZCXgAc2L^1fXiFRv4ruXePo zoCNVMxi6kCj*|Cjj~Tb%I}1$w8Q%Z6iT7xJuw`XxEN*;K^tY@hpE4#cGPZr%xI|y) zB>$Gh#%Wl9zvFGsn*676hQ2OJy<&WGiHXCP8c%;{tfKQ!$_-vC##q*b1IDK7#Kv+Q z-!i^fWE{F)Oq1&!Mtox8{`k;NiMz^uuNp7w0$+;tp``Z+)v>PdY{r-*7tP1p^IfLRd1H-F0N5KThvK&xZ`Agdm8({_tkvp`vTlKaJ|+&VZtRVjc(jH|zq6*%-`DstR@ZeJY44P_ zmoDeCwx?=+F$tf-U$s3+@2l;J&9oiy7&g-OBp!3Qc)w+}@E4P0zST1h)cdVl<$YNj z@lJXDl;1N{>*#%rn0Tx47fg}g^V9T)wY*c_U#O9m)mVO?P<>0|ZkE+mV{wGks}d&f zSJXc8dZZ@E{hhQ^rMC1}+Z$wAv#)oZ1{s@$LFsxlw))Y~j;i7NM<%T<{#E7b{dd{t?$ zUuKD~d$%PEnnkYHs#>m0cUf6kcA>MnTMm|$xy^TQktpN0-bepkCQCf_PuVhglV&;e zdGS%HQnoBWW6dt!W5@DhYdJKrxX_N}qG37opW-!kEN>1hN3h0A>{y>VWRI=l`F1RC zHZ6zjiB&wqjy1~>u5qdz%ivp%jv5cMV=d~4)HqsVS5QdNi23LL>z{M1pZj~sm|3*! z)v8uziO<}}ePo``&8#W^-moXLw8n(`uFR8CLiWB^W{F?lvOSsG0$fAR?JSx*!LsYG zugqGrrloAD`x*P zzx_+bAs~BiMm;TCe4FH!mv=p0B4PGk=eM$v=(4@i`0+#Mhim?T*na&pOCnsST#d5^ zSF^GY=X42al@k@x&gHXFzauPR*xb%lCbV%ibU!U&Oh|yMc8NT5wLGc+-tnvc+ptvg zqCy(vq=W?KObrQ=a>1_J0nbR@WBK!HSlN61AKfZ%6WW$7)6KL!EQLbbo{)b-a-1RI zbDgz)GViRO5#Z_)67K5quupcOf3}?QR_B@T<~EgAteCe3Uv%A+hd++qSq&s$! z>749|-8I+gxha?XWKOfHXZXp+!(CI~3dkuG9d_-1a47&16v zXp!tofNZjXY(7vnA0&MXUSrc>+Vc7yR*HzHmE;kF}KN%X(ZbW?eM-FjS&A{A7}5BLlNo>%#@M#ao**9Ozer0 zxy?_?2fKEcIWO}o+t@`;WXI9Ws+K!_wv49N5iGu3=F!DU`^j%IySr8{{khD^%)hE; z)NET;{H#9T=9hg&MkKf(Qp(FFL;Sne{x(|&Kqo|*Gr+HpBU+m}JF9%dUPtKo8?wtX zD&cx)zxz`r{C_tx_Ux7Ihj!Q_10o~yPWE1z+o2hab)TePt^?YKve)eqNY#$qf4(F3 zBq<&*o0Z*}C5-TIl4TFOIe(&DKf7Am=g$dgy`wZ7;%Z=@KXbcQk(7vwoIi~(dj7;; zaQ;YdrG;>Lw3A1eJX)PUr>4lkZ+qB2r*h)$Gb%nLWR!i*%#HW;$?TxBw#$0^d>Sw3 zQ`ZhZOg(D4DpNAFSLPo+{#kcQMujs;-m6$L+`|~|J$feDyC;JlA=9{{9KYdZF*o?i zj)pTyOuju(UFB>FZ(C@p$XO*D(h;fHEnn$YKz3n9f_CX!?TqPGFHwk5QpXF*_rv+5&bqmB;^f%ppDVUB^K3O&Z{PFh zP)i*%rv+q#DaXhj+3vnMHO=T1pV5=_{3Lov z!wV09&wn@o&V+wB_&)aF+t)bD8Bt+hFPF_;bR18~i*My|JU;JYgJ@q2hG$k9#C1}? z?cw5Wf`1cv?e=dnLoW!KB>`n=zGZ1XWo`6*MNpCFLh%pt%Z^eIE*0xrhdqaaLR>x} z()XhInI#R__@Q`t`H`0((~0x_^WHP9D*PdU2=g;K-C-FZR z&+{kaMXo288V?!l@{5u8`R@Nl;YF`cmCH-}VP$EdWoaR0X~F;DTx-Sk=O2xi{}y}W z+Mj<^zT(A9j)Uj2dg=4&QsZ-}@xN64OUt|LCZ7gfJIAbKL-U;M+W?~-iCQTe{xvK_SMIq{>~8T{f^nAG&zTR!9vdHMBzNIe7=KTWeJz z^&qL?6;d~l8d)J#etq3;A-Y0p3aN1wQX@$nRv|TnR7ZtWi`0(Zso6*6(3Uj}&|_3u z&42Ej66&E%l|t^zWK~*&VQVD#QCkO&Hm`%_{g9iv=G#E#aqCuh^gbpbxYv`-9YtQq#-jTU2bV%`c`Sxh` zcg)d(;nZ5KK?{OC8eBv0tp;@o0+&kQL(oNo-(&$)M`4l%KM>?=@Hs*7S_$?LoYb5m zf*G3gIzg*t609N^ra>M-t_Jf6_G$1Cf!}foG6;@pYYu`)%^6IPrNO-fg&N##2QohS z@_B<9m+5sZD__ny6Q#=fX?{&lbge8j=IhFsJ%YbpCXt+3Ch8_FxmYFC*T9A)Yi0ViSo_SW)Sx?8%l2gz9qO9QSW{RHI-(R*j*!EhlqW)Qf?0M_s zXrRR>dWx5~m9gRZK+nPcUA}Tso?$i;s16GW_#pe4a14T1^m zR_YV1(VQ9tCpGvzRrlM+5w=o-5(0+?UlQ02>?N43Iqwo|(;%PVoCYrwgs+m|Spug9 zj}ffaAd8?xgNX#8^3vfRP2kXA2*FAXqV2%GAec*ARsXC{?5XJEII0D1_7u?F`BhUI z+bO<|qx#C_^RlE|Zc@tHA5E5|KuszguLI!g_*PTGH03*!Qr2Eq&>S5#=@U<(3`vR6 zl&zBTe2{1AeIsA6urE-XWUW9J3*;&l{ec-+hn6mqA>X7Ym0if)?j6Z1t>T{*WtaAG z%+W&6+Q&uqFmqc2N1miqo{G!0R3u%o=ivrTxrLO?T4kT6gxD#5qpx=y(X^AA7Cw5l|`;V*JrY5+`#ptv>VGi4%vp^=*#*Iu-|XE_RP4`ayFDjjo=x#Ss8w2q&F?G ztmA&JPfc`gsjM^XkWUo4xwgu>MSy$o_mUt_Tzj(j<`+tTHtmyt{JZXv-pr_%Vm zp7OsNp9xa`zZsuyc6r98D`C0D)dQ+y8>tOa_|E!1QWVX*}Y0g#TdVh4a?VUsP1=iiYR6hsQxg!g(jm#9O z?(88ms-I)3jGp^p`6T+dtc**Xr||@d?dyh_q*rd&m1Oxi!+%a6xje|c(hoQq$b6F5 zADwhsaf4R8LmS#xX%Yr{CSe0J38j)w!n#t{uI{~__Rr?yr=zth9`DU|;B~(K z@5j5=V(;ehFq-8y#m zNzJYz*^Khwi;i-|Q~Pg5^-cM5hCQlgz3iWj=fid-&-IVMT>m`H{ol>sf@i$P^A8za zGk*&_^H(RYjHSMBbjKgHCvB>$wqDmVf3Kc#g^ZY)%>5jJ@)4_hr$gFH%KW`XMmtx} z2)UHjl?M6*707!jdB1yE73+BQ{BZp&cAKB67v0Yhp%v$A#T&hvb86}oO_hsj`9>CM z>TpTr;MDn_ADnBX7061NHQy;$YQt^)_@tF~f(?5KDde1J;{4F4` z$7i*tCC~i*U%!5z&GjCh2${_G>-R8Tzg=e~L0-SjYqfl)s~3PijuM?jO{6nk7l6X8 z(vn^P`ZyZMcQo9VWXr3%|C}*qhW$@o**7OMa{t}?AG?<4{3kHyzo$LV_yyT7Ui$v0 zf&Km`;Gewz@qYQ*^pyAbom-?+$$7QA-#PP=z3zWFWr~JZ-0}Zz|Lw}2{U{ja-f`zrEv4rjQ`r_r?>?Q}vtXJ2l798nr9m6BY+^gaInaG2wz74w>JPGo0O z+1>!haNWW%`&uN?LXFx;$>K!Wl3iezCf(&JFig8%R||BM0u^5WV>3&FU8SD)>8_LI zi!F2HmPrQ0HCqPEsx~iLF7JK%I{b8@=r=h?*=L-iWlQ#QpLzEr?{%7a-CN73OMSWZ zlKZe&_d5igoAMNewQ3PZjGPO%40@FIt5Fr*y~=62<&w)KLUH*t8AF5W3PLiBCyxJjuF`FUIz*6 zb*~Qy>~*g#1opbuS^|6BYdL|v?)4Obz3%l0fxYfEjlf>_N+qz@y^;v*b*}*g_PSRO zJJ3&Ry4bJh0j`tw5DakNY@aN?_81IsHzm?R7~rl?q&q&qUEPiXWj2${@PRjZF@V=6A z@j2tZ)h;YkFHG0tLtXCkyHwwE3ifx`y-)YaUR?P5`QP9DgFQpM=6`?p0g}phtG|1j zBze#O{_b^lp^EdrzdMhr<$KoOont5c&HV509!-t%`QP6iYbQz1_4BNt%4;I_@?5*2 zx^wo{D=p7mW#_OwSKAJ}m*@T%V$K13dG1Go2whnFiojl;+ect8&uu5L*Tpv3f%o#< zO0v&sE6)(v%X5zs*voS>3G7y!1oraWNCJC#ZV-XJJlBiBUY_enU^mc~z+Rrap1@w7 zYeZl#&-oG9%X4M%X5a1Qxl;u8^4u{3dwK34fxSHU0fD_dw}rr7o?B}NoR{Z6KMXoQ z8SV4SUh&PQte$Z8LY>o2@Ls69&!l)S)b*y&`GvYWJcZ6L)ZOSQRK8FbC@Cz|1r>K_ zR7KXRI(pWtWIk2upS>1*Y_N_@kevTM4tx2|M<$Nf@?FNOl3!ZISz8O(OLyPc1ACFr zk1MxtFGgq6{`q&OvbEwS@*$gN;CMeJ=X2l%=d(7^-+i||mjh*y-Tofv{>*KGLyAlC zwF$W}QvbsJv)9h6vwfD%gNhf{Hp6mZd3!;B{~$9StjY%!53m0p%fH|$Z`S{VirZbL zUFs;WSLNd&A53ksv{^owy5FwD2UEid><^}53G5H1?jf*0n7V_&{$Q#Vf&IZ$GXndA zsVfNV52k7n_{i&m`<#52TYF%CF!d8b7tQ&a!2V!rKY{(h)DAlcs{FZBP;u{PFF1Y! zsSZ27<8Gi{~3k*xmN ze)%ZpsEnGc=wiz;J&xJ87@@Lno^=CzIp(pr3U^~|Hptsi`7Hn${_=A6y38mkR~#f6 zt|IpEB44HmL zKD7tW>0M2i;@v~FfcM&vuFbn6B~|aN0{!RI&~H7KFO8Zv_vOQ2uaI7?O?)g{E|ZhS z+@_Us0kCh={^&3HYb&gvN_%DnRn}W&1y$ggv^&VJinBsYCs^uBSHeSbLkw5FHe zH|~;?)lTnRo^IbaE|lu_=cexWudgD%H6`DVV4KcsbOYv&?osK7TvyEPCcmWMZ09=Y`dtjpE^`J+<=DP_86%@krv35A zd-6WX{{DRZ%=ZE^i}V*8_H3`N%YC)wNVhE{+pK4f@c*gs7yk#XwtI7;19GAp$h+<= zDOLXZa;bdj-^`MZ4P;PCUGL15uM@jIbw^&Ox7xmrc=?(D7btr{{hU3$efoL6Jd&L) z3HG4Pof8r)tLZtLLt5EQ<*W{Ar%z-V%&(ur@{#)hPo=CorIP=ag?5F^v(5aouGVJH zcJR-tCr@1O739k`Y?EAGGSs@|Xm8$lyNJvA{$xux=m6I0|rcVyJHrqwyLKBmH!Wk{Q z-andcXLNFX>iR$mXqCAe>`uE(z0BJ!XIEF2y`>!4e<|RuqZ>ERb#t?1bI0#;)zss- zUBB#|chQ#m$DTjD@`+k#U&jvJr=R5lVZUYe>0UnMSug9?pUp7aM~i{}$nLLP^84j< z_pzVb$7SX=J+wNR_Z*d<+g?Aw=2J1GqWT>=7#Gtne}C^F~0s;_9*r9$vi6` zuih#nmU*_Sb8_a{Y8g#j{pB}h7>uL9hU zUt7hJm(+mr3M;k3Hs8LEmD=O>!7&%2C#AKBM+a4e<5$6y;3r+kWJ_h2g}nX zJpg5G9p6e(_i?$5n2u{-bZ9-L?0))h@plFIztP~H-`>%`gW%jIV`n-ggLZrczuy$( za=V6Du4*#HuXCMs{Vdj#%a5+L#(Ji@40}<47RmU^^-*RA%NgK$*Co3Zq`!Gk+)n15 z>4xVbWTzL&dVQelq^q0$hDFwM(nINcw8Lkkd^#N>|F|Qf<oVW@Q{sscu3FhUHxHRj#{!eJF513V5AmOJpri?lg7vV4GiA>u5(uZDpOda!3z>-MeT_dsfnlhsf0S z`hKxrPJo`;*UOtYAJ@s8h!E-Td#(en-hS?z<<(41x4aHpx@DX&fIZxU$p`K_dc{7Q_x2K(5h>@W3tF4P${UEAH?elNe*V_)XH_o9{VMU?JEh}jDrjx34G$K!(YUux(HP(B*= z^&?uF_-dQiarZRiRlmadBhA?7kF-+|BhSsDj+SKiBJXx&ckTIJAUA##8m5JuQpkSO zXTD*vG0*cwtUs2^%cD*Z_s8;q(Dv%V@`Wz_(MzcP`!+!ZvV2tG_@qjMUdN|V#q9?b z469UrM#b{QMPB;5gINO^ur zdHx#Bcb4Zj*iYR(zv^6d9P#wdmX=mNs{Y* zz8{q~yvD2eoeKLOR4}zt`I8mP7gR1kqf&WG-pqTopHr!Ph5ZSZvKQ{pY-!Qm$Ge{Q z{z!Mq_s8q?wxcxVn6EWsUQ$>4(AB}DGdxDM-w zYwnM?>bP(n_S(Lu|9^WvuNN1-K6t%0=*xn%A1Qt8DD8KV?gej3 z)iIJ^|F!3cTpD#HhpFO_^Tu+Iv}ZiOZ}i`{uj6UAzeJzd?K2KDwEsH`y~d$@KFev! zPR`dt%k4t4KwELX%5TN$tL+jgqMeQk@$F;pg=3{ucfVFXV>^1T-(L0qc6{Z6&Zgzl zILmzln=Ze8uaSH`NU|$>)z2@KQeN}%_qQv|cYC}pIzQ}j(fP4Q8j!~H?%gx)8?^sF z*)vqf{gVAZs!d$@e#4Qk?W`!D>F2K}o6C3dr0!%FI{kO!W64$WV(k}d``x|UZ?Gvq z%6eaK9NV zt@8Qqx~tkfkmY%Mo}53Q|Ni)E$L;HbcE=ol&Wnzc;9mQd*LiWiJ^OksujBV*-Vv&= zT^V=F$s98C>>R0+AydfDu|u9Y^bgFLS9p62^yN+Sv{YY5jNYt#)m`uZOooqRwkCa4 zp5)n{{eD8`x@<7Uv%#M7)*{4pC7aY=`2U+t1}1oIGha6_RyMG`rglQNZ0GwpPHIj+ zHZ5rk;0!6H-`@(9{R@`c_z1a03USqtk6|(z*hcxr~M1bAardB`5pamS4e+uPU!7vSH$Up8!q+>cr=kKqy z``+h&D>;7N=l`3YSu3xTG9L@FDwPkYSbk^4^5*5jp4x2-_5CZ^<=bz&)3b5i4|6lv zc5ff|*7CDOw(B{5oDX^~*rnUdV0KqB*8PpdZMRFY#(3w+ECDi?H2@BDnG-k zd`ZDY`*Xqm&zCx*L)?FEmbc;3&qMOi-MHZW*%B#NssEvpUjxlyK{87 z`^5RlUtvC6Fn%YczTCCF^*7}&*q$ZVh6}dW(LL>N>R+(E0I5H^i@Vo9Eg!7q|3CKL z2Ry3c>K|Xo1_B0m)u7QvUF)``5;YoV^O~TMgg>>hT@sSe3N>1^S4wTFn@Tlca5u>H zvY1v->I*Ga`qoygX$4)7Kg+)?Sk#E1DAcBw_T4q8XsHH7^ZR_x+`D^sv!PU9-}m=? zpXPaTckY=pXJ*cvIWu$S%-o5wvoqk!0?W?tBH&v5Uinly|N0+KeB>eK6KU;R4sx;S zLWk{}x7J7cm9i87lPAaKCuF)@^wkv5v6rX8R-S@B_+hd+%-Gh=G(LX)&zzx2Oe zg1oGIGQGZ;>9>*o^w_heINIr3MNiRp%ZabWmi5K&m!D+i+IFNTy2rpjW^`7mb*s1tGv04d=4da$8Z@Kw!quw ze!!?(E(219+8E(}kpJ_cpishwk4b{|YvVbSMr5B=CX|Q)7pvoO|yq4<|9^9ru4T?;>#lDf;9Yo z``emu=K6H8J}Z82)razsws^T)A`|wT2Eg_zgDvvJCk9 z)9@Q@__-PIyVCGmZ20@z`|!tVsucNYLmKS>2*uujWKtZhDN(9Dw!iu3a;8TQcf@{U zN_L98Cgy|fz)R~72bpRV%9&!LQGUnqDdpi%s^t=Y#tGq<6W>kz%T5U2NBlhE4?Q9L2IA)v|5eB$J7a=B z8Oz^De4Z|d{pN)5TZr!={_Q7(-$s1gKH!L5bwc>diH~n?IAUj|;IqF#rq;G29*#{# zuyKsS*&jD{l(6Pb&N($4H+RHdgPdaPeUEsz#@uiNgI%V|nCLVCYmT^zd&~D;;nCG75+p<}aNf8CxakWj&g) zeY?od66W-b*#nL*4~K|fM*Ige;is<;WzH@3g>s}(^I1nWQWu!@O3t?n)>Hz;Dx~yJ zAX@$N;IGsBCrpuyx7J_UL>4OBER?mL=rjK+LK>}#sIRU}mH)i8|ePfb6Q>8p|6J}*g;KP!DW z(zm*eOuhS8s?=PMcLFCV4}M1f17em&JjhYRKL5zP{+fm4sy(_uHa64D$0o1jr&T^{ z{7S7~GmCIbLeg89ak4$uv>@7Q6q#QSLYDL|!TRmkfAwkqHNiA|w+(-1Uwo^4_WG^$ zAWgcxMw`!aK4bQ<1pn78NXxItmfzIA`K@V7!!Nht7xuyLyS`5IzYyI~ux1gcq6t0V zkZKPf$j0{nlKio+*Hh#*+`xLK+7FhnmMbJ(|Le0xq|=rXbFJBtEPil5vK%D2KUsSqZohqE40G!bDYCSd~+xNM)9} z-jdI}wQYz^%JT{q>T_nH`qgjCS^h_edeoFytNbbavHByhZT)#A(``;jdYZgulBcA8 zZ%10yJ`q-`Y(={K_OCxzAt@Ot%t>zUc9PEFhgCb9<0boYivH?ieZwsG(6svYpWnL7 z`5j_@!GDsUV=(fIFuw;)iB92fpYpkhzm@ni((px|C`*(n$`WOYvP4!;mMBwrpNw}8 zg$VCc@IDpqBk*2`_Rs)p0Bky7MbZ|d)@*0(a6xfG$UG=QY~?S=M+#X|zKRf$l&_sE zk z_cO&nGoOCPBk(KXUzU{LE~HiR+XAAoW;5R;zoh^4Y2P;1?*Q|?$CUUKepvN0%ey?a zyfLP$M!LkEmx=w;z(J)`l)jnldP->$OW{mq!&68o925Y&YZMX+2i|Amy^%sf!GNGN z1Lg;87GR^+97Mi|D3K0VmJpP7Ry?qr46jNEN^-nn|L;@(2MuR#pRFf4iGP^* z-^_%MB8ohi{OU^OR}a&D)=bxL`?8GTLr94#+U4mOQ?K}WMtKU;NjDAOL3^3MAAEOT zd?)cM6Zn{)0w>wOau|Jsbi?F+R3Cm8A&r(x)XPlNQOmS(VC-yTQNqe{T&Cko!tCnT9 zA02N#KLQCM3+dz0a%2&k4tiNU9lKxcEKWa)`O8u<%2)6() zP2V*zRnW{QZM+S)^~Ik~{K*M??k8vfDWP8u{MeThh30xIFeUZceiDna|@+D=-_hEZ}+am=Uu^{>QlcBE$VlAyZY4*so$BNzYAVti~991 z&mX{Y%xX}-%?|zsy)9r``xz4CJhwpw=OgG*!379*o-PP&2zHTN(7T8Tu+$^SeOI3f zE=90W1(y^04?$RgV4Dg)f?z}iS0Z>w1=|tyyeGJ;5NuFEZpyW&Aa~u`RWO2JmkMr0 z(EYw7+m2wl3hqR(Q3X2@T&{w<5$se!ZbCU=gh$c2zf`1xT?jU+-~j}et02V7(WQbg zNIE@fLn>H~pr==oRU%lff)f#JRKY3)+f>kp;BqAzlM(Dx&?yMIQEg;A6+xd0 zHXzudg3}RLy`6{7w42sXe~5XIR}Tov3&Tovpjt_to((2Y~sz}<_W zPX+fQ*rtMA2u4)!0D_Jj!Hp3?1rHKI1rH&3NCgigSTsa%dk}0;!D9%vsh|T&Gopf= zu6L;*r{->4z=z^+>g`iO&Zb*bkW=G!738e9O9eTh^_(QhJP0NqJo@GIdHE8ic^kYxe9WU)2M=+zbsclPE8^z$O*_H732iN zgX5f_z)6Kq1vxEfQNacT+f|Umc&7?-_%3%zGLFIR2*&<$E-s1O%E1OR%E}b`FMWL}DHpN?R|L|J>(9$jbKTT{Yxwh#&g!Z(|>b)W48`!k7W!6VG zH+8hk`tYWvNXx8a-)UOgGV6nzn^v{VI(kFXZ(SS82NdrJ^jzdWZGPn!hg|8}FmNp2 zvI9qk-124zK-Q)0%-1gebyD8gL(^-s9BXFcv6dn1BAycH8SX#B7!cT;6WEl4ZNj(1 zL%{)-9G~7B>jcVMMx)cfodfvJBaY~n^8ot$asYRZ6Ni6Udv#LSto>lA{V?N)_)=Zd zKKP8gyH^Se-n3Y7z+^$x|EkG?sK3)Y;BjHWuN4bOwLdl(r?>7B zR=9%8P?MI+?rgfb<@N#NnzWYN2Uay*-*S7__@=3@C&xN@vrl%QXJFIU@P>f-R_=Og zEU0JU?vAkquBUD(%-Y=g-kb|qWiY>FK+|c)to-+*P7wF!ydQ;lIGWD5G7#~UK8KIO z0n5CoUpP21$0*Muuwz`#fY7L+S)Ij^tQYhqhhFRK-Y1vwckjNjjn_LA7<qmK6NA*Ga94Bz3TZ{WZ z5v~Av14ry#tsx}gT^5&O8CHw|he|cqXMKnTf;1C?^rrMx1vL9=w)E9&`l^NDPz$(t zf+J>9HFR&JYJfnx(C4*IIuPWYg2gN@B*^W()rqSH98Uq}0F1h?h}R;BVE)_^%==Bj z+~!|k3g$NdU8Z2VTAO-%dnuf**6&K_!<$^K*GcHucU-OY68ZqKS4-&V4X)M-g#HDA z&11sL?!-4y8Guf3wGNQbz$#bk`yUaOHQv?wCPJ1l41s=dweC|8(Gd!=gAk=BT&?Ty zBD!J*h51d_LSCysoCg*s`h184zSg(=*gc0#Dp$@+!Xv;U5Ey*}6|`qt&j; zS9^z-@k2!P20tIFP2&nv+XS|mZsLbp-y8hl)!9EhZ<{Hmx2ai2%6dD~G>5+@-K zrI-r%&uHy!9s-b}XHSm{|0C3)&BGE$+!SeRU@)h}%HNVJFXK@708^Z`kH$Dx>(8*0 zRQzUfZ|LX3q0>;k3&5ezql&oR3i8{F`CGm*OzsMJyc|gbKgz{mUV@>c`^<61hnxP} z8Q93Qj;5!J-&Baj`vO18cQg&d0*wnl{&in~>rD2(v66A#A(c8ldke|kz9|a^;k(fXgw1bp+pSU7oO4uUM{(C-xqFTa5S$% zd`gBwyZcrS(kLs-p_*Jj$>IvGodVb}*&;krtWilzAgT+6aSNp4uHe_Pl1*@{c9M3C z41yVmER*G5Xcy-N;fqlrW054P4{SYbJaeP#=Iw#k58dc$*b(@%i$6EI8h1E&+t-b* z@1J_3%fI`i?Q>g{=u&Gk*rNwn@{S!Gh4Up?2~8Z} zs#N8|N6;5K&%+WtcoHUa(0em2*}zp?kT#b1eztFIb+W{vg*iwvDYowgl>SL3*K)#U zb8C@r;q>Pw#Go6qVI;mzbKsi<(RmI~5`=QhQo5%em-_4^b#IdTwV?j(KGa76!K6-v z*D<=#xCAQ$yPx<|8hfBS3fI7fmyqJ{wRnMbq43jTG$ymSZ;JCXiWfWtlrUq};#&9v zf#OuW^E_=T3a_H58|qbzK-HQJNed@w4demkB_w^XJ~pjWc#I1|w!Ea&3Jf*UVAy+` zqK4*V zg0PQ_5D7C7NOo6FLMN&28t0^0^;8eZvOlJ$@+8p_O7F4EN4__W9?KI!X4aBz_ZLwK z09bIW6Vq zFbS?vv!QH#Ii|P;rp_LYx|n)O6*yju!je^fZ$bSeFv)ANmW~W$Qayo+uV6UsSxSKL z;weQ7;A(nNY>%h0$)x|{5zH6izv#@SE!bk6EEmUZtpUm_ zb~War@$o%aQY6-Ya}RP*%cg$xX}f_W#{{%U17;@g#@1nMf)Wh#6~iN?-gr6o5=KK_ zpmr`&vI3Rf+`4)-T#{G5SSykN>WR%XyY<-sv(1$dU}ED6?ogoQO^dICeYoV1T)@FL z4#DzirO@n?%w&5(L3D~xDc$RucenIM8!)STWGwLEKm0#{Xau&MB-m;tihcoI?bP;@ z4{SIHHEuJ`>= z(NLAK_@?TF)b-jy79s)}NTlLTd29$wCQ09mTPW=Go0bz=m=3*%(6ThBtF;l;L%Y<6 zg0kD>OEwMkaKWV5-<~m>=UMESu_3QO0(-^Hk{hbXb~YpmEa>(!*K3t1NbC*F5z;C{ zK55O2d^R=m#x__Plp!LyUmT8H$MNwGX#UAw@5A2z%yNX6PS0}a!}$pbefT0g5#xzw zw;?3Rb#JryNJe;U`RX2eW^8IUc`Q!N)K0Py}fFPbohRi}FM!81Kc84*uf@Jd@+07@&9r z6S_Rt*oNNCv!b!Hc3`gq7)naVd<1#BHMgVE=^l#5DY(EFKdzxf=pF9FlyUA>W`Miv z#XeJ4&-*F?cxVN_x7!-QDOC^NcvGuW+X)8XYx7gR?!UX-m3$UPAmZg#=>XzFE-+>l z(mMQ?@~kQPu>%BDX==5-AfX+=V@7uGaH0jadfITOBa2{)D#J4d2DqV{i8!*-4r$#$?oT^--dY!#0{6<)pNg|pB{y0Jvs7ZyYNktCH zrPm~2tI63?lO@1AQN%;@-%*iPIxwW`rZk3mo;NIa5=?2V)x8Vfwo7jKDeJ);O zG})}Ae>l5EN)PD7BJ~>&5d(&H>r0TY8Se&42l}ho#J#uT%FU*$#^u^bPrw6(sL&&E3oYtCO@^+=6Vj_df>bRUt`6eR+i+Y z1)A9x6tO@vuF!%AYfJD@6s(3ok1>Y^b9^_3OLcZNWfe!ZsM;Kr+MKOwb5v^MPOHrp zsSNr$Y`sla8N;P&yPC=#5@HeXW>@#ca*yE{MGU&k;TV(78Tq`H-_%;m= zE7pXCHAl&s$gwRbos2iN#zC0CcqRHPx?7*(G@5dZTDLJRPj7^f0Fr0S&NXWDjcEl& zlSiMGtNZfxDFu3?$C&LkYDXB;3XP^BeU?}EjnJnQ>WxLl>`_K-i7~CrXe!rdjnaK3 z`jj%gvD}zlY1B?Mrd1hDK7CfD?whDjsnQ#L#_Y*P?G$6$RHLaupEX(cP0^=J)f*d( z+0%_$&6qaRXlm4FP1k*zK4qrf*l5i58@02HY0bv!7BE4d<=1_)^eN4HJ710URF}r$ z`Ft*;0yb7tMeAY0^)|xwC4}qkgd6J@@wu4F)>ua78mpJ%sfP*I+X&Z}5U#f`$J1E9 zg3ra&{>HMEe6DWCQx6lax5=omgmAr`aAW-{J{O1iT(*wS)e$`PFyVR|;rbH7_4Wv! z#`>*%F5b@PvYmXc?!;3M6Rx)rt}h{6ZztSXznjm+d-+_ppU>4@cexUv2)pNo6=Ty~7l)tq4JVZ!w`!u2JD z>+OUa>$%V}7Q-(G__=(pcH^ms3D@bx1AM~ucEXMId3-L;=W`jYlg4Tfo_d&Yy^U~v z3E_G>;l_H}JB-D&AsEYOZ7^2T$ft)1*V_o!mk_SEi}7#$D1?p0C44TU!PHn?&e$;F zdK=;T62kR%!j1Knd@i2I=dvn3SNrhP!-VT?gzHNP*V_p<)=%bh@f1FnP33cS1D<-A zaJ`LieF@=uJK@Iq>3lBM_*^!V&()21>S4n5Hp2BKgzN2u8|(diE}q5bvSvP4x8SLV z3D?^Q*Ow3u`NtFT&*$R#d@ftS=jt{*A^&`~5f1t1vz>6rKc9=2@VRU$pR1SS3Hj%< zjc~|6pY4Q0{`p+|2%pPV^0~SlPsl%?ZG`Jf2#5UR3Hj%9ahT6#>-bz9!4vY&XB**= ze?Hp@hy3%ocsrlVcJjHp6HmxLpKXLg{`qVt9P-cS;=Oz>+t26fE<7Rse6|q|`RB8p zaL7NOi(`B)JILqiLwG{|`D`N`^3P{G;gEkm7x(bF>=>V`Iqir1BMkZHa|z*)f50LC zd@j!6b6GB*tHnnrOgQA9&n1LI{u#SIkI%*Vd@d{Cb2Tjkkbgeg2#5Uh*-kj*pU=g# z%|rhATumbiP9^Eaj_Xl%t&+wK9?{Ooq^B!Od4vLg{Ru2GRDQC<7CQ`9R@HuE*F{zL~=qm z9LB!YG;{7!nV3KSd%Rl&2K{@y`}cVF@A2;6BLuMStC>%~KGUG5t;c(iK8HX_nhm()YIE+y^oSJ0DVT{7z#3eHh zV-yajHJNc3qi{H%$&AAog~QoSW*o*S9L|L@<1j|yaHfRxigNVW=AO^z1j8N5Zm_COi_Sxb$ z17WGWtMcuDOy(S+yf22TzKF;d7%4SEWY(V6U2}#-vnitYp%9SKKv=5cFARjGy!gsp znA1Lo|4M~NzboLWm!p3`o-*7c+_+p`W| zZETw`z|q?ky{pV*8hlIdqQL8SQKa>|$U5_DZg-Jo`0CqTt0|&)SqzWfB{e|4 zeeAioAUp>jWajL(T5T1^^51|fowEG6THio~F^`2v?Y0qg$ZWGiW}Dqs(2xoCr;Phq z)(o9{XmlQ9_-EYDnqv1YN;mr6b|RYHHX7I<%n0QT z2vrS`j=3YSLF zd>pU*J{<_H$xk2kP0C(Yg21v4lJ@(uMM;7c2@*8NNrrfC-EBC zAjNhCm&l9Azu!#59vtSQ+og!GM~3-G?T4e*p&#adRr;Y#wsnzUeI8|0pGRJp{cs+6 zfPOfS6^qWZcpIH(aWFbh%7KiqdyMV9qz(yFk#x5x0QE?ikN8Ze1qGuzkuOWdrzBw1 zDq%k2m0}{tGPAB8pKm-5CT97_^mDJvKDGMd`Eq=PSZm~C79SH)x!7YSf_&PX2-Y{k z{fxa=V%3-JwB>}%HX%Zxdh36zG0jnTID?n zLV^vye8k}=FZrVtpjl>k>SE`i7~L0QA0F6)6*kd)Y3L(N^ml(P6|L(X?ZelrdWW~m zX7&m2_KVg%ttcEmMva!dV(cv{VUCwbiH`4!x zAIH+bbfz7J()fCZ&%~<%FBreK1>aCT7cq5OCB^OFpW(OM5nKH@lpWOBv>dSJBe=({ z5P(0|cv;aud=G^~zPn|Sp4mU?StR{qkY2kSA>%nkqitay8Y}y!5hjhRNn^i_Mpa)L z2l}URm^6lvM!|+;Idb~aC`5EWY$`!iY+Dy-OtsP28tPLQt$!M`NMkN(EVt2U=}Ti} z|1{Q-#u(B#V53n68p2(p9EaTe=ep`6e|KFF!3_iy6Zsm~-(9Cvda<=ki9y59$hDj& z4x!<9E)XdtP#>KKXBFwcIHS`Mn}p*H6ro&nM8@W)#6E#>gk2x<1})MC;nceB#~%0S z0t+p?{OAD3!;uHDJKeYha$1Ftltr`Y-$KM_wj1vbphUBC5$*W^hg`q*D~MmGF^ov9 zyTU%eT;n>8xg0O_A9MVOjRXohhU+2XL|d$pWaA++B^o=pQlifc=WYbMUX!i_p=9vnF>fB%}>?G>R(Xb-TjMG zF>j!DpvmOi!?DHOM|B0;RGhXBTZ5JZKk`!0-q8zCdX2Y6^maZ(k0WC^6UH9f7hutBV(^cN%lcAv1v|}18|8+A6{9@6&Q*xSM=+(AaP#b4`)~SM0zl2X^#LR?v-`13s$gTkPK&C@9?SU zLt!?`+^v-u0%Xc!uQmrJ&4FPiR`VyzPx3UWwNqQgTxPyTf3HMp_8>{a2G;fy<18dZ zX1$}?SgJRowXmt4Y(7`86epgL);D8-=8PcGUqKd$v`W6jUQsVo__9x4(7oXpo3Hr^ z+D;H$T?fpetFg9}uvLKZyc<5i%PMpdw%nv6MDLTA9L>E61B~gY5?_TwMoc56FF;Ie zDhd)`CSbE>lrL4Ya#hIQ(d1a7W@FgmN#St?*Q?Y%5d~GfLH6nmF^eVDJGPf4P~U+{ z*6?qD&P5GL+E&Tu0Zy;v(?Y=H+;8P2t&$g-m6VD|C2#v9DtWpB*J~45@96}+E+D5i zlaOjct`~^O3HAxai7z2e+Bm_91SR{A3eu^ zc6c2yC=#jxcM|`3;Ky$R1z~pgp93cH7m~T0=evJWqe~n!#_SrwEL1VNU0%l|yG`dVBm^x_uSV8+8G-f@bRN+^F2hHy8Z_wbm zuYL!O7mx}KjX@&^gT@{iG;jk=>Y(B7Z_ps=;|&^I_kE;VKXZ$ zAzE0n5HPJwHkSq*A9tc_z~`JZ?~pG?A0ETXF*Gq( zAJ)SF9Lt91U>O;jn5PfRXTX;qh!p6GAbN~(Qt~8D9`Ja~>n(SNoO_rM z_O{co_Ba~o==nNUAon5%IJ>?hm?UD-)vB&G-CS|xrSeJ(k3Au;YBuOrgfPm->!#Fa4j4a~GnCO~JGLEi1iF%)p1BVVvUZ z0Rwvr>R{csUI+U+zwqt}iR)STJVZ&0M|-{onOb%cTKv7Hca%9Wy>+dYe%Xn2p&|?a z>k-DG;)rlWpBKJ&kYoP5b$Ev487=R*6gepNZde7lW6lk@T&EdVJ5R+`&#&?WsKy%= zq2|#}BdT9p5WD7jj#RnY5|nI)c}&N6KD=kj(lOP zUSCl9Gg59|0~g+WeDop@w^F#HQWn-cuoZ6EmcQ=*czGYa?o%zVx)10LT*$F4R-TfT z>ILub6V_z?F|g&>``u*92j`A_ajag810lSt2ir-Wn|6_Fp`e?KpFoM@PHZqW40bxO zs)lTD!KlnPSpWEDG0JLR$cxw54#hCrn9J6MrTaRZs0Wve-&2ieyb@?W$LW~!<r+y?_i&NJzR(0G%=0CVIfF_k|3|sMs3Myg%-tl}yw?0zd-Zvm-%gzG z{7=;XpV2S-g!IYZLo^$3Zf9(c-Ln`!IAYl(_dHR38zRbJ{59w~WPERu@m~hxF9|KW z++_Ucafs!!V0=x2@h2;`UoLF#{+yyUZf;a~5o=!mudp2c*yi_`2B3^bQEVK>rI#WU zgLz~xh6${@UTeS-T-NWt*bF#W1-814h0;DdTnlF*0Y1$9Ehp^4`3U3eUmoejU>fG! z*?8aR;pH<6Pvgs1%dmHgO9psaJ_mq09KaWK!WlAd0%$#zSl#izNl(uW851#RSh&^+ zWrZ0dgS+GF6sCpK`$Q#Dq>$u+VIXoB2Q|YHx?Ia^KG%o0oJpx^JS>L6Gz(M(x(%I` zHS5>?HB|}B&ux{+w{k3ium7ZeQs!B3JG}{Ww@Bly6YjYdbYf0uY=hGOEWY>$X2{8L zCDOSl6i2T#uQRABdwmjo++DOgL=+^xH*kNue}Fi4h0$C!r0b`8Sj5hp!SX_0NiJV z6`dRE@F?a%h7zecr(q)2j8k&{p<|_|m%h;acIkZ_6I{Vou%PsXromV0f_>8)PMh1UoSK+)@w%SUoF%}Lil-M5n8{x_bF1>G#aRWztfsy;C=?Ql8M$w|5Clp z`CLN1eWrK^Yg>YT5A9Y`ik@Dyf^}FAyXXuTKZAa7bntxF_}J(>6=cDR+bcD z9?`2%64dsQ2JSQAeBqFBzp#3jYvF&Ruz{ma*MhwW$XC-1T;=fgu0Yo@y}*mh9p1qI z*^y@kViWS_O~?#)tu%Hyps}1cx_%fjUb(58Er7^Xqjyf1z=F|B1#v-0$^*@pKsp8*J?0p&`IdvFFT1La>Kj-sHQAYPqwCf`I!lk-@?Q6* zVodG3H!8R}5G2O~%wWr4Loj+mk8`4ff%$!?Y_5MN5xfnTm;BfL)Eqh5)a3)sla;g> zyMiAmOG2%-f)a2jD$60Y16RBc6k6ZLGC>;9c$r&hpcksbt&B^(g$P1X@{lPHN$0Ag zj&jSSsYqPG6-bP8??f$qK%_r(02zka-GS-;bgVE?JXz=ha%bG9o{Ohe;s!5s?oT~Yk@8Y(}{z<3Pmb#^q8?yzSN3S zt0d|FDt9T_oVD6^HvQ+evFY9MKcOJ1SQTn+Tlz|Kz@(B&BB?QX>CGZkFtCx;am>MI zlFTZYpNBQxuxj!yn83P)rjDUre*ViMr>*;t>v%IinKm`Q++Sv>s9C${*bxvWN9dj^ zsIW=eF;?RuR0GkJxUq8;zuD&?x+1R+sNUrqm)vB&5(|6OkI~4I;tXM~snxomFk*k& zYU>b~$$UY&0&X|}nv80|1s{1Hx>hULh7{jJ7wTSyL0YTi>$mv&47kCAy{T2g4GIK8 z6waltd(o66<0?<-SG}%K9f6x;f2@@PnX3=vm5Ve=uPdT5+cy3%^7*tyNKHZf1&qVV z0V}>a^>sX6g%AqcYppkNm7X?}1^;D-mG)$mkwdnv&N;Q(5+b$qkAxdT6*uFLAs_pB zWBH!(R`e31N7Pa1=TutB3#VMc#o3~)YP9XldCk*LJcgW7#-`yizB`QH9*fNC~#SpYe5yDh=V>dwXf9GQZnzl z7M#ZpW>#30GO5ulP4+D;3+kO_*&%EzLET~!R|l*c99P_s_712sN3l|8qmlPGb5i^` zRSs@HREhh`5Z8^d-IQr0CRQoaNHvfKA47fBG*Si;wWL;)z{zK@$m|9k zV=k|ugceLC~b*=O_#jJH#=pJT`^gjH!#=TIjl=w{>dwa)0 zD^(=5bOCIKU?Dp@#J#pgJ4Dq`4n*LYXt))09x^ah^iH7KR5UZJQ7ZbGP0-29rMRi8 z58^|#xtm$5YOSyXSu6u`oVS@^c5h1KWmBaPJ`-J40#{2B{br({33O0aBfwNbG=X5c zy~@kMO3k;&B1VZE=i71K)Cm!z7-SR{j29vzuHZHdS+3x24qQs$Ic8LOi(H{7bZy{v zZxOq5ab9cLPoV$H2d{ZhOG#mR#sX!BX< z-6vf+ceAVvwl}|3YN%D>XyjYEy=ic{E>v!MhY08?5oDrzxxd)iF&^D}ytz(99Lg11 zDJUcNgnrA?8rwR?0a$furGE7>t4nW1gfyihG>_tr2{Wi~P4wdh-WA9R&4FHzfc~`+ zdR?I$Uq`=g)=!R(m);y3R-#m1-9TUu=ae^aG`r~{qpl1#uv3fVnwhYv3%G z9WME;+LW%<3Zr1)*VdpfP6`|y)HJ$plJnA&OlOkMAPJg(`qiL!M&R-+S8yNniipZ0 z#(xl2y)Vp{x8$Wv+l?1(KOYD1nBml7{28nj?7@#)JII*Bd>kX(rA3~=&p<6_J81j{ zG>Uf^_fe5!{(;f*YtX$I8E$pr0Nco>d9rx<%yp-#}<**dd2DAoS&%A?b5_x++ zTSGA&0fNin-Hjk31uWIai4XFzI)~=BID%^iE9C1EXdQCPKx}nA8l@7Sjx*m|r^x$E z>wWY$jxdty%j-hHw(Q1{@CY$skWTISFS z)iVZT^;a-yhP(HclX`DCE!6BCQ$NGi`@;h8s+_!<^As8fRy6P-R68JWc{WZW^x|tU z#*fLp3bQY~>RRv;^%J;<>w<)7Q0kMkStL;k683H+E!)PJ^AJP5DlMBQFQ2SsJD)^W z@7Y_niY>b%RN+i-RpW?Q0Pz)))ONiuL%ZIW(yle=39jH(NNBd}6{OLpUAL%q<$Pb- z)qH=f&TL2XeVS_bnFh)FFEzF#+V$@$W|oRMB@yF^y@Hr-w`$oT@`D^^v2D?`<@hg2 zHt%F_K{cDVsP~ppX!0@DXx>{B&HMA!Xo1pfG%eb7JamId{!iGpmJ#r%Yr!tIZL(eK zRJ(o~Y0a@YRYS(#f*Z(M3LJXHb;21-+T+78>WBceQvf_55%*v!&=2-g9R9ZEPO^pr zF>CFEz5t2jNK0jpj_1=3kmk-+sp6*W$y^=4g1DDk2gcK^A8u~Pjm+rtFm_!ormp;Q z{}--Q60Hng&s&E49CS5`FsaBK1S|Bva+=8P>C_*y~iS7*uu_YB(zVNZ^I zu*IK|(XQ!_YKsEH$F;Bty%}ge8)kv8gcgld_V&=Ik^WND7Ioy*JUO6w0v{c71uuf= zsXVN~Dp5ph>tmaYL_N*Fw3X$bj#ht0h3%tNoJ7> zQ8V}kngMlqF*Yb5Lzpax?MvZ#KtOZWDEpibvYMFhs-^I27$l@uiG7Y%4AVX*hB@21 z7#9gyvl}eJkjh#VFD8Zmmn?E{?k5{)k-O3fYZN1w3Bj5n9?hnmAcs?{bkdS`oL7_(W#EGwY7#QY9u z#4oTf18WJHq?UMM3(Um9q)D)yL+B!9HN47$5Sdka73_j^Cc{dUG-8n}g+0mDT`r+? zv%&O*W>#x;Cpq@Bx+7lvDo|DJ$33?=y@_qFzd!EU@AltY$Xxr0wwg&!T@QG=;jl&- z4ksY0`wuRDwn~k+`>`wyg=q+c<)RZW=(oG^18SlZ&EZn^EVg6r1bDqN50*XNM<-^Z zMwpCq1^P5(*MYf+qGj0#v5<${CCpa++6dPH>wm>Y_^D^a$w#F(&y*BZa{xRTd6{?Y zOBeuB)Z+(~ihgW_5inM4gkr`0r#8X{Ohhu-2uUVXDKMD2N-xIN71;$3`d> zUgc#eZA#AE?MT=NnG=kIL`L^hc4^oMnF@9e59}TMjKKbLlvcd~d0V>t=Tur^Ba~E% z2DEBwhOiMb3;vy;jqr~c%^!o zs^0$%lpt&{(X@I?a-Z3knEjqr^a?T8&+OzKzfp z5Tdxo*ApWZ(Q8M15Qr4UxZF(?wTQVtpCs0_KmG#@JkbeW6v_d7VS*I7`?|oLBOFcF zz%tZa2c8?z83Wc3%cO%eEMn}>FrQnMbhS2sTKpV544jyb{SxzaH0RtX#lVO2IBYh@ zO2kSQ72`|aaV=QFu~G2@g4?$*K`dA*oY<_MREvQ}EB^zi9DO7)qVGqn&1g*Cm?QdP z$WMGh=5Y{N5;Mhad;{^P0v}}`GG5B=gEk_b66I=TFdjp^T+Vh_%Z&;%QOmuo?eD~26dH^&6vuINeAr!0n52;LY&Oy0Q{d$2AlR1Z_0ACsTr!+snNd@R= zBE4TmW|9!~vTZ=tD~qxhHIY$12c1GyiPMW%F5sM1B$_JSzRc?ywkvxR{8TQ0a}ZYD za1JW)!b#^ysPb}Wpk$E$jD#(!`5+v9obcE{Zt%cuW>1rGpnJdio*Mm4=1bSxF=vc; z8j>75jPOmeP~|yJFlT`ORAZ0yv)DnV7tbEc+2}~~E2a}s|Na~E*&B|w;vC-^TDQVQ zsI=>An|!egSC9>#%*+*k7%bbNJZ6d`R6gH8?}H9&L9WGb;`3e2aDFomiG}O)h=Q$S zNa-DguGTa0l48a@QFE90z$r84VAAN%-1XL26r|ES(=g3j8!F`8Z@u4KDesMa&0WrM z5|hE)^#;-$*W8uCnt2)wnxQ`CuJ&J`JHXr>sv7{Sm#gyK-k|VINtd<5_l9c$x7ML? z$WNmKoziF8GQST3bGOouQnX4xW~;Z6I_Zzj%U(yopMI}a4k4(Ejr=8Ot3io&m`kyK ztMYmwhnQ2qiK)QoHeL-hU+m2GUsz#!QSNPi3&r-rF5-cG1dg}4leDQq>@^XmBKngW zlP@lZdFu~!-Q1udmY$r(H}i}cZsV$4V{DF5?ZmzU&n2N zlVRms@ckI~_qtkNeKp4OlCkjRFR9joK%mta9jgSQKMI8?ihWzM_86_~O0pDE^MAQs z#TXhLj|mZ)^km~ICmbwuL^J5)ozg4q{saFizW9s5HPmn!b*#|I{vl8}$`)c~YJ5E< zOEw`dpOEr_-EQ6IOt>MZzw>LB<>KKEs%m15@g@0v!+#df=FWrb>Ry~e{k%~DN>O|y z8Xh_PT^*Qsn?Y}P8I+Yxmp z(<#^3sF`j&PNOuxYBgv%&)?-4F{^I)Cfb}~5Ap1EXyOG<2L9^1m188RExL2J=%3p~?~X zrlUJ>)YFvP;c!e;VgKR4(INh~nFcE|-1lH&tAb%h57ROvOifdI&c_${dP@CrP&bTC zE9Hb=x~)$_6v&p?ia)@VyH15#;}Ltr!761+wgemcJ zy13D*7UG8$euxoo~p@i{a@EI zYXWi5pA@T^u9{$j;+JfApW=}#EQBe?f0&dk zxQ;8M(B2`6>ZI7BZ%grwEuqCy{Z%s{qT@!e+lzQc$2nM~ZzMmLt@OV+USwfvag7lm zMal-wQ#o2nurBxjXYRxm#G8n%E#!8na_yxWPL2 zwsKzGwtO$vxL;k&HEwtvxxQNIX}FgKLz0f{23lT$e)v;nD8Yb z1Y_?>f8nPx3bf^~0Pv4x*1|^}8jvv#_(X8xtYd8VaS+Oh@WgQtnu+j}ObGIQ&AA5` zT!Ic5Gx#Z3*TVb3bYrow68i60Hu!cK82EPvW|Nh>8Cq|$^7raRv9dbJO0*+j)v>3q zlZHjgiy?Ea;B*X!7|v?sDkR%c!}5)g!-ayJi)$;k7Qwcv5jZ1DItB)lb1_Hl0(|bD z9f$Bd;%Gth4P8s5_%Sr4gs^qUV~$F+Ed_TmVqw)`#HVEtbp>z2;0D!&%9Zhb*=77f`{+8i1r$B1?eHucY^d20YqN0#fYloxy&Vm*H`3aFc|Xv@dKjNYxh!$6tA z;nIr69FDHOX!KX0@}X{j2)fM!8h|PZ@Vkq-u5YfqA z&!;D!A#{R-eBu;DAK`SXsz5mN`Vr2eeuVQ>OE^D-D9V?5T@c9D@1VNHyW$P_Ap(2& zeiNbTPu+hN2CAcN4oHpaA;vWF(;dH+qGKldm6-_BHIRxoV!@d)?bpq;4?^yY7pVz6 z{b>S3e0rP?+BpqPfXwk7;6G$IGIl1A>?ENWeE8?fi%k5 zR~fcW0=EIK2WP^cxJQdX^C@2d^!9Nz+Sa5d#QjjQhv6NEc1G7R)gypf`D2IyeV7y1 zO87B^p(MO*EQPS)a1hw$?5D;ua%=zN&Wm8 z1Ksv>9DK&e*mF{t@v3Y!T30Hm&EK>tm`=u>O2)qi-&RXaJFnlga@IUq1Xu7!s7j62 zlbU|~iKqV$N$-3%F-)OGu|X%Eo~|XF&a-`_{ox;5a2}-cs1d8rILQARo_ZVumwLCN zW59}?GRS*jj_v|{?&~th9~DNs!bF<8wFrbU5^VWD9_fc-;7w>!Y;!|-Vdj%;0*>@s z;L*rhF7nPqZL0f>^ozXn(`z|6EF*oM)w$cz6F8f_Yk_icD2p`598nKZz$SoraS_@Y8tp&P;a@vH3)fu zrCdI&4ut|qGLEYGj?7a()k#1r%8(G|l^Gthk;Qxsn6?1pr#a1y%!CpptDQ3I=v0)7h zr40>ua7Sc~8yZV(iX1hfFpUZW(cI@5Cj~lk0$Xx$;{R{l8o^!F=H>|16!u66l$oUk zPi-G%55s|I>?h304qV~5b7<0B!O>7`ASox-aYaCBR`UgcE3%qDXG|yq5)A&mjrqN| zBu=FdlN>E03l^f_l|zmQgv40m!?GVB%g4>%Y5XT=(#DJOeezFdsv=(-{c;Ll-NIM+ zS8q$Q)D`3%(1wd_jgqaegM)6A>>^a*(<+&cqbE9jW}q=OJ*kHaZ{d{q`3R}20M2-cLS?jGa0y4Wn-7RYh&cK{O>n}8$)1OPDm znM!O~ZGOx3;s7ioK9SX?e6oy7Nvq8j3#_TIWwlY+Zp|?bNtzE@DwYqlWQCHEK}LRH zq(&;c;3UoQDk5J)<3vUyy1FOiJKiy;TSGlCaDt7Ib+b*RYZXI)dQRR9FxUjq(NE8uI52}>^A13JU@yfN-h-xke!VS4aEIwqD-*1h@1i`=`U^L zZ<9AVnBr}tQ27`reC2LCAC*~g6RY!!Uw=X-{#-g+(#vE%3;dv-fr+X6wb;;twtL5@ z_XdvQK#~vBTV6>KoFIYhrqkK^qB!G?&i4VjI{Kz;!4AgBCs*s$kRmFM=TKMUZmMne zMLOS!;<%52J83uM-S{mVO}intnDEk9aj4-i7PwmSfn-8){09}smf4q5ah#S^9MY*+ zl8lWfWei*a{jr^Lo~%NNSwtTCXSHI3Q5Kf@MgT1RL9z)M-_GW_^3hM&JPsd=0juwA zroE{blAvmn&>tz;KF@5!lI_!CY##Hp7@NQJv>2N&ep-ypBc2vx^LbB;vH7g0#n^lr zq|P)p>t9DT_e$fM=ChYb*S%7zGZ9y6z=&PMpG(5q*+^QoV}-84jOd$l6%=v3e1yF0gGZSi|9CaPtHkjMLyu<_i5c?h`U9;6#_@ zKN-pwd*;x}tt+5d*bnc$PQ*4R^aQ)ijDc!DQ?DqYsNRC4XbLTcMlrY9#k=@C6Mh)* z-djtoS@FQ$PGa*O)+E#wTnjfVzp37|R#9_24?*}`t0mbOt5HXG;!zuzz$m%rjLS}MIxD!# zf9gH;11_r@&~$PjIxx^NFu1Gf0IrG2{!ApWeE{m%x&VxLNX}&T42P8)4MC_EW_IzX zaRq;h+XU5Ay37^)0bW?gGURX7QC1FTNa0#gA>WLFy}R)BX4kzVfUG`BkFu#*$rq?x z28XG!yK~J6NtnZcRGzA4sxm@9JrSg!&YI9^15a0}mw|ji?mm0&*!FV;A4fkR%luyN z49^U6R~pP>d9)ZVwydk|eHk)=>|L$2Ea1A-a*)3o>5K~O1V<~qz5$Y>SCN{LH^XZ4 znp{?{(mN4%-1-h-m+c8^RGhJ39%>oaT459~)#h@ONGq0kTL`H=h^r}Gb zRY(5J`X!Nl4$&E6M{O4v1z^icA^uyM%ZC90M8n(GekW zn8@@tx_cXQdmD3l8=ZC9RCb!8I};NFQ`8_fkFr5=tx1p=&&{=WD-^0$+e-M8glD1t zG9gikRZ78$5$7ksQ8!SW>c7xXTIAOv2u@!#TW;M(dQ)M*e-%;D3LKASM*&AcIa*Q1 zSF0nanadwJmQ4Nq#~n+|G3u`qh3#tE?5ol8I#J@T7OS?9dt1#g>yW&MA7I{lRo)+C zGu9l(Zc=$Cr}bJQUu#%a9L1UG$zHEM_E@M2zH0;Zu}*z#PW2>hG72loP?(3y=^$@q zKrQiAOI+_Irrv~?5M0`-ydz4t-#N1>7cOUoa8mW&*-*OOwcugY5iW0DLYux&`qJ$4 zAt=f!pfqh!wHDzZJ7l&DvhhFT+-Ws5;iTS6>y$FKRB*#SpuOHqG*5gj(E3v9BFdc* zxWsThocSY15xCwW$+K2#*blsVg(ue#CrFtnC=^jf0j2wiz#VxGTq1}CY2c1rg#IF- ze1u++kQ1TjCFDkE8$Ym5-Zz@i7J+v*>dy_?(C6b@uqaC-MP&1DFNnSuuV#3emn%IjLJ$&)%VGDcOA{ExUF^#s_7{E;s(t`^*lLiHzChGCMVOh<5<9&z0VZQK$tz z2eFCBM@{j08+g14T#^3Py$8}~ujhT79PteLL;Us!Ge@J%$TN?1$9KLb?BX;;**)WH z1>)2q%;wLxTiLi+Jkd+>oQ&;vA7@j@=+cMO=U4pb2WoO+NHrvU(bN!seo$ID|*CHnP^N-M+EkIMu?NWm@B}LG?pSO}HZeC9`ljBcF{}9sK zn(19Mtkq2EcfBVPMwqddns80ugcnE&e05d@9lMb15+qBECh%5s#P3X`+?^P+yE$er zfVuMHnc~bbdv$s0e4&g5XrEu*ct=G?8UwJd>*S{RD5F{IM`b1EjlMlG-NC^f1*n752VS^XE|rh+sZ@3=lT z-V~B0bYU6=KB8r`FiK$Ugwy%9^`c zcOx5PF|`iP(lkN!=uIUu#ZZMd7Mq$c>8o$l;#M3xN^M@+dv4l$e%d>{|5MVtQ{KUi zP_1)DZe2CXqc?d`Aib$fZz|VUvzYp7mPq=)V7l>zG?T;X`%~ZkH70PCXwjxGQFqdo zge^Mgk*M;#jE?i7{&0@?K5=Gk8fz(UP_tFoojW^2(|kb zI7r#;Y__};+F=N@?@`%*jP;SJ9loNnPrAuXOk}OrNA|4yj%cfC5!M{LQDzqs#@8IP z#-S4#(WI}Vn-?YCBJv6HBKgTTc7Ws?`$6)J*5AZipZ$)zWddejWf^yi3QPe_fDK7hm}#+`fK^b+ zJ13~g*}gFWR;!eE9I;7xcc;9|_E1{;$$jgGj6vMn3f_z6p!rWOTBI3gjsUX!KT25o z&tw~p-12b;RMVVsI+P@PY=;b}b)rXOr{Eq&dyhqN;fyf81aV_#r?WV>I5H#Grw>hD zsfp}!mc72f*sF&5cVeZ>&{^=IEm!b)GH-T4=^X{G;D55A?-=E1`X0HTBmjgUS1_r59Lk=S-84)`GC6rg zqO=tkC|hxIv)9vwu6QzQBzULyhc}ao?r&IFE4(xM!)qbE4GBCMg%kNE`=@oj3rFf` zgU`lMIgD*9k%>>+i|34C+A8K4#2ug3DrcPyJ`-?Qk&LWF5Am>vT;1^rd&prh)TeE= zwSFB4(B7zr+M+TTIlr~NgVuPJ6?r73#c@;7k&}h^rxt_ zNFh>SA8#UmE(lNN&-vl${3%d-;kK+ARaU&Z&Zo@+j+NDIX<5-TKxI|Ttgga-Dke1l zN>G zSHlkV-?#&xbof60{hj#VbffEK{Jy;T#W!AzweD&f1Q9r^`!v_OU9NQzzq7RS&cRc% zHf3$@KIxm-K^rth)FW`RV3DZRR@n-(6lOX|k=jrBom%W@5g^3wLQFVvH@+;qJcw<& znw;V{OE>-SD>!+72o6zh`18IJDEqm?f4;G0Qx{A$Phgv^eI-!kQ}o(y(zskvA6Fqb zp*B(~efPE~PEm6UrB>TdtbAh8QXD+TEWlxc2c#7s@Aw5MgsGxW0oH$8s@H!3a$iDD z4-kt6>Y#zu0~$sfL2wJe;iCEAKo{6x)Z`w&0Ez<#fokJGSy}-|DTM=N%;|I~0PNzy z9t<@sz+{4ZuTL#N{_zW-IFMF=r$GY^oZvv80?cGii-~my%<;h+%mU0Ocn%BT`3X2s z4mKDy&f^zAai9vQHV#~tRsd2;;lNVnlqUtiE$T8)B?DVUjW5{v;wRF z4Lb+=6ksQFx(`^&8c`CjRP& z3gRc^FN91mA#H@bK*%brckP0CsqlEglW%lNPx{}%_At9 zoQ!l;ZUVEm5Y|o@Jy&e7RfN%v#RgkP7=2o7u&spA!Nmq^fP0D@t+c^*5|6GgNthff zHzxtXLP{Bm!-01Xg?>RO{#vw~N!f|oyURd7Eu;%p?D(V7E<(S^na zJ4hJ)X-t?n)vyTSR%5Z|FtO-hV@r9AFs`?fFnd+jj7+b}uS^K0eJuaP5x9Y(CU9gx zQy#hRguz9oAr`qK1Dnn<$}tz2b0gyYW0I4RZ&{=PE&+IwT0u@og4g721U1f1ENWzE z4zh@yXJIj&u-IimPztw{0)4|wm*h8H&F=n-V)pRyWcH(-!t5gh;8=~q4w0#baO_Cd z+I$kC%b%-qv#_%e02P_Q=k&+IA0-*v@XPz+bDm`3R}!C2gckiNeetK;@EeFvZ$k@z zRuX@03nS@+Xhxz@q$y1^)LSq-O1?Bq%?EC5zX`FHv11MEdI4P} z<7Zzlpu;k(5< z#XZeQ_%&UCRv?&g0kUp?I3X7xo~AL?U!g44c#{n5FnRh2s86@9Idu)6j?TEdUkHp5 zeRuak0O~crbdT)rS9%LdK@Pk7dt3`1fqY}>$>UoE*xldM@9zG{X;k{|_#g}rSV@#s zD;I#?qDlCcz@xB=YqGoV6f{r#PZ%|TmF6cPyZaAaE0h%fxx25{cg8hky~RSxr*`*$ zr0}Ta6(bV#Qn&ag0k8YF*bTFsn`JkwRHcsp4h89FH|!=E*%Cg{vK!_^GF388g_C(( z7J-W_i$KC9ME10v{g##Nw3KAZ9?;o;YT4Mj_ry|Ptai6*t$NDtRt?gkT~wL5yOk`n z%KUj5A60)XgG22bfsHiWV1~09MuEUa+G_CP;|q2;#8K=v<)EkTF6ohVp0ta5*Rf7@%7fDVu{=z3C_hsTD^tICv4K z+3N-RU%7ilV_TBKI@yS^yNK1BE@DFAFs*0Ph=U83K;a^x0NWEOaPQm|9H=Oyx`@@A zE@DC?Mk3gPaaf6r33L%FK;oHzGM1l!=XS()kWBb=)tfG2LgXOP4p4*LNf)tq6<AvtpK|Ksj$;G-(8{_)*plPs`s7hEuClvr0y zB(+4b0tp&038+ECOA-{cSd~V~qZIA}`tY*x?gF>hwX|Zbt!=exAKTh$D~30Vd4X&| ztHBo#u{GigciE@`Y~Dcj_x;YjcXtzBr2Y5z`G1}te6sh>+?g|H&N*}D%*>e?E0Z>f zE@FAeY)34=wgS|NKui}g0R%2$@^a!MUki)Qat)hQWU8A&b8aZ%s4bkk4$ZP;o6}qr zFEimvkIlD1S?RL*{;aIbwE6y^taR9X&nPS1Hs7xyOO`LYaHEONL@QN+pB0<%q*;ps zpnpc0o-_zSqI-F_+=IBtwIaT+cT1H!at=PAW{C;f@Fc^NX0QRtDly?tbAIm)k)Zb(}#3qvMs_B0g{-N@UQvkW`IKXiH!-I+p|T$*W{E5FPlwBDcEYXyD!BW z2#Cy};fL}lVZATnd!Yr-mnu)>d3-o2ZofAmS!_-C+Dz(Q;`kFwyoe=Ubn+6Nk*=d; zE3}2dRwA0jR-?K)(j*Zk;c>GQgkW`r3(RsORovs|kN6m=7LmO?QK~W{SBpY9-AxA{ zp(v9IH9T%E>s@FjY+Zw~70HD*iNT#KUg#JW`ezZ@yHJ;KoD#bEq=mW!W0x?exo(!| z_NTjzH!HdYWs}@)=8G89?PgxQEV|t!siEGj z39|F3SeQ7S*G;-nRBx}FLtQN2Q7yb~j#XMU>s?yh{!QMWMyFNbYcBi)3^jn5A~aAq zQPVfT=Q4Gyxe?11Hy?zbz(euUEEQ{{GpYa06O4{LPV3H$=d!3Tav8+m)qDJi%>zzc zD7xHj2gk)sKgF3;bl%#il~Cq~=}R!ffa3?8IE=5ttyZv4yfx{-IWx6sPjE!ne#M*B ze)Mtk?CLNa`j-umYNc_;AS{g=ae|zB^@?h(zFr@ZTE7c@*pduEhiD}uWzq5rZ^ROf%-DQH>v56;wuiig;7=AkE49xK?ncyP$$ zXI{1V(Kcp#v^`uZny9jkmuXv!GReUEZU0x{%hM{GwFzL%iiui3cyqu&=c$oe54VAG zOrS-;pOB-rDl|KYodwp8P}y5rAbYcxaU*CZ$mRjbO!E+%Km^Nk#Af46EG?Ozm2HSJ zr)vU8WSk#Qis?9d(hVOGtpu~VQZR^5EOlmfDBynrf%?`IEWpRzvjeneki6h6wZx|0 z>R5gYE_ccL3HgkTD=k|0Bddy8X0DLr6E8(!k4cMWqp9zUqc{ZbbZLGwpVK&8>^b#M?rpzaoz>0{k?*5veHDX|sgJzzJhRD={}okQPLljD zE>jD=xVXOX7X>rEa`~L$;;)3Mf>5>yc}a?EaoO?vTA?>I`&@hI+E_s|gx!H0!7io= z9%CAwI3|wakN#bpr>nFTYwgvAM6rAdtCm^qz-&PEOvKC^Vw?cysGh^`qwrna4!r`F z=|dWTp(U1ii*fX65hm4_d2=9QUhs^EtCx9;Ld*VW(}pX{wm^9-*(?JDhNF3#IM{$W zW70S?CU4;t>X}pL4T+83GS5-%XIb0IfD3bmZnQ(%ilpL0CAhh&xZwNFWlsS(4#Lxp zKvHw?(F;k^^g|NHSb&o9-%Z)hZ+qoB!mkJ3bwKx@J}Ra|M}gj(G5 zOj8r-3Yx$s)#q4ViWZ3h13J-097DX#rFG78*MEv3TWXW(qf%mkjbz)zE;mxRj*@?6{pCN`j?@n- zu=~O61kg#CJ!I>@-a{5y_fN5TdEk20qD=(-R@|k%TOS>f`tGiy+K}MB#j|nz_h>IT z=(r-L{j>hlw1To>PM=dJqfF0ta++p*DCEjan;Os;WaTF;#VWnE)dm2RlGKojJhfh;+*Y*I{XJvDc*! z#|NfCRboG2*YeG&^CWI@nmW&e$CRn_2F6AgprgrSHD;BvqXAAvN3+1}Xk>IW(u2iN z`{-pZV<3Kn?9dAOdpF_Kiy-h}&4Y}ycu%39e-2Pr+ndyVSxT2vO)wMcDJ`9-Xx5eN*1*g{fy zB&m%4Z#oeB84VsNX(h&@Mb{Km!pkMt$vOv_khmIwmV^cuSIoT zS{H@~JV<9+c(vd%CaOX=Ii{+QIuU8u4X=m~D~4eYTe%&YO6Bd=4F!)fdRbd|HB<7R z=|dN9fB)CvW5Ln`MY@FuXbRCO=z@gA(_F-{ zTA2FN51?roif;g_z~K`Uh;B}4%TqRr%B_Ga1DKqp9fH2V85k$3uZoak1U6&}fDNP`n?9m(l1p?<>nh~vX{?I8k&)tafoOs&(p(9{cN zT-f`*pLxTpKc<{K zKatj!vel^ncST=UjCvOdo2w9b9Mry|RHOJ!!$CTTwKijfK>-jkCXaCA&jo4qOa;&` z0=)%5OG*p=AV^b(>e93%Ok8CM+~CDZmW)O!VNhBP(^RA20q)awkdc#JjdRzkZgb>; zBiw0U!`+s5vV{WT@;5agZVJQ5Vl%BP?LlugKhF2MwC%V!MBEp44tTy6DGW1j{Bg_} zFU)8vc1ZojVFlF>0v+QU6UBx)?%+vsEaX;{UxnM8@ml>Fcg7EW8VAPj#R&L_g5fz}v8{hObSkhRFcsEXZ$gK9G{CR1yq3Zz~iq9yT(&-1m z#d%;vz^LDPQ4sLN>4St?MyO%H<%>QFa3S?o)oTH=QlEH|dXCfBvN^KLW$ptgl; z#vBk=TjyZq)O8La7V8~?kLw(h8M)r!G`=~QalJ!OW1XYO_+~S{9pk!(?(w~Z zx(Qm~_yCvIWL5BDnDeM0w#kChRr(}Of%mQ;kL)60s!U0E9g-j_I3QlZNd-b|R_skw zaPC@ho;HSvXvx!KSL)cdXQ{)p01d-)Z_K#7038J!+o3zKf4#aDLO8wJ{|OrYNGu;f z%&CNtU@f|*C$qTC22B6tT<6g{d`uCW9GpqGfkW5Qd42K3M9m&9u5+3%QA=9-faCx@CX;lFETD) z+F0~qs&O20QyO0l+KX5WIqACsg5%@>M|Bs<#r=swz2i&5UguoW46v^!ZOKgTw)s0r zbMz2Nvsn+~9O(k?&gnucz8DRVCLvRZD=c>X`9K)jYUU@2M_=rc(w4rtAU3L zczA%vv}!MTepMV1@H-1Oix)h;&XgCUV+NM$mbG- z)~|=pb=0NpHbM`A!~&1tir`+-1wk8uyKCtb0r}9%m%wah^}}WHuTTOgMEY zU()Qh!4rT-F%`I>0=;920kKs8--txtv@7txV1-J)cm{2I1Tk~vQQ-KRamfK2#G2a(jBUVMB1NckA z#`{N(0Q1CrPDJ|vY|jYB7N<7hMr*kE^KMuFa#TK0gg1N`%VY9*zdh(s#Hn2HAgiLv zkPoP(wczVR=i_@p*q7E+JSqmcGMpYZQuEdv<*zjHU2xC5#~7^{hu|BOO+cJJ4fC}* zMosWyKwe%6`_io)fqhAn_ABjR4HR>1<&w+Ma#K4h4J$+_z-;1&ODIhYt169KU$Dc7 zIPP241Q~Z@PJ)o$!MOJZ)NN8h*Wzr*J8n{#I;|2}-M}H!!XcAlAH9&@Z;GAjdsFe% ztTA?OAhD4XFBS>d01aZ)P=T&o;tXY76Zr^r*vPQ;(G<4;#SQ(T!5^GigXUPKE$Gs! zF@^^6{QC#qvcdC=U0QhJq`ddJf9pFO!0JYmT#f!tg?=sU6Rh7L&borXI!`{z$TMjSR#$+_xsXRsq&;zqNx z$pf|0EVTsVZ{von60v@5h7y@`fw;*02@tMc+YQ^p=ZFn$M-8Jd7(1p0%W#Jl#tb%| z5Z8Z>!4mp1D495Z*%p463j7T3?6dXxQ4{#Z;Sv{-0^$R;$}F*pYNBP%b&HUd@9l`0 z?*NXr-J`#AfYfpb#Gb%NDf(x#zY+E(7QDF1U?|9;ZTK!G3xr%cXT|m>_fHj-Mi)(e zy&Gd-kM=ix$;0q1&x0X_sU#2k1Qd1aZ85e-*b8V&UMc}ZZk*G}u@2?}U^G$hx%3<0 zG_h91D=-4qZjNCyv>1+J&GzPEuakq)@r;zpS~lAJxS$V5q+|YTN`vS&uXwX>V)S@Z zTA;wuyTLkTKBlzfm--tAw!`2;kJYUm<|O$y5dw14V?*CX)sa7NE@KL8*zAv&>GN#! z&YowF4PA<_;69ShJ1;iWFG3Efw$xj0gn&u!3A2H{LW6pR zq+TJ6-IMYS?iCu+D|D6_BGTBh0xqRJjk<0jt&JH3scbv36~v#?C~at-ny6+bzF1k} zsZX91dk@Yesj|YEA}>W+L${5$fn|%(W;qo68HgLbLE8g$1?%FK7#a{%PEJQdDh}i8 zKQXXFcCT?3-6Rh~jPG+H|M>2_d9MSu#L5tDglqjmlsVZ;(*V#tGrj#{O%* zCC|rH6>5Zu5sqaNcM46{uQvQoLhHm~=F_If_d>`6tW(ATLkoyA%@emO;Dqadw+vW_ zQw&n>j1|BMlKz5kaTw&`;JxpKN0s`MUDQE|p3jF{ zRCs|K7H`-)8`@_(uJ8ghF5BTo6B%QaCL@J;5nc4JCgIG7=-td}f(=H0l&r7B{fO1B zo6+4|c_&VFG&-g6e1#ePHn_`?(38~&7qmd1dF7cz5;qRcM-*IJ#`BX+&Qr!O5HA-7 zJA5NJ3`?t)5fQtR=>*hpnt*Buj40Bqli6jUvwqrw@{8m`$a`4w|03A136_vzR}wiB z=Pn#fCh)uOWcaZYi8zHM7Q>ze0iR+GHzL}m4kZ}>7#OI(N6^32evuS-0&fCdc{Kq( z6|b*0kgr>9XmKMCA%)U(bh9lRP_FbLKJ;gDw&qh?JJ?>IR&Zz&_5QpJY2wbQO=%=u zB(#bjEx)EyRNpjCF#a@HhlTP{)!7HoiMEb1<^%9aD@xIbx7-oI+&CJUrSB`$PjG=H z4ydx>97F*iwEkjL$QF9}5Ew|=R%;r`2BA7M02$0?xmQY$S>&7ln? zAOnEC;VDtip{$80=1GQu-|v*J7^HQZBSARmh2S%3LKcLt*;05fw3rLD+3Mn%m|B3DH^8i>K&X9l036wbY&QLFlnF(c?q88^mq(LswrXZG zb3puKf;O=$nbm;On%JPqGi_h1Vf1Lj&QYp(`bqtUKKf{#5M0F_BjO|%? zKpRLY3+^zEqki%=1QGy(b&E&lzp3uVQoS~w>7?4(SG&}`+)mq#^Bw9?hy|-*;T~l? zWzQxTKS}8ukk*P{`KmLeoM>>#0`;#G{7j4LCAc58D@WZ@5T<@ib6pKetjfh}!9cbz zNjZ*2~iTV zc#c*=SuBJs9(AP1*Cb>o`tLwjm$w*N<$7(|QTNzA>hiax)dA21sLNjq z6&@{Et}nS)TmG7rta-`p+EDT|btt)9P@yj=*M?H|;nZW_$#9W2R`I_5kiAnKFRHTaEf1QtQGw;H zX0?isq9#X;nuu%7{vDS5J9$F##k_CXss2sfr5-d@G(2@fJgn0edWF9j&!Kn7#ykkj zbLTXp@6O+08IHv})n<<4^6U5;T5PM(+LVvmG3rvo z_76hUr#;^f3zDsKrA6;b(K&n!ir&n}!00qST+ti&7!WPyqknWfAN``==EE8N79SbW z96r*c7x0l5J%0;}uWP%}kBr=fSbQF0(F6xC zKq3AK=3<`@;QwbhhGAq=XhurA(&Jt{9FkzpCrLTrE2eyKtiATht&N*#Y)V^GwWG*% z3nmq^aq0sofA70E^#Lb9@NdDJAfx;q*sw3S&vyZ4?7n%$zH1Bi%HzeM3P_va&oxK3DHbP>l9T)5oIFZS?u&EsC^@;$;N($qa-YG;qvYg1gOf+e$$bVVkCK!73{D;; zC-)hgJW5XPGdOvaoZM${@+djE&*0=ya&n)+$)n`tK7*5c6LgaT|3pU;X~mE9a!X_` zo<^%pYJVP_-`KPzX>h0Y7F) zpc1fvbULMgHqT;=O^R346%~Z#E8!IR5mi|hRJ^4*>3shMmBah^!2rS}!sQ7fw2=tk8vOql z5g?yZ;Kz`$2(J@EpB_oaQyWUT;G(ehUZj&d(c*nqLR4r7nezjcxXwA|kRISV+{W1P z<14iOsr8+^u4vX$lmVR&!TF7+g#EYZZ#o(z-v@@daxWWJGy2LMP>7c*;db=R*v0~oZYAcH z9w-N}6I05&wI=E19TU*(<*P<^chtM&A=>3i{V{cvQs+QD5aav2qdrA;NgFO#8dB!+ zLrO=zU50@+WR1J%wnmgz@BCt{)Cb;P>+IL zOQNX_00A}$%hHXzoZjWS^%xA4IvVZr2&pzzsvT5NF9r950oRsZF9kSdOSR(>X;S1# zN>7UPz#e>-HXw1cRC{&78&Z&aUpRjFOneX^evMaf7D5zYa;1^CwS%Px z6+F}90SzJ5!h2rD zA6fw@iFP6VwIQ`Bx;u1V?20!o+$E=pFzRg%*Ub6N#Q4jDR`MQ|;!H3JO|^^mM7OCe zV73~kuDx{-d<;_jlrT|Bn)zO$LpC@fS>&9!>oK5+onwvz}Ie5WG z-$zoe$17I-j-zFCfZVtPs?nkC?A#T4fO_j9%H_Rmh=^OrC{2VwiIrmYc5rq zD8$fl8K^bNmmZ*N|A{H(-4;ZUVj>i?oT-(aa|}%uM`F9itvsA4hQOljR&p%cLSdTp zlJ|mEzION!B$7)n_e7pX4{c>wlZ3GqH&;EoX%e0MESo0jLn88|{O3AJHyDoL_aRf^ zVpJizl6u;YzCuId;*k(!G0F?4wqqiYd8MOza()}akDlW~P*U?~yqOVO~lTkXU zqe1ja>2uW#YTa;3M}q@C6X^`1XK{2iIORb{q!rLtyAj1JTRR%u=*ZmZQZ6FUW4Uv8 zsXLVqTkWsg-^krrFz`!YB&`lnO!js*jlfg(sO`C3LJ^L)!F5<#y$-S4kGUO#wjaxN zNJ@RS@6h(HCHCF+J)Q5#H!3~tD+fq!$1o|^aW=YOrKfA91SA~8fCXcm@})}8v6cNa z$1s&)j75(l#|9)2;S{AOwh~oz3|r$k8#FBTIvP9of^24)*kxgr8G-L$ESh1`ZyFJO zEWahUrE~8sW1AOcbnX?K4=by3U(bC5xyuH%0_8HPRf%N#z5veOxh=wt7OZ^dUZuNr zc=IWYgz zZB%Ixs)U#n1xwYe(x5dC$*dC3t383=IC(l|@LQ5g{}cQ^DSLlnvX@)KPGs*hh)s|I z9F{;blED}Gzs%$4K&vT;X95YZTpDR15m^i((Y`quzu|EVzY+4ATx^B!{-Ac^-zw!6 zOYP+Q0Wh5tpeLpOVUD{*dz0krNdN541~ft2|Cc5Q7PKp^Qc^R^Z893#l75|gW8UBb zv^nwe0@XpkI1Qv6$YKs<@ia`x`Oh}AX#aTeCy`I(*PunBwd9L7fSAWJSkUF%Kucmve@^ZYCfmu-Kbu?>m$Dw|KJEw zFE!PT6@1Jo9+ZuUW~pfhB21xv*JxSPogT1!7zi29LM3W%ikv4pKvN>H4}uVHj6*~O zAtK^b5RIYjH{N-G_ld%yq(GmiM-)MONso-1b? zYNswy6ee%)1$9mYU>4bhMGYi5d65_&F6ss{eTrms52L@f$ld_VB7>(ZlJlh9n6B(o zB%^y6{k28*24EIB%|cNJjTC z`fH2q4Ztii?{r0SD!Ci;#(j!pbPuDyw#eQ9%px~o(&Lo1DHw3*;k&NzP^w$>I8-Q8lXK<-HWi8R%7j>gK_bHOmJ&gX^B6|Zci@g7IMM9}9 z>V|sjQzWB%82zv3ncmO5>#WFh4v_+J#?q zHVHM`l2EfaAn4v1RI}rx7Lm*>?J>-Ah*C}uAH6={z4Dj)LCh$cv6aMfsgO5f7`1m~&_#&AJe-rMi zI|Keg4*))X&jh|mX2QSu%-}<{0X}}u1inaS!teg_jPQrH27LUU34D>vg#Xx?!H1#; zeEgmXe38tAKlaSvL#qQme$NEHNM^#{d*qDh0~HSV_&pQ&BAE&QzB7XleGT~dJrnpM znF)XRnZbv027LUU34D>vgum(V8PNwy6Y!}z&p>~QWG4KZ0e|k=#JH~4xYkg=xXvAk zFc6S_G!idJJ4_lWCQ>5j8ewBh7#|=IMz1l2HBdhFn8JXEF~yEUq67nCe1Kp)S;Hk3#IGGsjKp|i57E1j*lmjie$7ko;ZDxy#bg-HhgiKT0(!v#}i3K zGTItXoW9830L&t9I$e=a>GAPIQjv_d#uKM6vNr&;$oD@#O)a72A{lLsCr)2v zZvbYIcb~4vI*3cp|AtMqA^F(-+wrfLY`Q?5XQLFMUkub}r28#FbK*22FYTy3R1yaOJeQ z&nS@;b!UAf<;XMYF6G12BTt(%+wqq<`XnS3&NEvxFUR6cmt*0`t=Z@EEq&nyTW#mT zffsWbTp2uTs~JT|5w6&!wCch}kR4{QHRrp3G=8$PQz zs9~a0o#?<8d9FOD69=dhGt`NxbJdCVHC9}Ibz-_Y5xxLcL_c+6S|Wk5%mmjREZ#4u z!@-;VmG11t_eq1XH11aRV@BF|X)PEy8D%cXRqL?^le=@#S=&BZo>^z-!pdN!A=}r1 zMG9$fQ7iu14Rp+e*+#wU*I!@{v3$3$gQ$|c$XM)b7r$Ks{l1xpCC@j{l@5GeexjUT z_rqS?t5Wyi>b`{+bcW&OWs_ZNGA2Pt`R@Bt$mg*me=r2}_ummn%+Yy!q7b!k8b#v8 z(S~fEX9R5sT7uZ$i0Xj!LJpaD`WCY6v~nmCoG6E}i^`c3v{CEDI<~m*3+4rez+$y= z7q0Z$kHu5m)gm0#;_--++eRXzy`^zF2*QyNs{5*oCWIJS|TLaESD=i)NsV zgnUk~#9Ani7r|^eXoN|Pao-)}T9|VaI0YIFOa&uGaPF7H1VbmWF2E4l0LDEX7;Kt34w|@r*EO(lUQ@V*M-HDad)`R$z1ZqqCxh(SVDA4 zwVwXDEyR6RW3ToP!4Ua>Xdjp28vraF6DCFv=hwm8!wy%a+!kY(*a;XB3u460y!fxS zmP2I3pQr)YdCSeS^6PGp``sXqxIrFS6uk_W-!9CBx15aAWzJbRLg~qp&rzCFaCu?3 zdm+|GhrxXW!E_{9Y%iK+ZcpnPuyE38%9zQW?Jiu8D4(TtrQ%Y%^H7WrZZ6{%yQ60- z-9wjPn~`HNF0G8FqE=!rPUA-QMnZhnPRE9E@WiuqHY%iCZI`cQWmurKB=4FzSw45N zeDP%YLcJXM7G0pHqhDKej?OK8(X;ddM!NLJ8A{U+;sI~{m}AKWN(^0|=GYn?tnu1Z zUw@6atNK#4Qb(8|Y`1<#h?Ddic5=7nf3}hSNNPm-joQG)`(k)h$={x!zE^*6*hK01 zoqTcC?B}^U4Ay)^N26<{=U=VY)0EZ>09l-7fN-rUsrkx=A{IV}!p8GZ60n}-q%6Ea z)INWQ^qUuK<~?iyPD%g1Ns6Xnex4V504f|^Lbp|jbwcoRI7ev@Bk zEVJVB5Psgg|7=O&4e>>Il_Z6(RD8{pltFl%I!*nkrVTqQZP-2`{RxLqJm}^A|C;sU zv32we5$y6mfQnr(r%u)XfzYJ7JU=H=PkMfk*SL=z^`-BxnM3y1@_=u z+Rd|OE^;F6NA5-TqFdAy=rpJk%71=Gek_^lNCTR4{{=;+ru!cGuKDt%HQjeim{KfX zQgig$yY7)?Z_Uxl>n3F5aOb1f-nZ~>d3epy8}C{=Ngjqq_qshgM0q_WI#78%HR@De zcSKW_*VACHRhX<(8`W?o%46zo<_~xiq45k61ED*1vbSh}~y3jVmEmN?W0} z+%!!OHxK<4)%xxeRI(rS9dY7ai_|1p+eJ;P)B zxelvMaVh(+(P~~mBI$XYx!z)LP`lJ06N!S7*A`s@RJB(aQjc?68SuJkj=EEw@^<~f z5vf&WV|PmrEJe=|y6ekXtiHNit9UyQ4_!P08N)_g8)N^{8bdU&FPEkhkAE+!HFra<1` zGgzu^STYothKs`vBmf=Xj$DnLum|u)&x-(DNatjL5Z!JmP=y!$C)LLR8GG4)=pMDh z^p8@SfL~=yMKiMSBfr&l4F~zIs1~Q&pdhLC6}Dfs+ut3N*DD_`@ONjgnbIN!mIL(S zpGdV+TEGdb$Z{$0F_l^ODBl{u(H75Cv3m}A@nIw~sN9IQqTwhfN_9uaYx8~i&ty_MKtNYCo~nSKh`+AY``nfEW|AD74v`r9Ix{)_p0Fi?c_ zg^Q0HqvcVXaorb<(f&vj<9U|~4u8?OJ1E1d7T>Gl#4fDcjOsRUKN^z(q76eB`)JDSmGBMnwScWu}#1KNaNNO%y7&fxP-F zeG{8WUKB|L0Zvo@Bt4VxS3MPfPpWTjKsiRe*<97Zk#UKFllz~O>p9Z%D=Y?|NY5jv zS1-8xSy8j;{HyYSMtsKdz{P#aZ6AANK}|goTe)gYx)WhhZ4nWsH<;0Xa=<$<% z2NR{|w~~Wse?m&mBk(D%&JRMKLy4Z1i~Ab;leB!CP%aPmFKVO~4z~aT{ky^GCp-4>qr)OltsIT86*=rPYiMmzMLPm6mb96M)*q zsecZf0_F-;&d?Um!G`i_>S2UEu;6fFIL>>yY8(<3d$Tbz3)aCrc1eLe+KMv9_C>RC zgs!@Zj7B&MhFhIuWT_*xpdWI0)NrN#*msU&*OuGAvfo`e9~^fDJPVb_2_ye~&Qxjj zeDu8epTWp5^fl#kDg0gI^81e3L;1xZ+JR&2$EeT0fTDC6tJ3Or;4%i5$7&(AnEA<% z`IkCTLM=)#;cW-JiWBTLWOS$-*Ar>H<;R-*oPmI8m0ozi6u64n%e;j+C^HiZhDBp{ zZFY3T+_i<%7wg#ldK|kPu z(z>898^J6okPmdERf`bGspPCen3tC!st`ux#puZjM;Y5h$Um)UCb;AEV`8E_RAR?_ zjugO6G9sr3j=_bnH75v2by`4?VQbpojkN+V&?3{YHn=MpvI3^NwPB$d!yKHbs>B&_ znffJI5|?UM5p^)W5c{xR0&Gkn6yofYN0Coj^$YwKrs8@{J{?;#kyHx4fnV|?6)^o9 zIpDELflHB9D7e%0=gbw#yIQIhd=vz7V&gOca9Z7>Ql=EB7RCQJfAJ-gR4O43pwdD< zNBPPU6!L&VPJB7bOb$RG&5}zoZUI@Iwa9{YN!Hh)xI!pH*4vuD({Gr4JVv@z*p=;R z`E^j4Spb@aWWNVz&Kh%yUQCaAjt6U@l@4J6D&&hmq#Y3rRC~z9zV<7T?UIXwRE1|NA84Xq&rkySFmsm=J4PLQ|JVJ!$1fK z*dndKz~Hyjzp{U|6uh41pd0WVXyNKlsb$pTO4EQyK0d_dGv1C*-R|sPps6(Z$zHab z$WM~Dpo(8XHur)+JV+}>?m@UG8M|i7~IDC)nz_DZanxl7PnHYgW zb$cWa5T#ehr_@L`-!~ZV9*&*ndvjp2$lg3?sNI%4pk96SQIi-y9tL6aBJZd`U zo#9e(5M{WOI|*&-uuyq+xO6n%!=;7BgW6oAEEeHaBs?pwR%V9EbDCBO9hbWkclw3O zy?nYu&PU%%Hj}XJ`XgAR7Bmh=Qjl4C1#nU#onQ!dP4cx3ub^%x=$qAxzG2X} zDp}tr=$jR(MK1pshZJlCP@I+qbT*OXbt#eiV32He5tI9Y6q<8z0@?3o3@_{?>xEQY zhiFxg+{b)PsmiCv&^opBh=S;Z@OUB(MjohI3YRDH7lhfVMy^Fd%!50jDT4n%BwCyY zg+Lq;Sd00k?Ku1ErJ3xte~@9f)wGdEW8cAve>3oczS;$NqZTcIiIRi7Y~$>l-KtLe zK&l;u`JT{?U#W-v-JeUVpT<|Ic8B($_CB@M-q?pme*@`sY71z_nf>Hf*DU$(&~m#f zKQ{{9o)b5NyB7Wh6~c_N{9Ua$kXN&fh*FRT)JQtgTcL_J=y3P_F2 zfoNFmN7|5xpNx2Es})X(jA6Jo5zavvEd~d~%1@~OR6eu&dq!xiAL69I@2JyP72?<5 zbD+oIKzrf#>%bQLl?6tj^c5^!^hZQT zs-0{Pm8Yn>qT6AI<&3SDLa!l3ZZos0EkeJT<2Q~WV6>)23J3!IuHZi|AxBX8+-?pr zw6gU=3b=862)@``A_L6y7Jl3)5~@C~96U!W3*`BGJd_-1^$bLlA%TZq14D#SWZ)_C zrAQB5!F-cZwd0DODylaBL6(L5tm1>CfDz8z#ru3w)rX-DfT!~LD3kIFjR>p16D?2* z@OETC%Tu?5JU21PdNI!ceVGUT+{NRA(Ss01WE4JI?M3Y}C-AKKn-lEo-G+S~-6q0=Y;;%L)b)w>zsn zC_Iy&uo+o(5yH14X?U0>}-jw_Kd!X=#A`z4}&0Sk06~yD@D^TL1`6$>`5t$`e zHJc%7#;Q|{p@;qvnZfTMg2rYt2>~<=skX>Y%X&Ur^0jjbmT;`pj7MGBfD;Vh1rG(V>@4ZKb{?}PC{$TJ2)M1KEpc zr5B*B`?rXB4*{`gG7b^~vR3=oN8V(Nk6;C*ro*~-`d=O)=2ez_j5z{#liiMoOLc5g zfQX$N#$oH&0Sjtlh|iCgEdNH@r-C|Ca393KW)4k;l}3SOVx%piw~-6Nf{Bk;v~W>YwtsW}LC`4&RN^t{UVR28tw<$oj%VkG<7ou4oY$bYh7$-!u4h;OZ^Hi)yAlY$ zj071j2qLY1gFPx7Jeo2%Cjp}TDDo-0QPMlz|FVPZwqg8A9Et;@Xmv?}dB7ra8-9%O z5qI+oTK7hq(I|@`9|p)cePGl{KZ0o%>j-!s2J|9WcBw>%1xUdg@Wl^9E;t%57*ZAB zVU5EepB$YC2tyHHv){%~JRf_vCr`$gYJ zKUp(*4w8`Vu&f1ZgBKCDHM+<|K-y50Hg~*~CikB^o}&y0;+VnA8~GC8j3x(B&Xb)u zHv93841=37aG`{s#%K*^_6k44%R`E{9g}2j&hn5_4C0pS zqmdc>N3x-2^N|7%0fv4QBnKV*TgU{PZ-0{_8kd=_wd+AH$dP|p`h1%l zouyWm-S!vMpQb%8;ihUA!sG<;%xmN#*K6&|m~e zC|)i;h$>ai(QcfKIoI4>V{dXx>l$EY*6&XNq+_{)sSK-nTn|L8g)7r=K< zrP@@})`Bluk&9?TrX3oH4xJgDWvz3x@%krMRVA)IjeUDw|9MoYxH}EVQf&vBJ6^T( zP_?9#@hUAum3+6N23`6Lv@!8A3zn$Tm4+jx>U zwAYrU&Bp{&P$+72!VYb8jV~K#BR$d}#-{2XxeV6YWdF;VhSC)WtLwqZ$4$Mq(2b*D z{%Cb+*H89+B+7!)%0ercC|W_5I?)|fg**j2)Nbh!P@ZE#XJDs%*;vfs$T?E2Q2-pd z7R|z`d}rhME6~AVcrvf)F9kQC3Rq9Cvr~ZvdAv=2T}KIQYs%0ZZHgPGYkdzF?DXl+ z07Jbz+HCc&nt-bI*UGLsrk0(343uz$uBS_$L-`OfUMFU3cIEE2ceB?Lj?+<%`eivN z_j3z8$BR;}Moptlbj#_aD@KhR<$XxyY8zQHIdx*Sm0a2&Uv->C%vI&HkBf1+g%9R7 z_ToCgn#M;u$SWe^LC1p=S=ffzVb!ibOY|>}ANz(t`^)F)PGqq1`O;@OW2{L2&hMR;~RJYD}e(5q>z{3pqmO_f`YJb4%!mFqvsMkG58S(tAMZ#XpD zdwyNCJpq4a9G+3$jCi=BD!;B$n6Nc%MbP2u0gOgC@pR-5&<7k_gkJXgfjI2KId~Ld zuA+{^vNE+*|Bkp4$hT6#g``NCBKz`pM28D{6{g5p;o^tf$YN9K;oUw&K36M#!%=8o zQ#@$4uT^urq2jag$@dA$;%uc_>cm?n-sY;MGx5r4OT69!w5!!p7h*UmrItEswh3(8 zsU(bdxY6SMs~4|=8X)VD zXOIicFgg)(2kmyJR?-4e!vo3*{TO?RX=6U8Q2z7mam}AD-#|6_Z7s+I>R~;X0|_gT zhntM3C7%}yK)4e?^L1&%Jpr|aDIkmrj34rXxnyO+iu?YPY{HVB&_)1(6 ziE~H?I<%5Dt%5ff7+7lmWm8|X#5sOH1N_-QUmbbNLD|q>tAP&bOOX)t{g|+y605#W zdZJ_lYY9TF97GgAcxB;Nm$jQx$UOwX9$LVpjwDL&)P)JI}bqaX+}eGD{$aPyA$;dy|fXOMs;f1 zW}8CQu1~{?a40wi!bTYiu1AWf7x#Ul&RCYLVCB$gFI8e`@;L1geuf41OR~}mJkd&) zrKw?g2MXUFx~ogHKB|#;f56Bz$SWf?m$wo2$A8ox6qOePG2zLoO>>T&>RggCyzYpl z4{%o`?nhxSj+9>2;SDVtVlP{ z{Q>~@fhoEu)KY)+65VMvHqB| z<#CZ}mwjiT?!FXl2v}aMLJ8!l?ZV)->W6rd-x=K+hbO%PfGN>Gn)Xf+CIz$f=}771^~cg*>*6Z}lYI*NKQatAa@f}bo;+CcbXdS|WveR$Cl9^yj_Qi&#( z1hru}>@XSKxc)!|iy{{hq`^-^{xJodEp0%jcW`dKj>B!+p_=xiFQE1ehl(+T>!Fp0 z8DeKSKCOoM&b);gP&E&;Oat7}Aa7_YoOgP3o+l5vMkQTBk)TZrHDbxS96v9)sxq{+ z9|zdiq8>GkF>Eivl@V3?$C$}MYX1snYN#y3F0JNlgMUT8`{jXj8E}IM!d`{J=D#my zTiOXsTZB7EbeJMX!s~2d*=}7He7= z$O&hgZ$ZGLQf*4;dOL_wng1p}PK6J$uCS}b7&!yT0LHr}J(1MHPOQuL$Ks+s;2{Nh z&y@c@JKn~#kEl=7g2w*J@Y1@!LtoZ2)fq&q19-pfAIODPQE@F$s(tY$Barsrc2TH5j zq3Nv*R#Iuh^{%;GZ{$tF`EMdRTR_0Hr}-415HH3^cnWJC3}(-m8NJBRQ#HrSKauam zegR}sj$_d$%9jSaQkOk;r#u0RNXPBI_XH8qxKbB5wQI&6U-A#F+GGFc*e@2nV0-ZdHYYpF*Va*ZWv`HRy zqDNCm9CeHMMNAhyyHs@MOT`XGbt&h|v#`SkeYLvO0YEfR3$+DK`{#b_jhiTxm9lNN zsp7#W@WU0!f~1-9gs?l}N`#RZ{ix``MSGWOSJ;8jQZ!XNhdNl@fYac#P$lk^#>N%B z43XHtK_#Jvv5YVG_peATkOGs8iY-OnQLsTlmKmr$xme6+6T+BRaG)ud1BJ;Lcm@!y z6~VUfmSF{yA!vl+*j4%_uGhWnU4s~u0u?X`z1cU2a=BwGc08T z&%$XYB%s=^t#pTOazf}mQ}v(Hmc*A$9>eltm?DHQ+wc9M%^ z9)Kt2(W$&d2BDaMRwcA3xUm#_5$Y*wDE69Y2KqC#Sv{oXYj-;!JJ5#z!a%$7*XgFuD3iBdkDYB;s& ziC)O%Dpb}D8BZ-9JyoTXw3I+8zov2^MiJRX3;++=q2X6L2sHSkbok{r^m7y z$;;>9daDg0#Y`?3y$B#-R$@%#Zy=3fpHwZcqjB|OpjM7~VY@mRp5SYpNtFux z99c}Oq@x5T$;F`?9ay4(Y`|b|=BQBL06Kyz!YUaF1Xw&Ql3$n>NwZ;*cuDwdktIjp zMm*um15-pj{B^_+VpU%X@~(^|#Dd>LnDip4;`9{snXdctX>sJY(&8wCe*{O&u4l1O zPTlb=rmgRUq)Hon?zx>!5SgIeflB&Z`JX`^;Z#Vf;BTzH_{LCKnr&A^EB+DO<(#mi zU0S&dz}%9u436tm&(Vv?9#1ZF>^i6wgM4PnrCjDm$~`Dl-8J@a3->0u+pZV>JDA6> zj|>Rz03CCr;QPSpS#;|3kK?YIVc^jO^^Is|ynYy0Xv6GbHnv~WD$@1)q13UE==)@2 z7gmG9C8D`e&_c=@_QoX~_q)cH*p@s1=UO+25Ijn?i(9v3&JmzN!T!aCWeU!jp)dJKCSh~dp@LB~3qo>hs?xLXQNCAb&2wBF!ZiEf)X@SW=y5=r- z3>*Qd9ICj*Ooew&#ElL*Arh7PLziKx!RP=$p0E_4Zyn8#BIIX+|1uJk0T(pV3^N|> z5Zrr_W-o+9j2$i^mCCR^;*B`}z$^?KfowAkl5_#WcK|4iL6Lc2bspO2V1)CCe8FV2 zih}^jMjqPoG;A*4khz^D?yii`mVg`GdXU>9ki1ZE(jx^{F$^0(n_w_ETMB51Qkz3s zfRYCn7YtazXD=&5-hvfw^sP+^eFk`5!0@QcYT!(22f?$E&}-a~QUJk{0=yMP?TlV1 z^p@H+5^x|L9&M=;^Iq<75lLy20x3ww39qZLqFDj3Ip$Q?($_$U=%c3n$oWNb5bVy> zB~$a59`KOWx%Ho?Qj-A(Trq$y950!A6}^$~br3Py9ao{naRVo2Hq_S z@jyb3FGFMF^xEf=(m{rxgizsS=#zGRp_Of9&*TkFpiPxUJvo{+(0_%3KE$v=un80R=k0$>#$ALf2zfQamp(~KC~n* za(iO(20>l`$TNjv&`q;MIIc4~9vbuJK8xYg$R)&V$~1L~w7_Vv3X{{xunPGIke ztU!r?iKP+>^%(v4@FgH1q0ia4K^2(yAXt~no`5GONV}psg<0O&cfoH8`}i5hf%E2^5I8BO;ZmVo!=*xT1m7ge@>NNAI!}&gJ(dhjJd^a-8Q_a1seg>jHH}Ze z640b%JVBUwnffYxH8E}q^X96Usp(DahGH>>HeLS&?M<{tC80f)Kn!#Wy>SZb{SCCE zA;a!V!grQh>ftnAU;2XKkbz8nl)$-dH>?VS(@mxB6s)!4V^-K;I%c^bEpuybL^r|p zSoDd)qbV7$O_#*+N@n{)L?_63621$3Ngo`R1Ieb}U6wu@@D*HDYt1)J*MA5&HI1df zQfc#mmg5Y#;)orQC0AtOQaI!St!Hqty!{qEU<}sCN0zijaV&{w=u2C0~nC^a75O4`Z+mX=m#RJQHmgaP=Ck`EgcDVp5T~X@2SB`(I*(TAQE5gGOG040fdFzAU)n#NDxCVd6BHQXGA;@e#1`k$yy9A5pW20TT$L##I()6Ml@()$2DWByNo z$kQ|u7Trk^^hq*te{2BJUKBLz@SPpmn4qh+SWF4BqbRs~;UQ?dcHIr*6t>8ADexom z&XT=km;+6i5ZYx}K*+!eN$Mnrw4v0^0b)m~8;8xow!Iu(701GdF@l;0?_rMF(JM^D z5~DF~H1vSb(wTrVgN<>L6T1;i-y4IqCjEfV6pwnT??&wpRB^%2NPqDABU8(hF=u&Eeo z-KCz5U$ z`@VPgJ=u5Oedj%w$k~hTlC%HoF8TKFEWB%xZ@xS(`=UkTE?V@R@_QG_Ik~ne(@Lg) zXL?0>$+T-ric7NZxmV6!eEa;n@5}}OCdr=byXOx1?tAZ9)F&g#x$7Pja~F=Uy4N>f z6gBtmd+yA>eZk$?cicXIzM1|E@c}Bm{=vqzt$hK$FF%1vhkyO?=f_fMnHgrUSdQ>) zGu)5iKih2c&F}y-ytL2vHD;LbnEq#dzCV{7#;%)}&9KKT@3o}wEil0KKH;vUF!6If zY~U~OLpU=j%=+b-Vb=Erz$;1$Gk3NJwV$IUPs>{`(Gg`}_>?tgV=*p2V)fcJJ%{!zg9KLGQ&cik$+5b808iB3C~ChKkTuIteENE!?VJXUP% zkc1@1HpFrw#PGu|0ofiQ2_##<6bT#0B+@W5LK8+a)0q(nm)=feY)CKd)$4T|nvhnn zrH%7SQ}vc6G$D;zVSd++mOjs~2hpZn=QZ(z?l zYwfkyUVH7efA6CqK51~}&!o@$;v12Fz=w-{js)EUh=!K_aSW`<aJN79XT-ryB_He|Hqu)`3i~o&bzY_+R{H4B5`S3jaXMFfL_BrpvCH+N%OM4Of z&iLXdh_{Yvdx-op{6&|fDadYWehI*2tI1? zyTKbtf7pjhen$=dHsWpM9XI$J4L)ITnH5O<=|KFeKD?3ma{+wX;BO+ml=rePUgTXh zxKsb3U)J`z3;uEV7a3gQ2f&vaT-sY6d#>@tOZ)6FxRgIe`T7k02H^)!8eIHkg7hU{ zdXay`hl{@BK0J!PCk^h5-;=(0Nq^ShB479~82nD~GVwFMc)>#-*5wubgnyC2o$@vr zT;z%TR$u%i`gi$ou}7Z|m;P?ZhmVnd)Q1m{-w_`!Wg(XZs=7rgAlBed@$K3w9D1@ISrc$D%?8eH_1`Z?!|m-@Wq!za<_ znhzIyEhw$45m--O>*BD&K6iTz@}c=5NS54X`L@53ejfWaOAKH`hd zi+}iV(eH#07yTxE_!#(<510CxHn_A;(SOF^Vjs~z^if@26;Jxb2AA^AP@agvrMx!r zQG>r-vF`~+%M(*H|+oblli>U+wEOL;H(aH-!bK3w_huj=xMJmFvB!)^3m>%(Qf)aS#+ zKKTGXW^k#GG3<5H;7)m`e0YTNT{5`r(@A|;<60k{Zur?0A5L}j^mJ#_C95M{%*RWK zq27FaUzQXO-Zzxa?(yN?at zEKqCk#tXy6EvbDysl6#w)40ygAz7O!u~c!Ym?)(4viNuMXdl7q!|7+@irAZ{{Bf$m zGlk{SeCBXzM!(+u#s1DhAt!c-ZSLQkqiTW5pMV?LMd(Y7mPRPh{=6!4X(azdx|rUT z&ZJBGt?l_FwlG$Ym*R-A+LFn>+{TeiCKgYK-?bM~@N9?|QyH~Ku`RVbT`Z*vo!LY# znJN?|4dr|?70>6g9a>2Ha8j8{;&|?qiZMmQ2ANc`D8f@x<&w6G+&1J!vUrx0Uw5`x zif0q4q?57Ar<**pMae!}+L+ELKW@upa{GGXyYYa0DqGYBMb6gj#zHF9nJvW%s>Y3K zmQ+aZ&`2qnQ_alk9g-Ybfet~XV3 zqAc~$olT}_JnC8b4DBXW>Pi}YktBLsYGAysrWvkEcM)$-Hip2 zyEoOB+geDobtG|Gre@U7u{7O@B~E}9sO}B>drO6McDJ&*CUs{rBg2-DhlZ6OO3@uC zn)ZzDZ0w0%OC?CBiW;L_@jWT@!D)+@QprI?7v(cL3(;*`Y8Y)jT*q&rCX8zEh&<^% z(g{oQ>Ml}&nVfQMtD}(1+n?~=~NAz6Kecp}xK zTv$K%<%;4|ioO}Q!l%U%A!(XHOuVXe^=w*{%V!KmJ+`HXwGkvv_cva@r18$tRANNB zAKCMBx<9Aul0Jm;XHuPmgQ`R9N$(yi^_KRFr+46f8RJv2Tv~OT(hj5yn`u$;-Kh;U zP2~#)SM5&q+Z*<)Jk>MKA^nAV#`z1hLiOB}6W7qsszS|kJC%TgYkuuO>e*Ch`xEhk z(I9Qb43X*=@I%uLTOG$z& znN~wsRXS5$zV@|&0om;{Ro4(J6=)y3Wx(28qypNq>0#B0wT&=BNRO`C>xNu5#Wr$U zjTaluRr{e^j{i$^C7G-KtMD&wE9Nd8P%bJljeodc5J3 zGD!Qj_SLKO&|>N5SRt3d@ivU$t%U$h`WDY^p$~ zNnTnXHT6ka8%ENZr0V^YTOp?-g^x0pV>4&&ge@eUbSE;Ia%DWZbxSw-iLTg9ybz6a z{LublI#Ki#MCVwLCUP`QB)Co6)wy%8_9;<#7c&6|N7lx8Nk$vhx65;zJhu;}5_^2} zmJWV{Auh}^9VK4j+p|T7qHrcMW{x7|Y9A>S$W)t%BvyMo+q);7cL^$u43X(wKNpz2z6{*pkd4h^Vbd5MyHvP*GmE4>9iIEgDE$HrZES=cX zi?xItc>sEEPr)r5kcc-nhxEcs)D( z@sU(vzqXk>^%H$-(U}rzzm$m^&vG&-yu0%mi&^Smn!Y?AA7Qn|`wCh8G?Hah#9;@e zzWW`FAErrZdLdOR(9A5R0BVd*(|SZ^fjYultPvUI*QrBDTTt2RYadcnpS<)#9*tAaxSdsf zqMaM$2vwXtSD<5T=0r4+8A;+1>s)KnG=>1LBIVWbbJ0%d zzALj|RXY6x%!%P-u~r&cAmuVC9bYi*42$gAZyRyimI;Q$Dgn#28k&BCgp#jvZC}pI z?IJDLp-Y*Jmi8dC6GLxFXVW@g?euo5R^}10r6I+gbUF%li)?h$sLih#Z6+4FHKa>+ ze0Q8FFzJ*cUM`Z4(v$Oa6<5%cEF35|LNa3vOlQLgO?M>%KiqxVaC9Bh_Chw&beKjd=560Qi(ojlOm)6(co%lp7w+Suy5pG{(F%WH? z@oN{oj4d9PO|FntDe2UBy$O(j2#=-IjoZOc>klWp6!wQcEpYCZfVwpB_tdt+H;iS%%uX-d+@wuN|>ttUy3l{Rx- zri(Of8@hYC`<{{lZ0zpa(%IWFEyG- zDOYG#`ox*`VHg=lopCjf&!&rNh(l?%`SvJI+27Olpmi|g+s($OE-{7|ox0+g!R0;a zK^$F1JH1l3o9^xEG0*pk_a*JkW?rkYy+EiEOme)G>ez1g4p)g5ugqJ10#H ziL`rhF1H}s#;Ppns{3H2Qj2YO530VxbOxm%=}PFZn>AH+MC8pjYzkATXtzehM^syN zTC`C}ru402P*fbSQ4D(^iwIOiG+m)bsLZleLtR z*^e%gUl&YW)o&XW)&41G7HSan=5MwwvqCe~5?iZ}%u1_hYU-0N_-V}Vl)W69;4;1Q z%iE^M0vT|nTJ(rSFU!@ulx+LAw6rjn44x6@+QnU`^1Nq3Yb z&Oe?)cBeE?yHAw28fU< zo}}7O2vl1#UY{!KGEH*jsyVW6b!Qq#nt6ttEz6njjXubinFy|&T^{GWYWD~WM5bD) z!Stvtiw?R{x4YB^mm#&;OfX1G3n|6r*rw*EW*gu(yJ|biI;uY?7Mav%_S24?k_iiiLe721R)c%HGAMo!LU6Z=`P7 z&6BA&6|EBe5d3<5XN_bXEtooIUE#D?rGV;WM*MqYCi@aM0^mrZqQ#!6TBGbw6|KQ| zM(tT<*_&d?ZRu>3ELuBC;yzk+UBGs|A*9*N)L6PB%&9gnnX|~enRg}B9A(+^RgvPY z%ZkeO_`kuE3Ku5!e>>H2bz7|4UFl*Y)ehFv_?U0dT_qo0#&mt8fUm0kaxV>8%XWz@ zLFvL|HtC#+^_gRzsytTxpqXF`zizA4yBRmn2!3veFk5ys@b)WSr$j2RVA|OwgToQ+ z6pkT*Wv|{-XQ;qnGDzTN#ocK!8Z!#sF`@IOkvB`Obg+meG%J$}kSF0p0{(^^(su}sD#AbD$qR86d_SudBE*(~R{tWaQ-R%-@{^Aon} zNNMpRRyQo=tca6=RyQk4HrJgDws||-ZkqKB{vxD0m0Iukba}v%V`QxtzWO?;sUWtG zSD1Cn3f)sU1rJsTcx}DB9A(qoDf^A|ts&MWZFI~bGoP$%EaP_tCb9WE_ZCt~wp`@i zMjWSByB&k<-x%AgqGB63=zCeVtvuy*B2Y96%- zR$B7%s?x2qtCu*AJTjHuUlNkOU-rHQ#)p#+tx=~Y8XsNzkh7k?pQFwGT0ydyU!NR=j%mjr9St*Qvb_)x&K|b@g=g zvg^pEUQ@g5im!Y~>_Zy8o1Neu4u>f+qtLx(alNf34FhUz!#O958`_n-yXxO-;W^o| zESZ;G67y_OTAl7!q^~26PMNb()$!>zEZf9;({j{eCJ}m_L^|U+a^8;%Wn{b1wEG*R zQ3(_u=d*5WXKXdi{$?4PrY!07CO}au9Mgw#udA?0)NhI@a#CFWN(|!ratn-yn<_8N z{fb-Z?hP;4%z(+5E;>)}}+pDmm&!I>>m7BP`SW>ge;rVpy3ntOA+M4V^erYOZ_ zFOV}Cj+0WPVS1C$3w^!hR!eQ!3~=nB>Op$YA3}h$4bwuuJS=-w3I9frX;HGU<%$Lk zgUdU*ZF3h#_Q6y&IVbw=Ca~EjajL?pH^=#;wp1OsBeAMhs%wwzYZp@Ny(G*YH=gAb z&+0a78TR^Dko3ZjaRGkuC$*2`2! zMx*^J%)(Gu)?-KQfpT3+DpSotJNw4zwtUN&^I`(P@3NjKa4ea7(3soqMn|$ZRp+Fv%Rmg=P7&3R^NG|Z=4B^L8^h@ zAP404$zB!zt4?=0A!9khX@^|#u=k}hqJmg8aM*hTu`apVj>>1uZo9vCW9C}0{e)Gs z{0ND4gu9Gnd1r?=jH2|}s!m+j#>mcIyXqpPF)*={Ww9(+xcCwub&p4ymL*w%P>Jho zbu(C)d#CoX29jw-vpRtv@ix@;?wvm8a(#wdu}o_9hO~4|_v7^D%9Ak{b1-wJ!-74> zxvSYCm18)YnQe|OO36>L`_+kO#0K1eV3w%wC>eJYZuS?L8x|7}i{_TqqepXHaMgKg z_0_KPzBoM%`Rrn$OG{MmhaBiPw3i|U4b*?C6_mbnb-UZ`^F zNftJ;F)fo;l^n?W!jjiq*j!U{S+Ox>)=SYkbe?BnBer<-Wu#g*uAV(@r4TehpHXxj4C*r-sc2(Z=k&#A&l~nV z9=&=v2#%uiP%kw3 zV|{Zu-@%jKmsc|!pDorYuT*s_bGoXr`sOKA-j0F=b@=C3!cmd?qTI>$Ih*H))%VF{ zuhd`qR!9qz}0eJcm8eIZ&^{yXz5FM+^sc@N4Ejl@0K>g zzD7K$mTqdt8-6u%0G-nTJ-V8?XCF6Nlxvf^ASZDwCwlz-SDHN z6_sSe_D4-CYxEV)w8G*BFt~hMR{!SB^31pJ=uIkc_nxmjuQB&~<@rJ1vvcoPb0bUL z1P1C2FK|gIbV&tdMGDIA;i)T$bdOm4tf3RBtkr7M^wVwL`df+uqZ1Qm~o8F{UI)VS3Px8^dzGdx6 zrSgJv9;wcQ1_e-mdT;}Ea zicLQb*l)YrllG&JnmrXcu5k{9^j|0Q+K6m?RPSZ@v@^DRy}b*s|8L~ z-i9Wxo^qC_{!SY9sagmbA~a62SXAFgZ_HK0ztr-V$tPFN^_~L7(`9uhfr(6x$*(D- zbe{fYyJwf$@?9xvW#@Ubavqt$`F*E`er|fTSPA5=(%#TdoCa=2J%1%N1B+tfxz@atzI0vZC5u> zP|@f5W{ijz5vG?bRdvgpb+&2N+W}uoW^U$fs=l=`XUhtnBl#-GaW>aqZcyhj-BoY` zO3_eQvvGNw7xxDlX`8a?j0`HQRMa|7)-RxzUNbTVn7b<83`6Ef`W~k6sY`=Eojz%? z+}AIfnCdasluCxzHMym)KFS!wrVF=q88h|viws3(F!jX=pMOXd+*G?Wy6Ux=GY;!= zYE1SvMOXH{x#P@St&p*t8#4ON6=~yK9M;WB_EP1Rf!m47`fpiL{sD0x=j_LB!utF< zMzNnxvpn!89c%O3d2Vf!XiMjlv-7Ev&!XPQ*SxPMU-LWi&CP39UsaAO`Fe|3^w+$v zC*N!-JNoCS6W`KBCT`m9ZZl%8VlI6LL<_GQ=b2Q^{h-$@u1OO#o0Fzy6__-^DphG> zZQFZM!`ile3-?>nYEC14ve0CnFHq*@0=I8@T#diduL({$)jYwx)@X47%oh5V?L9pL zxxZ-TGkPwO&yWEh`Y@*h6a%TZ0AuD|z~qRz*2PSVmnJNOSNVMVP-d?vY2s%2f3IAy zAbyLPXQK0Rt%2n3ecpNBlDoolt(xG*F*Vt%iN}8N=MRzts|6{-Wfv#|X zY|^S6)z@e;*4nhl+O?%qz~tC~Tr{fjY5cQ#>lWyX4YYxC!J7;oF>ozV{_akPfsQEE zXZ}EIGbaDp<@$1y?hx5Tlikysf0TUF@v8kfJx4Q32iXVY{VR4dOkZreNbMbFdU(?e zXdkleBqGcP1RcA+ekekWJjr>zZ%R-1>Yq^FBnM|qVQ0@LOGZ+Cw}d4tmxWkx%{tyz zdyHHkVh$oV^5y*^y4Bij92={P>BH&`EKZ>i>)i8n&aBLf4_XUXS@IrB-eGaG*W-K4HwTxA3vaS= zDrUA}9VO6T#%wu%Y;qp5T(nj<5V$#AWgMnSj^UhbQ?uanvQ|&3{M%CU2btWCR?ScB zB=-yPh1mw@Lax}OWd6jDyu6@nkowaz;wZ+=nhg9;nn>wy=B~3BZZ#)WzU80UGrUQ96Qz$bIsTJIr$^rY zk~9DCnRC|T>*-fZK53W<{1EbgNdJ@aL0BK)NdMDQTe0kd)6d37X}pzHZT9 zzMHLolt*~$e0AZ-nb*!Tnvc+~_iFTuu*PL{Zzo!rbu>pJgKBG;gK#+yRc}G66<1)@ z;}dKimHu09ypHnaB2{m?@#^*ZY^fgQ_2iqXlm1pMN_-1Bb*p^#WL`~Y+zeh%zA>4S zRd&gnKWrrrNj*b=O-#2^&CO!a3sDL=a9xK zBf5H#MvgYM6C+Dq^_GF&r;n3frqQwvaB%)Elv!NKg>QM`S$Bxe?TnNzCI?N01ih`D zES3O%`^>Vf$dF^$fMLy9{Oj3OQp;|zzcSo3<^qONQ!30~AvF^E%J0+%Tyhd2YeY3? zH8<3m-!geof8L&J<04;p0(GU%y3`j2SjG%HP*>IQ*jO@qy$bW`sQA@7M;*G!O#&x3 z(ZxAa^Jr3!l7}jf{1G-j>P|Fpli0A}Ii$WrUEHnCVT}A`oZH!aNjg`)&Djfx0HKqI zx?kd^7vfDmZe7XQnlFF!(!)H>ZT9&-vGOh>F8uVeqQ0fcrl{OEY~tN=_Q#9y{SQFl zKBmN*yY|i%Qnm@LLM}HfSNY_5pZddnasKMmqgEnW;;*Fb5i)CdB&k#KTviBjMH1<3 z<~=HVcri6Aim^ek&f5c3{k-uW=^sQ6ykg#NcInnJU(s`HX9GyyKk#o6sZtxg&4o{+ zzKELjaqXuvR;Je~YU?>ywOA8sf;0oaddX4siH)|7jy8=h(wO(bIxceq7fQ*gwq28}eym#dO0&whPN zslXgW_Ib^`0q;=4hf~AqsuiUpAL(r!x>}dN?RNeqaW($K@(0sj`IqaJE`CAelY}o2t`P3{*Xxz%37;q2 z^0n)gjf77TzDBt7>(?uX2rm=9Pk7|=^~!G&t`pw#jq8=4B7B#y<(tq5Gd*8giWHAUs3d0m`iSOw;4pHw; zT?;%&5cvOx|MNCjN*(+W_WuSyxb%+%d49+B+4+8sxG(tPqda#Lo+JzqW_)SB$8!TT zslSE5y9jS1+;3 z^1Oy;e>ey23_*A$z9n5M^|M$?5AK(Rxm8~mQTJwIj61S*Sti^;SV)l1IDfy~|4DyA zWAe*ZA%eUt>HP6$eoabVW^(V*)`+tj8q4*!HJ07a3FalWbee~k=zvRP3ehocew+y#8PC8}yK>5C^)}Ma6hfBTPdXIFDbK)~>hgSIlc%rP;i1PpT(`? zl4kL=hfDds>BFUNKl)Ez{2K80Ui9z|@GpMV!~4L0;j)J(!GDxGo~!LK$AMLKe(BqD zZ`bk9DXUHWQZ+vDN4HeP2l4XPiJx=~PW%4$+`6|ktRK7Gvc8S#Gr#v* zAP2YvH~?G&ECYLh_v3U~lG1AGD4_&M|fMu2C4G2jJY9(V;f23$xdF#%i(oC3B2 zXMlac#>v+z8DIo>5Eug<1LlDzfn&h4zzN_*;1uv0a0a;OPAc+`C_k_f*a5VGJAn~k z2^a+)0mgvGfdjzPz%uY0a2$9UI0+2lXj8x?z!~5gp!LU;9~c29fl=TAU<~*IZ~%A$ zm^|M9iTVqo;EuT^4#1M`Ca zEA|IYehoVT?XQzRa0a;OE#!aswMqmy0PF&e0SACnz)@i1H(slZ0b{@yB_22_@xb#E z|IODbGr%Zt9-Y+~&<0Ke*8&^Ag+9P2a0oa6ECVNj$AH!h240hR;G(xv9AGmr`d$1DSO)F{jsr`; zY2XoHK^x z6Bq?f0rS91z;U2;59I?c23p^z-hmNd7cdVT0FDDkfm6USpmmLU2S$LCzyaWS;5cvw zI0c+{FMO||Col?J3(Ny!zzN_Ga2i+!HeP?NaugT^P5{fmSApZeY2Xy_D$uIDR%yJC ze1T2C0bmq32HXLh0_K61b-i*};(_D9N#H4=*Ilnn0VBXmz!*>_J(2qBm8HNuuoXBC z>;p~#GeE0>H61VtJO&&9o&=5o&jKfb7lAXtYd|~1x^x-xfz7}&umd;&+zFfpmVk|O z*jE6?fX9Jl;A!9_@Ep*(h5ZKLG_dg<(C1#StN~i{u2*`15nvKH06YL31HJ&91fBrS z0M7vJTd!9x0As)_z%pqB=7~`4DbXn@Hz)&eJhF`+NLUKs*Lfo0$r@F;K^I3e_9*DJ3A%fM;i6!5Cx{8IO#2>CQ&Phjkw z$ODe8xLz3*Jc1lxWG!}Di9Oa~7hq&Pb^(@w2Z1xd&?@q4MGkP{Vaf?CKSF;)y!9yM z0*(U@LeEF37vN+Y3TFW^`je&EFWY5!}`BSSra zmw^$%htVH64a@@vve*|mnIk`7K2Lg~7p_<4J&4}GCSZPqePp2h4E`gqjNZV>=dnMq z@q^^|5b}SXdIXk#33~&lfQN#Mv*~z=^-aPXzxf$_cc;L_X_DcL5wY2|NYN|2^Xa zaO}(E3ygjRe{Kc;SLzoS{TlWH<}c$XK>M5c88G%O{NZ8b03*POZ&NQo`wICA{eM#) zp???q0vrFG@;rhZ;8NfeFbbTw%3c(({2%;CJ#Yqi0+|0EdI7EP<2S$o;G##7e+~Zw zTI_lC0b{^X;23ZWIKV#E3E(8~3{dvGE&#`YSAY?#QfZ8m53mV1#(q@~Fw#(|WPk&6 zDwQL^ao~%#UZ~#~W&H#@{{DMkl5*S@b zdf+tB+F)5$xKgnN-p+m*FmiXL(h4khS1O~xDd2Izdn=W5K&!7(xdfbkx>7mZj(&+s z#$OpIxI0I|~T3PY|Mu9`X81Mja05}GWxDwT2I zH1Gn@Dw0n(zqbio0~`Z(0jGf_pjD!rz$xGb;J`?w()<`WFawP2MILYrcuwg1h<}{? zMzJ4oU_W%=#52h6L0%cV0LOrfH-mowy@2+!mC6Kg;AgSN7U=&SdjThaU0b0a!Ct@_ z;54xD=PH#@jB*0k0tbE`KLO@}r-2i|OTa~ll26?;+pM|+^XlHRFcdmmM}E+j5L%Bj z?*m%lc^ktEAG>`)DKu(5`sVfTT($Jx#X{#p+L$E1e<&F~eD zJsWy%&hzz$8YDhSSom?~jUgUF-{UJh;KYkw1B7cQn5P1*&;q`~w$Mif{q5QGG3c$( z8-Z3xG7UEh|BHk*F8@5CD>;)qdHf#zyy4e!Ji3&i*_9Ip({kovFHim(g&vW7ZRoY+ zuQmKZ`7!7sKS-CYv86TgEgOEDyewJln|zNN`4L5bvrC_V-s8&g?D;D6K9}y5Ya04a zm+tXjg`TWIZ>;A&eGPgO^pZ<|gR4&z`T>{j>AwT|L6`33n}>d+2K_Mf7i!SQp&zS3 zKL!1`OZVz)3i=6`?&)(0`bn4W*~h}gPS>C>hJMDSd*zKlKU;&|1^pa!UGHEpGpSQWoVAG!g5+3-h{pT9%w7L{5%3SI0U)PDkcE&IG$CEv6Ew2>c_a}|0m`!tf& zvyUgIiN{*@i9)YspB>OWfAj2_hc5cts=S^(4?~yoYP#odE&1W7XG#HU;N|`&OZeIxlgfwQY}9v z^5;G`@6auwZ&%4b3jd-%U_a-E{C``;|0?`zKFxmA4f&T6D; zNq6~k?31Z{=%f`e>Q|gh)2TUU-yeE3}ZWu>Cx) zq2@ot9U*Q?#nE{pKlDceqUt;^N_;E(-P0=G^|PYlFu9AIA^5Jqr^~0?hjv5TlK$>6 z@dsa~{&+U?9yNZ9LtprL_6Y;@Q_%aMM}2fD%M|njE?wzkKSx<4kITf36Q|pdDvQb^ zG~cpL)u1ndK2?Lh2KpuFGrqi~4tt4TBMzU9VdS1Eb)}X3f(F3Q%#y7G>2+_Zf@uULY!_2y-!DmWY+z% z$et$ckw0f2RQbn{M339gHar(PRIl>3=z1>yg_HMv5+8BqucC=feDjo3|8JLgd?VDs z!=X^LEiyA^o7~{dFV@^2jw4z-r@3l?W5uk=bIum;cRBw5{aMLD{9h&85p7grhF~ewQwH z5++=_$1isjUadiwI}6j$qe!sShP=*K?l8>zqElW^zT9cBUAi8NM1Q&Cu(k$W?mWa? zx~Graff#b>o_x6zQHHMd`7tDGUzIx&FS`6*zH(<`vIbr5P@H$===v8ujzHRy6DBk$5ZJ>`zZVOPFaF1fQY0o_*e)x1LW zfpUlAR1Gcd-}*7k4rAy%UAAvSQlpNFLyu|*PzRtkO=gs(uWOyV}H3Lvcu)~ z>Pzm7y#f*$$@r(B-=0q9F=&_|)K zsX-ru-cy7ABJ^Yp`XuxN(4(rnp54wvKko8-^cm=+Y{}uX@x3zi6VSCkczPa%e#WJH_MCuz!KHiruR_04 zgFX#?;a6tMzY2Y64SFL}fYuuHCg^=N=uzmI8uT5|57waPp&tv-WwbpE{Ur1WWuN6@ zA9o!RdP>l!p4DL}vF9oH*Zh-HF0US^p!YzJ!efPgj4$1XUxHq8`8~VIr1?k<`eNwE zT{&J~5rKZz<@f5P3;IRqw#padn))4pe%a;s@*Ra9x;UGE4EjRoQ6Ii8)@LJ$43Bi}1;4Ehr2T7OT^ zA?O`0-OINOJ>$yp?0FRW!5Z`l=*L_+E8X(G3jItC{%PnJYS6DjzXCm`?EI+6QS;J9 zra#SJb;{+Hw+VWOOZVzA3VkQ^ypr=CkrNgF+yVV0bX(Cq`^f#c(>3HAhJFruRPlTE z8Haw&rF-@~1%2tiIQ*WUOhNB~9<29E(33UzEzY}+)ZkwX{df(!+}k@1y{z=i@vX}% z_xP4xnq6MG*Vha^sE^$9>!?AOdw)A!x@Uj62Uvn0Rrz}Mk$Zv1T)Jl;xhHtWmE+Zy z+#9^$@_TaR9$|=ki(^XusFW)v^=Lys06nO`+%tTk23_tQo`4=zay|?R?1t0-UR)H z8uTdi6E)=TfPT)Ud-C(pueo&3Zx2IX%KcESr&o{T(0iZ7=H8to1(0iZ<>uVHxUk&~-=oy#p z^@lG)Kj_ju{U@OxbLpO)&qF_1gFXZOEOf1pc(|Se&m*gI(DP8Nkd#i-ZRpM4aOi7Y z`da7*UHU3TXK1lv&@VtQ%hqdXi0^QjqZc)1XNZelacl=-@;J!j4(Kr`R%nyZRbPAz z`WW=6qI-3468b5Z|52C!Ec6+d?#a0bz3G2D>x6EX{~Gi>bS>ZWxkWbXTj*LJEnmvk z41Egv1kY;GjQ-EoKd0^ibP<>Qu5uFoJ37>Xgw$F+@@&JQ zdfDkYNZi%`U_TjNv!00RE!t3;E#T+bwo`kxC*W(Wu-6Z6$wg(~94QZW)@D6N{PbLj ze}lwNg`9Os=wI1Q2v3JX%6Fzha-paS|7U}(NyB9sGj^H|gQ(AVfizaBsAX zbSs2GC9OJuP<_*6C{%!^HowpDz~=Wm99+!!(#w2_7am4V@>cGd@oa_k*@V!?p`V5x zRrK5W)@K%{pkHzMm2ZsCV`D~aeU7;E+yyPGG&-)1II*?dA8zFy=(vhg^5mRLRdV#% zTMmh@(lx4&+zIKixD+y%L4%KTuSDjnBI_dg&j3S@Q*LcnbkL=L40?ESUW*MB-af+d z`P{PthTbLo8+lS3Qq{86qxcR0d${+i`0l(h-*NaBQ4YoTeH!%*Hc(51xf;7;p|YSW+Qd*PgU&(3+SUN-oN7oIM7mcH@EJd#HS zp0Rt-xd9}^h9q?MTukZ=w>H zuEam3z;a+F?Hl_@+79B5KE&NRWSBMgL{u6-sKh6U?;`IBo-Mi1B<+^tABuL1#LM09 z^EZf>ypIz<^lqmOaCkx9PQNor+*#trp<1CRU#{#1qPVk4ZLN3mR(*m#AM7I1oIyo+ zoVSee9ljY=1}2N_Y1F%Y2a6|swLbKUrt>X&w~{9IFn0lYw#=Tazg%(`eUkVY75^uE zqqjbKQtzW3Al~Ngs@!QXcAIkdQ9`RQUwC?6Xs@K3k{-b(OpxYS2lwigFN)^j>Bk*C z!K7Gnw|$hmuj7h`i9TiN(5)==dxA}Ngz70L)X*sK(A>}$A-@v3&bNc`XiInp_Ko2; zQkkJ4zQU93zWhXk4tTC^!*}KgkMvsT>+pmgFy%O)>3rLSQPNy|61h?^-Tln?%OUnX z22bOF_F2Qz=$s2m{AuEHW7?4KI@H`tKmPJWqqxzl9)eZ0=m3zGPUbwBNLms3ZL z5W-P&wD_tZ1JB*6>beQOGf5{e?Ss0j)8ktg@geRNM@i)L-_mr&f0M)w5f@W&bNSY7 zNAfQdcZ@haemo>`-n##GFI_6KN>=DS6ohLD?^YOd zI^cQI_LZ@X3^V#z92=X9o1tffGave>q{GZ&Owj)zA3<>sv9i8p1O9V5`r}gBplZ>Q z5B;N1K{F~=YQE>4eEmH3Q2jts=#yTaqE&c;9F=WH;XU&|^>|~2x+RXb$z+lzvDs1L zlfTG#ED1u&kK8*M@~%kJhn%#^vE6#P2>UsSKZ+i6C9NtAZCc-1Rd)}FLigjIH+$D`k-(?d$&cJ^Oeq9&dTF54Dnz+`_ zIBTJWP{QN$7-@FO)5JX07s=73vYMnvh?jPH0-h;&qC8vr zo?4?SKlH26rxg9S`3^TeOPi21@_yEdKXi0gING>uA@&G$~|lP7&uIh8I#T!y&3ij&Eaz7r(6_7FEo+_;K+gNk$Jh!QXFxJ5tj*t|Mk@;yTQ6!EA= zzEXSiZInfxUL@|K8)r+LEqs&EcfLZsP~VomcQz4nJ6PpD>_LQuUoA64k1M1(^(T(6 zsbf8Gs+`K(&@>#@5};{Vj~bv0dZ zeI-xa<-c~ysO)arNH`4r_*v#UYMj`BWM_?i%ON32zjX;7i+7;f09IR=CfF8Uc&MSB zn|7i7pARo=dnG)t?d7lxXVxORm8J0h`mGM{hTG<}A8L3$^z5Aaug-s|?elG~w7tx0 zE^P}e(V_$XK$k|Aj--=3C(J!{RQu%bXe##z7zaI}z)z^QphTx6`dD5?4gTKAKQu!0<=xUX( zH#}8We>8l)t}}e0t|L5M*CT|#t0C~Q1sT{j8MZEA+Z-U!KFCJin{2+XQYnb<)XH;f zc&4uY$?(;>w(vCsmg~EO@XguQ)Hb+=yq!yVj|*`k?~wS!^WqcFhUy=m|5A8i$LH~i zSHhvk7qki5Wl)SLX<8XrkC9$_O`krV4SUIcJLPQ*nNKT!iTeC}IMlJA(?e7no<~7kJk9O#O^aHoV z%5&@gulX;(^7)tONxK$oo&VD3U(uav{g_bycyeJ~NZ;W`PO_;|`Are5bPUSb>d0wZ zaKK9|efczL&y)7#4by(uO#rLa$dEMjfZrbE)#>Pr%4H|3t_45krqpvidGGleY2PY& zVZklo#ckmw8^U%c77K^02;@9GSK&D#JWg3Qi2VB8d}myFY(cm4D0M0CPsiTL`<#-7 zkNCnVXi;cwLI~8Ge>{`)7vW99`zGP#6C+%OmWTGILh#bJ$@tVBw%;FK+8!3)>Ig@= z!}dsc>DF*lyMw+b(C{Byp!(+?wkIwl^Mkczrov0x!cA>TNGxo}!%MruO&h|^ZQ%%L zS9M<^K7I^&&F`vIaz>tNf4kh~w}~e@PC93CeR&#FcanaGKmC&? zefNT=c@pLgc(iKKlBRJz^NAlKO&@7GNOO`j?{@v%n_H-{RQk8~(q)lb)u7(Jpnkjt z8FQ+=*ki~&)?BHK82!zh#i^sG!%f|$@ngfL&Ee+9!;#0rc3*WS^oOLEcjl*%CGV)?f`AcH%xC3wL#d zd)mUWr$F%cDnII6P=w+icx9@f=6Tb|J-nt;d1JL))xWnR>i-FMJ*MQoHyqtxE!Db; z4EquK!v`ysl{cCvGX1O{t6}=C1@#{ZXWG@2w*D`|LmlBvTR6W(zRh!tluw2;U26Kf z*?IVhaAu>T)L#rIH-v}URl4r*KyNtHt)#Wr$gOQb{XR7zMw&m5ZRGJWrN(=CdS5u% zp>k&ujl}<^=Fd#I_l7f@!uh`Nz<#9#6g7S=d6Y4CeWmh0v4gM8;MdF#pA0W)3)}se zOlF2oi)mjF^I;^DzBY-RP%G<+8gky}Pu;oTnVM1`ua??_oKwggxPikT@PQt3Pc2sMn$G{kJ<~_{cE)Y3**@p0<4dKNd z;Uyi?#p^M!1WyPa8J{ID>DOhLWC+mgjGBsF^~$V$VSAA@7HQs8?Z>K*F?|4omb5VX zvHDTxi7{eUuiLqx*HHb_n9c=V;pR@2ypgQrZ)Qx8pL99$kukR!+6ic~lyvlN+^lR9 zlM&vitM<_4Z){A$`<)x>8+}qWye?_b&Qmem)fw*T2*>)u(XQHlUUqo5hPzVXo=xEx z5=0}bV$H7$-6I~SKMLO{`wTxSzM}4d+deSgvVL{`oG;yNeOi5=SKr^A|8YuoW}(o} zEj%pUjrvrq#=3cLo3p%b?Hl-G><(>t-Lm<;mi7KQzgSoIvvt_?Y~7r1)zy8WZq66$ ztgi{-Q2m@E^_Cb5yT3@dj6XHjS+SNnYhq`eH2_UM!tp5l0=o_DGw>t8h0rfCQM?U! zhK($l^K@-*kgIxXPwUOVo#0D=GM|zlCt@VE#z-vI8iz=st@$8QF!2Xj<{o&WK^;4Z zg%=Shq4h?>QSy^#xwn1?F!~FYbtiBh;ckL_t}~4}3b6tdSu?;7!~8wqABeL5$xo6p zIiGiYjK2X(*hqMSFi6--c%JY}gx@55k`Vk%QobmEOkwOU!X#l@by$w<^5?MZBTBQ1Lvx_rMy<5fIVkYtSL>~_ zgeijm5CbSZo2#X1i5#CK$M!1V`b&V%;;X~Nu$Lg(rBh>oLudBOl zVO?GLHo`sib$8s`PaMT5`>}?GyB-JcX=u26b3@(YE%gm| z4UpF$`R)b|A%B##`;qkwvVIa-2f%*{SwGG52cSI*JP7SMXwUO}i03Kv{7dxwEA;#u z;NJqzllO&&hCBbhp<&UN$@eSJ{t4Pe^8Xt7f4$+>yDm30ywPt5`cmbU0_C%*y?veC z)REei<|hT$w7k1z)$)~*2lNwvWxKe4SpHgj3qN0^;gIvh-*Qj2?9Ps~>>A-`O_!&W zR?ASlIApc(>m;PouvD-VkNK&)Dx{w{ej!x&^+P^W;!mt= z^Zfn<3C+)`kS<52e6=V|bgsLKMXN=ALWW<(@!Qe=e8nIQmTt8&Hp)kje0pruxbBB! z%+$E<31v*v_#6dg%+vTS3d$I%@wp1h*s1Y(3d-26@mm#a{FsBwh)f^u;(E# zcN^4)nR;4K0C zu>k(Q0R9sJ+-E-J|E{rkkn%n2j3_>0RFuIKHoPP6!~up z;PQ8`@(*ew-NDMDBYP}c~M^e_411wRk&^sjf&zkWFoKLh?3Mjz2{j_&f6L`nbl03HFK@$t8U$C$?t zz$@vu2IA%KU^yR=w5;ER3n$9?H-xyoUn#;{p7A;Elfe&VWbnU=E0*OL=}K!2jU@{#yb3 zPXqWr1n}>G|DKs|iu~6C@$!3j&PVjW*N4mKxW&>ddwlU9koY&k&wnZJhrr9e`W+9X|D?p5K|uKbQ1CZ-`Mm=EkgxyvQXu`e0=UH# zYTW0q3-y%BE&toWpY+LF9f)rSAM@qEMdE$_@)Wo;Uuk5%k_x2X7r=iJd}_T{o{xg( z&3vbko0}g4AHTESijs|#|1*K~UzYSt8pF(zf@7aDK=gfH@Y~RzenIdL2lzh`z+VpF7X@cc zD<4Te6Ns;8%4;vsov_$@F1Yg%eeMIF#(qLYm(qbqVGd zHjDl8dz(ILcCeblZ!IItWk_Xrr?aX4*`zAr@{^?f#gV-H!k3#=5#uAJTrwp;d+E}L zSoc*i%1>mck_-Xz9iP3mJzBHQl z$y(X6+In>B6WhcuP~B>)dVnauZk-s;_x5&jRdIK!)R8XcVIr+|2Fdz((Rcz&R4Vwsd$D$`<2{V%;xzq?b4v1*snH=60?|l zQ>D$yZ`!4*dic%2(n|7`Vir=RA%3Vm8g1XPqisWXzZ7#{Aze!O<*IVyc^FrIhj~kC zUq?^R#*u77YN3cJOk6UP$mEJuNe8h+Rjq2)wkLL=fc!Rerr+1vEMmo1*FI$B(JK{C z_UE#Rl-1wex0yCe-#{OfD)en`&*ZYHKDDnUT>L1tUtemXl*{-jsl)Cuy&PAbR-O`baD6`|m#%aaFu?52% z<6bIR<-Gmx=`Fom{p5I-CcM|k+Oea5b;}xSFqNxnFv(0%n?XFX%5!kE-2vmE&2W_y zb+9+9npUs;AbdRFd%dMxA+_qkhc={3-NlWn_pIR+^aR>ThnZkV2VG3joA^zkYhb%> zZsJ9{0;oK%SzD@d0}dIe@QBFgzwW69XLlnQnu@KK8!WO>hGH4lLfR^d#a6NI%BWx`Sn`u>XO?{`YFC$+ynL31mmq%z!GtzssXs;awSU&nwx z%Lm9sv<386wLECq8t&lqA$VJEU#bx7Nt_b&cCMDuD6x-b;tjU_^jgN2JoPgUCFm}E zV?a>hEY7I>CSTRMi^W7dTh*k7N3wx2cDplo@Oi%sJ-g`5vo*3#X8IX_3K+FN&!L8= z_9|MiZX+^mrqtO4qvz;oe?C_>PQkF^ z%RFK+TyZS(gMQ@RfNUeks!YyCBrGL3AH5pmbP0lN2MM2?nMgRyK9sXXD0~vu5M&u7 zeB%%#$h(FTM-l}afn0f0X@yVDSR}}O1m`2X^64OO^pz7nIeU>HuVOp-3SGjF6XXtp zJjg21lOo$u>jU@NEFf8IA;5cMG2^TOGav&!VfS zE^9Xl_wnp}oP38NIDB&EBVoc}0*Xz9SI#6HJ~<1L&~U-AhUSCC`foly*~64TQQVJ{ z??J;Sc9F9q3G?3XvRSryJOY$lgip?tB&_xA|2gu0#m6USO%h(vM@__dc0S?blQSp@ zXWJBu`f}ub(#I!fQxabF*xY&(nw)Tn{pG$(SEq9#rI{Uh=Ridr;gfqXJK=NUgwuJR z=2^-sd~(J$a09-7CSK}R_~h&>37;f%;Qag6o>wD_~fj};gd78N%$ru(tKtT}oML*e_C_mm{jsK2`1Vqi_T=+y@#NfiG z?r|Gj;v~qvr^s?XABB%=O76#b6ezypd?tF(k2Wkaw-7{C@o8ymetG$)8Z7zS*v`k1 G_x}OJ3*Wc^ literal 0 HcmV?d00001 diff --git a/doc/Changelog b/doc/Changelog deleted file mode 100644 index feb0794..0000000 --- a/doc/Changelog +++ /dev/null @@ -1,992 +0,0 @@ -# vim: set tw=75 ft=none : - -Current version: 1.20p35 - -For newer changes, see Metamod-P git repository commit log at: - http://metamod-p.git.sourceforge.net/git/gitweb.cgi?p=metamod-p/metamod-p;a=summary - ---- - -2012/08/08 1.19p34 - - Revert changes in 1.19p33 and start over with 1.19p32 code base - - Fix compiling with latest userspace headers and gcc-4.6 - - Disabled building x86-64 binaries as Valve has dropped x86-64 - linux server support. - -2012/07/27 1.19p33 - - Accumulated fixes and changes over time - - Fixes compiling with latest userspace headers and gcc-4.6 - - (introduced bugs, crashes, do not use) - -2007/08/12 1.19p32 -[Patch: Metamod-P v32 by Jussi Kivilinna] - - Changed GCC optimization flags based on performance monitoring results, - replaced '-O3 -funroll-all-loops' with '-O2'. - - Made 'Fix for engine_api varargs log calls with very long log string' - default on in sources so that MSVC compile is 1:1 with GCC compile. - - Made 'optimizations on META_DEBUG' always on in sources so that MSVC - compile is 1:1 with GCC compile. - - Fixed compiling META_PERFMON build with MSVC. - - Fixed compiling with MSVC fixed by Nikolay "The Storm" Baklicharov. - - [linux] Remake of dynamic linkent code. Parse dlsym function trampoline - instead of parsing ELF structures. - - [linux] Dropped AMD64 support since Valve doesn't support their AMD64 build - anymore and I don't have access to AMD64 machine to port new dynamic - linkent code. Sorry! - -2007/04/05 1.19p31 -[Patch: Metamod-P v31 by Jussi Kivilinna] - - Enabled 'regparam' for internal functions. Means that function arguments are - passed through registers instead of stack, which increases performance. - - Merged in changes from Metamod 1.19 that I didn't initially notice: - - Fixed a bug where plugins could not catch NewDLL calls for GameDLLs that - do not provide NewDLL information. - -2007/04/04 1.19p30 -[Patch: Metamod-P v30 by Jussi Kivilinna] - - Fixed safevoid_vsnprintf() on win32. - -2007/04/02 1.19p29 -[Patch: Metamod-P v29 by Jussi Kivilinna] - - crash fix that didn't work - -2006/03/04 1.19p28 -[Patch: Metamod-P v28 by Jussi Kivilinna] - - Removed use of __VA_ARGS__ (should be easy to port to msvc now). - - Reduced size of extra engineapi function slots from 128 to 16. - - Clean up code, removed use of likely()/unlikely() macros in places where - they don't give extra performance. - - Added MakeRequestID() API - - Added api for using hook tables from plugins (thanks to BAILOPAN) - - Re-enabled fix for engine_api varargs log calls with very long log string. - -2005/08/24 1.18p26 -[Patch: Metamod-P v26 by Jussi Kivilinna] - - Fixed newapi functions not active on mods that don't use newapi. - - [win32] New is_gamedll() code. - - [linux] Fix for buggy DT_HASH in library walker function. - - Following features were removed to improve stability. These changes were - not present in metamod.org version: - - Removed fix for engine_api varargs log calls with very long log - string. - - Removed optimized version of GET_USER_MSG_ID() for metamod-bots. - -2005/08/24 1.18p25 -[Patch: Metamod-P v25 by Jussi Kivilinna] - - Added mutil::IsQueryingClientCvar(). - - Added support for new HLSDK-API functions: - - enginefuncs_t::pfnQueryClientCvarValue() - - NEW_DLL_FUNCTIONS::pfnCvarValue() - - Fixed reloading and unloading of plugins that haven't been loaded - correctly. - - Fixed loading of plugins that needed changelevel to activate. - - Linux x86 and Windows binaries are now compiled for i586 since there is not - performance difference compared to i686. - - Fixes to improve stability on win32. (thanks to Blackhawk) - - Changed to use mingw-gcc 3.4.2rc - - Changed optimization flags, replaced '-O3 -ffast-math' with '-O2'. - - Minor performance tweaks. - - Changed to use mingw-gcc 3.4.2rc, mingw-gcc 3.4.4rc emited extra code - to zero stack memory which lowered performance. - - Changed API hooks to give structure offset to main API hook function - instead of pointer, which increases performance on linux-i586. - - Raised META_INTERFACE_VERSION to "5:12". - - Fixed metamod_version cvar to show "1.18p25" instead of "1.18.0p25". - - [linux] Improved dynamic linkent code. - - [linux] Static linked with libgcc. - -2005/07/27 1.18p24 -[Patch: Metamod-P v24 by Jussi Kivilinna] - - Updated to match latest metamod.org version. - - Removed mm-p-extensions-API, since loading/unloading plugins functions - are included in Metamod 1.18 in mutil-API. - -2005/04/22 1.17.4p23 -[Patch: Metamod-P v23 by Jussi Kivilinna] - - Fixed broken RegMsgList caused by optimization for mm-bots. - - Fixed optimization for mm-bots. - - [linux] Removed ESF-Mod fix. - - [linux] Minor performance tweaks and reduced filesize for linux. - -2005/04/08 1.17.4p22 -[Patch: Metamod-P v22 by Jussi Kivilinna] - - Optimized GET_USER_MSG_ID() function for metamod-bots. - - Minor performance tweaks. - - [linux] Looks for gamedll for Earth Special Forces Mod from 'linuxdlls' - directory after checking 'dlls'. - -2005/03/25 1.17.4p21 -[Patch: Metamod-P v21 by Jussi Kivilinna] - - Fixed 'meta reload' not working on plugins that have failed loading. - - Fixed bug with handling of metamod-plugin-bots, which might have caused - problems depending on order of loaded plugins. See 'call_count' in - 'api_hook.cpp' for details. - - Minor performace tweaks. - - Changed all non-fatal error messages to warning messages. - -2005/03/05 1.17.4p20 -[Patch: Metamod-P v20 by Jussi Kivilinna] - - Fixed bug with metamod.dll not having working relocation: - - Makefile doesn't use 'dllwrap' for linking windows dlls anymore. - - Minor performance tweaks. - - Updated mini-hlsdk to 'official 2.3+patches' version. - - Fixes to improve stability: - - Added fix for broken 'vsnprintf' for win32 and some glibc versions. - - Fixed wrong api-hook function for 'ClientConnect' in 'api_info.cpp'. - - Fixed wrong integer type for CRC32_t in 'hlsdk/common/crc.h'. - - Removed 'metamod_compat-i386.so' from linux binary release. - -2005/02/27 1.17.4p19 -[Patch: Metamod-P v19 by Jussi Kivilinna] - - Performance tweaks mainly for AMD64 (minor for i386). - - Linux-i386 (metamod_i386.so) binary linked against glibc-2.1.3 for better - compatibility. Compiled using gcc-3.3.4-glibc-2.1.3 crosscompiler available - at: http://forums.unitedadmins.com/index.php?showtopic=44048 - - Binaries not linked against libstdc++ anymore for better compatibility - (see: new_baseclass.h). - -2005/02/25 1.17.4p18 -[Patch: Metamod-P v18 by Jussi Kivilinna] - - Fixed AMD64 support. - -2005/02/19 1.17.4p17 -[Patch: Metamod-P v17 by Jussi Kivilinna] - - Renamed 'Metamod All-Mod-Support' to 'Metamod-P'. - - Fixes to improve stability. - - Minor performance tweaks. - - Merged updates from Metamod 1.17.4, - http://www.sourceforge.net/projects/metamod/ - - Added Mod recognition for Brain Bread 1.2, Snow-War 2.0 and - Gangsta Wars 2.7. - -2005/02/13 1.17.3p16 -[Patch: All-Mod-Support v16 by Jussi Kivilinna] - - Fixes to improve stability. - - Minor performance tweaks. - -2005/01/10 1.17.3p15 -[Patch: All-Mod-Support v15 by Jussi Kivilinna] - - New optimization which reduces binary size more than 50%. - - Changed '-march=i586' to '-march=i686'. This means this binary - doesn't work on Pentium/K6 processors. You need PPro/Athlon - or newer. - - Removed 'Active API Hooks' optimization. - - Removed 'memory write detection' code. - -2004/11/27 1.17.3p14 -[Patch: All-Mod-Support v14 by Jussi Kivilinna] - - Remake of new callback API. - -2004/11/27 1.17.3p13 -[Patch: All-Mod-Support v13 by Jussi Kivilinna] - - New callback API for plugins to load/unload other plugins. See - 'mm_pextensions.h'. - - Fixed a minor memory leak when reloading plugins. - - Minor fixes on 'memory write detection'. - - Minor performance tweaks. - - Moved p13 code from osdep.cpp/h to osdep_p.cpp/h - -2004/11/17 1.17.3p12 -[Patch: All-Mod-Support v12 by Jussi Kivilinna] - - Fixed crashing with 'memory write detection' (part of 'Active API Hooks'). - - Improved 'memory write detection' code. - -2004/11/16 1.17.3p11 -[Patch: All-Mod-Support v11 by Jussi Kivilinna] - - Added new 'Active API Hooks' optimization, speeding up handling HLSDK-API - functions that are not hooked by any plugins. - - Added new command 'meta active' to list active hooks. - - [linux] 'metamod_i386.so' is compiled with gcc-3.3.4 now. If that version - doesn't work for you, use 'metamod_compat-i386.so'. - - [linux] gcc-2.95 compiled binary is now 'metamod_compat-i386.so'. - - Merged updates from Metamod 1.17.3, - http://www.sourceforge.net/projects/metamod/ - - Added Mod recognition for Zombie Panic Beta 0.91c, Out Break 1.0, - Operations 1942 v2.0, The Trenches 1.0-Beta, The Ship V0052. - - When reloading plugins honour their load time settings. Does no longer - attempt to reload plugins when the loading after the unloading would - fail due to a load time conflict. - - Fixed only loading one plugin when multiple plugins with the same - prefix were used, e.g. mm_pluginA.dll and mm_pluginB.dll. - - Fixed a minor memory leak when unloading plugins. - - Fixed potential bug initializing plugin incorrectly after unloading - and loading plugins. - -2004/08/31 1.17.2p10 -[Patch: All-Mod-Support v10 by Jussi Kivilinna] - - Merged updates from Metamod 1.17.2, - http://www.sourceforge.net/projects/metamod/ - - Fixed a memory leak the size of the gamedll when extracting a missing - gamedll from the cache file on Windows Steam servers. - Found by Wei Mingzhi. - - Made game directory lookup case-insensitive. - - Added MOD recognition for The Terrorist Revenge 0.2.1, Pirates, - Vikings and Knights Beta 2.1, CSV15 (Counter-Strike 1.5 for Steam), - Adrenaline Gamer 6.5 and up. - - Changed MOD recognition for Adrenaline Gamer 3.x. The 3.x version of - the MOD is now being deprecated and support will be removed from a - future version of Metamod. It can currently still be used by renaming - the game directory from "ag" to "ag3" or by explicitly specifying the - gamedll. - - Improved parsing of plugins.ini file to not report errors on empty - lines and commented out lines that start with whitespace. - - Added "lin32" and "lin64" keywords in addition to "linux" keyword for - plugins.ini file to support using the same file for the same game on - both 32bit and 64bit servers. The "lin32" and "lin64" keywords - override the "linux" keyword when used on the same plugin. Do not - use "linux" when using "lin32" and/or "lin64" keywords for the same - plugin. - -2004/07/28 1.17.1p9 -[Patch: All-Mod-Support v9 by Jussi Kivilinna] - - [linux] Amd64-support. - - [linux] New version of osdep.cpp:is_gamedll(). - - Reads ELF directly and doesn't use external libraries. - - Binary isn't linked with BFD library anymore, reduces filesize to - less than 500kb. - - More optimizations on META_DEBUG macro. - - No more 'fast' compiles, META_DEBUG is optimized enough now. - - Added '+localinfo mm_clientmeta ' setting for disabling 'meta' - client-command. - - Added 'clientmeta' config.ini setting. - -2004/07/04 1.17.1p8 -[Patch: All-Mod-Support v8 by Jussi Kivilinna] - - Fixed memory leak in linux version of osdep.cpp:is_gamedll(). - - Fixes to improve stability. - - Optimizations on META_DEBUG macro. - -2004/06/06 1.17.1p7 -[Patch: All-Mod-Support v7 by Jussi Kivilinna] - - Official support for All-Mod-Support versions at http://koti.mbnet.fi/axh/ - - Merged updates from Metamod 1.17.1, - http://www.sourceforge.net/projects/metamod/ - - Added MOD recognition for Hostile Intent 1.1. - - Added MOD recognition for Natural Selection Beta 3.0. - - Added MOD recognition for CS13. - - Added MOD recognition Rocket Crowbar 2. - - Added MOD recognition Counter-Strike:Condition Zero. - - On Windows Steam servers extract the gamedll file from the cache file - if it is missing in the dlls directory. - - Added Patch-messages. - - Added '+localinfo mm_autodetect ' setting for disabling - autodetection of gamedll. - - Added 'autodetect' config.ini setting. - - Small tweaks and optimizations at various different places. - -2004/05/21 1.17p6 -[Patch: All-Mod-Support v6 by Jussi Kivilinna] - - Tweaks and optimizations on osdep.cpp:is_gamedll(). - - [linux] Added architecture check for i386 and x86-64 to is_gamedll(). - -2004/04/27 1.17p5 -[Patch: All-Mod-Support v5 by Jussi Kivilinna] -2004/04/26 1.17p4 -[Patch: All-Mod-Support v4 by Jussi Kivilinna] - - Amd64-test versions - -2004/04/25 1.17p3 -[Patch: All-Mod-Support v3 by Jussi Kivilinna] - - Automatically searchs for gameDll for new mods that are not included in - internal mod-list. - - [linux] Cleaned up osdep_linkent_linux.cpp, might work with x86-64 build - now (not tested). - -2004/04/24 1.17p2 -[Patch: All-Mod-Support v2 by Jussi Kivilinna] - - Extra functions slots are now passed all the way to the gameDll now too. - - [linux] New method for dlsym hooking, no need for metamod_linkent_tool.so anymore. - - Made mm_* functions in dllapi.cpp and engine_api.cpp static. - - Made mutil_* functions in mutil.cpp static. - -2004/04/22 1.17p1 -[Patch: All-Mod-Support v1 by Jussi Kivilinna] - - Removed dependences on game.dll structures (CBasePlayer). - - Replaced UTIL_ShowMessage with META_UTIL_ShowMessage. - - [win32] Replaced entity linking with PE dll-export-table combining. - - [linux] Replaced entity linking with dlsym hooking. - - Removed entities from linkgame.cpp - - Added 128 extra function slots on enginefuncs_t structure for future engine updates. - -2003/11/15 1.17 - - Added support for recently added routines in the HL Engine: - SequenceGet() - SequencePickSentence() - GetFileSize() - GetApproxWavePlayLen() - IsCareerMatch() - GetLocalizedStringLength() - RegisterTutorMessageShown() - GetTimesTutorMessageShown() - ProcessTutorMessageDecayBuffer() - ConstructTutorMessageDecayBuffer() - ResetTutorMessageDecayData() - - Removed mod recognition and entities for Master-Sword v1.3, at the - request of the Mod's authors. - - Added mod recognition and entities for HL-Rally vBeta 1.0, Kanonball - v1.01, Over Ground vBeta 1.0, Project Timeless vBeta 1.0, Underworld - Bloodline v2.0. - - Additional entities for The Battle Grounds v1.2.1, Firearms v2.8. - - Additional entities "env_rain" and "env_snow" used on some CS maps. - - Added "metamod_version" cvar that can be queried from game browser - clients. - - Added "meta" client command similar to the console command, providing at - this time only "list" and "version" subcommands. - - Introduced basic config file to provide more reliable and more - flexible options passing, in addition to the current +localinfo method. - - Default filename: addons/metamod/config.ini - - Options include: - debuglevel - gamedll - plugins_file - exec_cfg - - Added option "+localinfo mm_configfile " to override default - config.ini pathname. - - Added "meta config" console command to display result of config - file and localinfo options. - - Added "meta require " console command, to exit the server if the - specified plugin is not found loaded and running. Intended for use in - server.cfg or metaexec.cfg. Suggested by Florian Zschocke. - - If a specified override gamedll pathname is invalid, Metamod will now - exit with an appropriate error, rather than falling back to the - auto-detected gamedll. This should provide more useful feedback in such - situations. - - Added GINFO_REALDLL_FULLPATH for mutil GetGameInfo, to return the - (supposed) "real" dllpathname, ie in case gamedll is overridden. Needed - specifically for plugin "SinglePlayer". - - Raised META_INTERFACE_VERSION to 5:10, for GINFO_REALDLL_FULLPATH. - - Now recognizes "/dev/null" as valid for path options (pluginsfile, - execcfg, configini, etc), for when an empty file _is_ desired. - - Fixed loading of plugins.ini to detect duplicate plugins (by full - pathname). - - Added doc/config.ini with comments to document the file. - - Renamed doc/metamod.ini to doc/plugins.ini, and added comments. - - Internal changes: - - Added conf_meta.cpp, conf_meta.h for config file handling. - - Created full_gamedir_path() to centralize code for testing absolute - path, prepending gamedir if necessary, calling realpath, and - normalizing pathnames. - - Most paths are now stored and operated on as fullpathnames, rather - than gamedir-relative pathnames. - - Now using fopen() rather than LOAD_FILE_FOR_ME when reading text - files, in particular due to fullpathnames. - - Errorcheck for absolute paths as mm_execcfg filename, since - servercommand("exec") won't accept absolute pathanmes. - - Added debug messages to valid_gamedir_file(), for checking why it - failed to use a specified (config.ini, localinfo) path. - - Simplified logic in cmd_doplug() to not require re-mapping pcmd to cmd - string. - - Fixed Makefile to always recompile meta_api.cpp for changes in - info_name.h. - - Split lookup_game() into setup_gamedll and lookup_game, to better - organize for storing gamedll->real_pathname. - - Source and documentation files based on the list of supported - game/mods are split into their own files (games.h, - supportedmods.html), so they can be generated from a local database - rather than maintained manually. - - Makefile now using gcc-2.95 explicitly, to avoid using gcc3 at this - time. - -2003/08/02 1.16.2 - - Mod recognition and entities for The Point of No Return v.Beta 4.0. - - Even more entities for The Specialists v.Beta 2.0. - -2003/07/30 1.16.1 - - Mod recognition and entities for Master-Sword v1.3, The Wastes RC 1.2, - and Monkeystrike v1.2. - - Additional entities for Natural Selection v2.0, The Specialists v.Beta - 2.0, Earth's Special Forces v.Beta 1.1, The Battlegrounds v1.2, and - International Online Soccer v2.0. - -2003/05/08 1.16 - - Added support for Server_GetBlendingInterface() in order to allow client - and server to properly coordinate custom player model blending. This - should fix the issue with mismatched hitboxes observed with CS and DOD. - - Mod recognition and entities for International Online Soccer v1.0 and - Morbid Inclination v1.0. - - Added studioapi.{cpp,h} to provide Server_GetBlendingInterface. - -2003/05/03 1.15.3 - - More additional entities for Day of Defeat v1.0. - -2003/05/02 1.15.2 - - Mod recognition and entities for Rival Species vBeta 1.0, Public Enemy - vBeta 1.0, and Bumper Cars vAlpha. - - Additional entities for Day of Defeat v1.0, Sven Coop v2.1, WormsHL - vBeta 3.0, and Natural Selection v1.1. - -2003/04/09 1.15.1 - - Additional entities for Firearms v2.7 and Desert Crisis v1.5. - - Fixed mod recognition for Adrenalinegamer v4.x and later. - -2003/02/12 1.15 - - Additional entities for VampireSlayer Chapter V. - - Fixed entity name "TS_PowerUp" for The Specialists 1.5; should fix - precache error for "models/powerup.mdl". - - Added DLFNAME implementation for win32, provided by Jussi Kivilinna. - Thus, "meta info " will now list registered commands and - registered cvars under win32, rather than just under linux. - - Now dynamically allocating lists of registered commands and registered - cvars, rather than a fixed limit of 1024 (and before that, 512). Based - on code provided by Jussi Kivilinna. - - Console listing of regcmds/regfuncs now also shows currently allocated - list sizes. - - Replaced valid_file() using LOAD_FILE_FOR_ME with valid_gamedir_file() - using stat(). Thus, it should no longer find unintended files under the - "valve" subdirectory. - - Normalize filenames under win32 to use slashes (/) and lowercase chars, - to get rid of mixed-slashes (ie "half-life\cstrike/dlls") and to - simplify pathname comparisons. - - Also, canonicalize filenames under both win32/linux to remove ".." and - redundant "/" path components, to provide more reliable pathname - comparisions. - - If meta_CVarRegister fails to find a corresponding plugin for a cvar, it - now logs only a Debug message rather than an Error message, as a cvar_t - that's malloc'd by a plugin can't be traced back. Problem reported by - Olo. - - In plugin trace, added "classname" to DispatchSpawn output. - - Added is_absolute_path() to centralize the logic, and to be more - OS-precise. - - Split meta_init_gamedll() from meta_load_gamedll() so that the correct - and normalized Gamedir is available earlier in the code. - - #define NAME_MAX and PATH_MAX to the correct win32 constants, rather - than using (inaccurate) internal values. - - Renamed internal classes RegFunc to RegCmd, to provide more easily - associated names. - - Lots of internal file organization changes: - - Removed superfluous symlinks in docs dir. - - Renamed toplevel doc files to *.txt. - - Added Config.mak to toplevel dir, to provide project name and subdirs, - so that toplevel Makefile can be used for multiple projects. - - Added copyrights to Makefiles. - - Added blurbs to engine notes for FunctionFromName and NameForFunction, - based on investigation of singleplayer support. - - In source Makefile, added support for compiling linux-only or - win32-only projects. - - In source Makefile, fixed vdate.o to properly compile for each link. - - Removed tmp files in msvc dir (.ncb, .plg). - - Added copyright/GPL blurb to *.rc files. - - In stub/meta_api.cpp, comment out unused variables rather than doing - "if(var)" to satisfy gcc -Wunused. - - Reduced vers_meta.h to just the version and other common info, and - create info_name.h for module-specific name, desc, etc, so that I'll - only have to edit 1 file when increasing version/date for all the DLLs - distributed with Metamod. - - Made res_meta.rc common among Metamod and the plugins, rather than - having a separate res_plugin.rc. - - In source Makefile, added "--include-dir" args to windres, so it can - find the now common vers_meta.h. - - Source Makefile now copies targets into ../dlls, rather than doing - that only for comprehensive "dlls" targets. - - Added "-fno-exceptions -fno-rtti" to possibly reduce code size, - suggested by Jussi Kivilinna. - - For plugins, renamed ie "mm_wdmisc" to "wdmisc_mm" where it was missed - earlier. - - For plugins, better organized common code, to make it more adaptable - to other plugin projects (ie, singlep). Ie, plugin_query, - plugin_attach, plugin_detach; moved plugin welcome banner to - meta_api.cpp; etc. - - Added tools/stlfilter to help hide -Weffc++ warnings from g++ STL - headers (although not using STL at this time..) - -2003/01/24 1.14.1 - - Properly recognize win32 full pathname from GetGameDir. - - Added "#include " for getcwd() under MSVC. - - Trace plugin: Changed AlertMessage formatting, ie from - "atype=at_console/1" to "atype=at_console(1)". - - Stub plugin: fixed to compile under MSVC again. - -2003/01/23 1.14 - - Fixed to handle new behavior of engine routine GET_GAME_DIR under HL - 1.1.1.1 (CS 1.6) beta, where the routine no longer returns the - fullpathname of the game directory, but now returns only the string - passed to hlds as the argument to "-game" (pointed out by Alfred - Reynolds). - - Added meta-util function GET_GAME_INFO to return various string-based - information about the gamedll (name, description, gamedir fullpathname, - dll fullpathname, dll filename). - - Raised META_INTERFACE_VERSION from 5:8 to 5:9. - - Added FAQ. - - Some docs touchups. - -2003/01/18 1.13.4 - - Additional entities for betas of Counter-Strike 1.6 and TFC from HL - 1.1.1.1. - - Added missing #include "osdep.h" to several files, to make sure things - like win32 vsnprintf are defined. - - In stub plugin, added engine_api.cpp, to provide example framework for - hooking engine routines. - - In trace plugin, changed logtag to all caps. - -2003/01/12 1.13.3 - - Additional entities and updated mod recognition for Earth's Special - Forces Beta 1. - - Mod recognition for Retro Firearms 2.5. - - Increased max allowed plugin functions and max allowed plugin cvars from - 512 to 1024. - - Fixed UTIL_VarArgs and UTIL_LogPrintf (copied from SDK) to use proper - bounds-checking (to help prevent buffer overflows). - - Updated Copyright to include "2001-2003". - -2002/11/26 1.13.2 - - Mod recognition and entities for Azure Sheep v1.0, BuzzyBots v2.3, - Outlawsmod v.Beta 1.5, The Specialists v.Beta 1.0, and StargateTC v.Beta - 2.2. - - Additional entities for The Battle Grounds v.Demo 1.0, Firearms v.2.6.5, - Global Warfare v.Beta 2.0, and Tour of Duty v1.1 Beta. - - Updated mod recognition for Rocket Crowbar v1.9. - - Compiled against HLSDK 2.3. - - Corrected missing "const" in vdate.h (noted by Ravenous BugBlatter - Beast). - -2002/10/06 1.13.1 - - Mod recognition and entities for Digital Paintball v1.0, Dragon Mod Z - v1.7, Holy Wars v.beta2, and OeL Half-Life v4.0. - - Additional entities for Adrenalinegamer Mod v6.0 and Natural Selection - v1.0. - - Corrected a cast in os_safe_call (from Olafur Osvaldsson). - -2002/08/24 1.13 - - New config file names and locations, per the Addon Development Standard - rev 1.00. Default config files are now: - - $gamedir/addons/metamod/plugins.ini - - $gamedir/addons/metamod/exec.cfg - - File "metagame.ini" no longer supported. - - Additional entities for WormsHL beta 2.1. - - Mod recognition (no entities) for Retro Counter-Strike 2.5. - - Added release_notes.html. - - Added function "valid_file" in support_meta.h. - -2002/07/11 1.12.4 - - Additional entities for Day of Defeat beta 3.0 and Tour of Duty 0.9.0. - - Mod recognition and entities for Natural Selection 1.0. - - Added "$pg" string for /usr/bin/ident. - -2002/07/01 1.12.3 - - Mod recognition and entities for Valve's Ricochet mod. - - Additional entities for Tour of Duty 0.8.0. - - Moved common code from LINK_ENTITY_TO_GAME to a function, rather than - duplicating the code in ~2000 expanded macros. Based on code from Jussi - Kivilinna . - -2002/06/04 1.12.2 - - Even more entities for Firearms rc2.6. - -2002/05/29 1.12.1 - - Mod recognition and entities for Desert Crisis 1.1, Tour of Duty 0.6.7, - and Train Hunters beta 1.0. - - Additional entities for GoldenEye 1.9C and Firearms rc2.6. - - Fixed meta-util function GET_PLUGIN_PATH to return the full path as - intended, rather than a partial path. - - Updated Copyright to include "2001-2002". - - Fixed Makefile to not update .tags or .htags by default. - -2002/04/22 1.12.0 - - Updated for HL 1109, which adds one Engine routine: - const char *GetPlayerAuthId(edict_t *e); - - Mod recognition and entities for The Battle Grounds 0.6, Gangwars Beta - 1.0, and WormsHL Beta 2.0 - - Additional entities for Day of Defeat beta 2.0 and Oz 2.5. - - Changed error message "user message registered again" to a debug message - (level 3). - - Fixed compile problem under MSVC with strcasecmp. - - Added meta-util function GET_PLUGIN_PATH, so a plugin can know from - whence it was loaded. - - In trace plugin, added more trace info for EngineFprintf, ServerPrint, - IsMapValid, GetPlayerUserId, GetPlayerWONId, GetPlayerAuthId, - CVarGetFloat, CVarGetString, AllocString, Time, IsDedicatedServer, - GetCurrentPlayer, GetPlayerStats. - -2002/02/08 1.11.2 - - Hopefully complete list of entities for Day of Defeat beta 2.0. - - Don't complain for NULL routines in gamedll's NEW_DLL_FUNCTIONS. Should - solve "Couldn't find api call: dod.dll:ShouldCollide" errors with DoD - b2. - - Changed default for newapi ShouldCollide() from 0 to 1, per Mugsy@DoD's - observations. - -2002/02/03 1.11.1 - - Mod recognition and entities for Snow-War 1.0, and Earth`s Special - Forces version Alpha 2.0. - - Additional entities for Oz 2.4.1, Svencoop 2.0, and partial entities for - Day of Defeat beta 2.0. - - Added check for duplicate UserMsg registration (should help resolve - recent "reached max msgs 256" errors). - - Dropped leading zeroes in version number. - - Tweaked "interface version" log message to help reduce confusion. - - Compiled with updated version of mingw; should help reduce dll filesizes - found in the previous release. - - Some additional debugging in gamedll entity linking. - -2001/12/17 1.11.00 - - Mod recognition and entities for Weapon Wars v0.3. - - Additional entities for version 1.2 of Global Warfare. - - Linux binary linked against glibc-2.1.2 for better compatibility. - - 'meta game' now lists user messages registered by gamedll. - - Added meta-util functions GET_USER_MSG_ID and GET_USER_MSG_NAME, so - plugins that need to know RegUserMsg name/id mappings (like bots) don't - need to be loaded at server startup. - - Raised META_INTERFACE_VERSION from 5:6 to 5:7. - - Fixed NUM_FOR_EDICT error in pfnCenterSay (from Fritz Elfert). - - Re-fixed set_new_handler for MSVC (from Fritz Elfert). - - Fixed meta_AddServerCommand; was registering plugin's command string - rather than local string, causing segfault on plugin unload. - - Changed trace plugin to use GET_USER_MSG_NAME instead of local list. - - Added 'const' to 'char *' arguments in DLOPEN and DLSYM macros. - - Commented out names of unused function paramenters, to satisfy "gcc - -Wunused" without generating MSVC errors. - - Added '#pragma warning(disable: 4390)' to disable "empty controlled - statement" warnings in MSVC. - - Updated MSDN url references. - -2001/09/19 1.10.00 - - Updated for HL SDK 2.2, which adds two Engine routines: - qboolean Voice_GetClientListening)(int iReceiver, int iSender); - qboolean Voice_SetClientListening)(int iReceiver, int iSender, qboolean bListen); - - Mod recognition and entities for "Scientist Hunt" v1.2 and Existence - Beta 1.3. - -2001/08/01 1.09.00 - - Mod recognition and entities for 'Wanted!' v1.5. - - Mod recognition for Adrenalinegamer v3.2 and v4.1 (no special entities). - - Additional entities for version 2.3 of Oz Deathmatch. - - Additional entities for version 1.0 of Wizard Wars. - - Additional meta-utility function CALL_GAME_ENTITY. Raised - META_INTERFACE_VERSION from 5:5 to 5:6. - - Added proper GPL notices. - -2001/07/06 1.08.02 - - Added mod recognition and entities for Gunman Chronicles. - - Added list of supported mods to docs. - - Updated MSVC project/workspace files to match recent source changes. - - Fixed problem with set_new_handler compiling under MSVC. - -2001/06/30 1.08.01 - - Updated for Day of Defeat v1.3. The name of its win32 dll changed (was - mp.dll; now dod.dll). No new entities. - - Added mod recognition and entities for Rocket Crowbar. - - Fixed problem with windows internal DLL version (don't use leading - zeros as compiler will assume it's octal notation). - -2001/06/16 1.08.00 - - Allow specifying/overriding various things on the command line, via - "+localinfo". Fields are: - - mm_gamedll - a bot or other dll, instead of the gamedll based on the gamedir. - Note this is now the preferred method; the "metagame.ini" file is - deprecated, but still recognized for backwards compatibility. - - mm_pluginsfile - a file with the list of mm plugins, instead of "metamod.ini". - - mm_execcfg - a cfg file for mm plugin cvar settings, instead of "metaexec.cfg". - - mm_debug - an initial debug level. - - Examples: - ./hlds_run -game cstrike +localinfo mm_gamedll dlls/pod_bot.so - ./hlds_run -game cstrike +localinfo mm_pluginsfile mylist.ini - ./hlds_run -game cstrike +localinfo mm_execcfg mysettings.cfg - ./hlds_run -game cstrike +localinfo mm_debug 7 - - Don't try exec'ing metaexec.cfg unless it exists. - - Added additional entity for Action Half-Life Beta 4, from list forwarded - from the dev team. - - Added a couple additional entities for Global Warfare, from list - provided by the dev team. - - Moved a couple entities from the "common" list back to the "valve" list, - for better organization. - - Changed logmsg "Plugin '%s' interface version didn't match" from - "Warning:" to "Note:" to reduce confusion. - - Added an optional plugin meta-api routine Meta_Init, to be called prior - to GiveFnptrsToDll, to let the dll know that it's going to be - queried/loaded as a metamod plugin, to allow for DLL's that can be used - as both a metamod plugin _and_ a standalone DLL. Raised - META_INTERFACE_VERSION from 5:4 to 5:5. - - Removed segfault handler under linux, when calling plugin console - command functions, as (a) it masked legitimate segfaults in plugin - commands and produced confusing output ("plugin has been unloaded", when - really it segfaultd), and (b) wasn't necessary since the situation - should be covered by other tests. - - Replaced combo SDK macros with inline funcs, and added ones for - accessing serverinfo and localinfo infokey buffers. - - Unfinished code for event triggers is in the source, but is disabled - (since it's not finished yet). - -2001/06/10 1.07.03 - - improper compile was reporting wrong version number - -2001/06/07 1.07.02 - - added mod recognition and best-guess list of entities for Deathmatch - Classic v1 and Global Warfare Beta 1.0. - - updated entity list with best-guess additions and corrected win32 dll - name for Wasteland Beta 2. - - added additional entities for Frontline Force 1.2a, from list forwarded - from the dev team. - -2001/05/25 1.07.01 - - added complete (hopefully) list of additional entities for Front Line - Force 1.2a/1.3. - - added best-guess list of entities for Day of Defeat b1.1. - - added best-guess list of entities for Science & Industry 0.97 (later - confirmed by SI lead programmer). - - added better guess list of entites for Action Half-Life b4. - - shrunk entity lists for Jailbreak and Judgement to include only - mod-specific entities (rather than common Valve entities which are in a - separate list). - - in THREAD_CREATE inline, replaced "(DWORD (*)(void*)) func" with - "(LPTHREAD_START_ROUTINE) func" to properly compile under MSVC. - - added engine_notes.html with a list of all the engine routines, and some - comments. - - added utils/getents.sh script to pull entity lists from .so files. - -2001/05/08 1.07.00 - - fixed "%s" server-crashing bug. "You should never pass strings with - unknown contents as the format string." Metamod was passing a - preformatted non-constant (thus unknown contents) string as the format - string (and only argument) when handling printf-style varargs engine - functions (in particular, AlertMessage). Ie, don't do: - printf(buf); - Instead do: - printf("%s", buf); - - added some entities for Action Half-Life Beta4, which should help - address crashing on startup, especially with Last Man Standing random - weapons. Note that I don't have an official, complete list of entities - for the mod, so there may still be some instances of crashing. - - added debugging messages for printf-style varargs engine routines, since - we can't rely on trace_mm for this (as the messages are re-written by - metamod before being passed to trace). - - better info in trace plugin's log messages for AlertMessage and - CreateNamedEntity. - - altered debug levels AlertMessage API routines in api_info.cpp - -2001/05/04 1.06.10 - - fixed a couple of entities for HL Paintball. - - added links.html to docs, a set of links/URLs and books that I found - helpful for the project. - - added to META_INTERFACE_VERSION comments to include associated metmaod - version for each change. - - additional data checking in various MPluginList routines. - - added 'const' to various function arguments to more properly reflect - function purpose. - - changed various function macros to inlines, to provide more obvious type - checking, and easier debugging. - - adjusted private/public members of various classes, to try and make them - more proper. - - added new_handler code, for upcoming code additions. - - added MPluginList::find(plid_t id), for upcoming code additions. - - added thread primitives to osdep, for upcoming code additions. - -2001/04/29 1.06.02 - - added entities and mod recognition for VampireSlayer and Open-Source - Jailbreak. - - updated mod recognition for current names of Action Half-Life's DLL/SO - files. - - added some entities for FLF 1.2a, listed on Botman's news page. - - added some docs for Installation and Compiling. - - added build type info (optimized, debugging, etc) to the SpecialBuild - tag in the version info for the win32 DLL. - - disabled SDK's "DBG_" functions, for MSVC win32 debug compiles. - -2001/04/22 1.06.01 - - added some entities for FLF 1.2. - - better info in trace plugin's log messages for - DispatchObjectCollsionBox, SetModel, FindEntityByString, SetOrigin, - EntOffsetOfPEntity, PEntityOfEntIndex. - - fixed missing initialization for "len" in wdmisc. - - added links to sections in html docs. - - for non-critical interface version mismatch, changed from a META_ERROR - to just META_LOG, since it's not, strictly speaking, an error. - -2001/04/17 1.06.00 - - added support for "metaexec.cfg", a commands file to be exec'd after - loading the plugins, for plugin commands and cvars, since autoexec.cfg - is parsed too early (before plugins loaded) and server.cfg is parsed too - late (after ServerActivate). - - better info in trace plugin's log messages for MessageBegin, - WriteString, AlertMessage, RegUserMsg - - to provide more manageable trace log output, throttled trace plugin to 1 - logmsg per second, by default (of course, this can cause log messages to - be lost). Added cvar "trace_unlimit" (0/1) to enable unlimited logging, - as it did previously. - - added centersay meta-utility functions (CENTER_SAY, CENTER_SAY_PARMS, - CENTER_SAY_VARARGS). Raised META_INTERFACE_VERSION from 5:3 to 5:4. - - fixed crash when trying to load typical game DLLs (like standalone-bots) - as metamod plugins. - - fixed segfault on failed plugin attach; was dlclosing plugin - prematurely. - - in wdmisc, added a proof-of-concept for catching certain game events by - doing string matching on all the log messages produced by the game. - Ugly, to be sure, but interesting nonetheless. - - added more entities for HL Paintball, and fixed the linux so name. - - added "-Wno-unused" to CFLAGS when compiling sdk_util.o, to alleviate - the complaints from #including all the extra SDK header files and class - definitions. - - removed GetEntityAPI routine from trace plugin, as it's unnecessary as a - metamod plugin if already providing GetEntityAPI2. - - in trace, moved gMetaFunctionTable declaration to plugin.cpp, so that - meta_api.cpp can be a standard (plugin-independent) sourcefile used in - any plugin. - - updated the docs to include recent new features, as well as some better - discussion of coding details. - -2001/04/06 1.05.00 - - created utility callback functions, for use by plugins, to reduce code - duplication and help simplify some things. Currently, these consist of - only some convenient logging functions (LOG_CONSOLE, LOG_MESSAGE, - LOG_ERROR, LOG_DEVELOPER). - - added "mutil_funcs_t" to Meta_Query, to pass the meta utility function - table. Increased META_INTERFACE_VERSION from 5:2 to 5:3. - - made sure all exported DLL routines (ie routines that are accessed via - dlsym) are both declared _and defined_ as 'extern "C"', so that the C++ - compiler enforces parameter type-matching, rather than considering - routines with mis-matched arguments/types to be overloaded functions... - Note that it's not sufficient to just be declared "C"; it has to defined - this way as well, to make sure the C++ compiler matches it with the - declaration. Otherwise, again, it'll consider it an overloaded - function, and allow it happily without complaint, and cause the - subsequent dlsym to fail. - - created and deployed C_DLLEXPORT macro for declaring/defining functions - 'extern "C" DLLEXPORT'. - - added plugin 'wdmisc' as a basic example, and for my miscellaneous - commands/cvars. - - renamed "mm_stub" and "mm_trace" to "stub_mm" and "trace_mm" to make - plugin name more apparent, and to be more consistent with adminmod_MM. - - had to move plugin_info_t to its own header file, to avoid circular - #include's between meta_api.h and mutil.h. - - in dllapi.cpp and engineapi.cpp, pulled RETURN_API out of META_HANDLE - macro, to make it easier to add code to middle of API routines. - - renamed util_meta.h to support_meta.h, to avoid confusion with mutil.h - - some code cleanup (better 80-column linebreaks). - -2001/04/03 1.02.00 - - added support for Half-Life Paintball - - added "*_mm" and "*_MM" to the list of suffixes to look for when loading - plugins at console. - - log errors when plugin tries to use MRES_SUPERCEDE in a _Post function - (supercede is only relevant in a non-Post function; use OVERRIDE in a - Post function). - - mm_trace: added info to trace log for FindEntityInSphere - - added osdep macro for strcasecmp, for compiling under windows - - fixed a debug log message for GetEngineFunctions_Post - - fixed a couple internal references to engine globals (gpGLobals) - - renamed local SDK API routines to "mm_*" for easier debug breakpoints - - altered debug levels for a couple API routines in api_info.cpp - -2001/04/01 1.01.00 - - replaced use of FStrEQ in most places with !strcasecmp, so that case - doesn't matter for things like console commands ("META LOAD" will now - work in addition to "meta load") and paths (like "-game CSTRIKE"; and - win32 filepaths are case-insignificant anyway). Interestingly, the HL - engine ignores case for console commands ("ADMIN_COMMAND" works), but - cvars are only recognized with matching case ("ADMIN_DEBUG" does not - work). Confusing. - - added "by " when printing author info, to make it a bit clearer - - added a bit more operation info to metamod.html - -2001/03/30 1.00.00 - - released as v1.0, for inclusion with release of Adminmod v2.50. - - added $(VERSFILE) to Makefile and Config.mak, to better insure correct - rebuild on version number changes - - added "i486", "i586", and "i686" to "i386" in the list of prefixes to - look for when loading plugins at console. - - added "MDLL*" and "MNEW" macros in meta_api.h, to be more convenient for - plugins to call GameDLL functions. - - added missing "extern gamedll_funcs_t *gpGamedllFuncs" to meta_api.h - - added handling of gpGamedllFuncs in stub, for example purposes. - - fixed problems with running bots under metagame.ini: - - moved instantiation of Plugins object to before meta_load_gamedll, so - that if gamedll calls engine functions during GiveFnptrsToDll (like - hpb_bot does), META_ENGINE_HANDLE won't crash from a null Plugins object - pointer. - - in GET_FUNC_TABLE_FROM_GAME, memset gamedll.funcs.struct_field, and then - free/null it if the gamedll's GetFuncs call fails, to handle the - situation where the gamedll provides GetNewDLLFunctions(), but doesn't - have anything to return (like hpb_bot does, when the real gamedll - doesn't provide GetNewDLLFunctions). - - add handling of gpGamedllFuncs to mm_stub's Meta_Attach(). - -2001/03/27 1.0-rc5 - - fixed problem with crashing when a plugin failed to load (improper - dereference of null 'info' structure; incomplete fix from rc2). - - added a plugin status "badfile", for plugin files that appear to be - invalid metamod plugins; this is to differentiate from "failed", which - is a valid-looking plugin file (queried) but encountered a failure - attaching/unloading/etc. - - changed "-march=i686" optimization to "-march=i586", and moved this to - only the optimized binaries, and not the debugging binaries. As it - turns out, i686 doesn't work on things like AMD K6-III cpus (I know, go - figure :). - - duplicated functionality of adminmod's "admin.ini", except with a file - named "metagame.ini". This will allow (at least partial) use with game - DLLs that metamod doesn't support yet - "partial" because, although the - game DLL will load, it may not work if it uses entities that metamod - doesn't know about yet. It will also allow use of standalone "bot" - DLLs, which sit between metamod and the gamedll (much like metamod sits - between the engine and the gamedll). - - added console command "meta game" to show information about the loaded - game DLL (to help troubleshoot issues with "metagame.ini"). - -2001/03/25 1.0-rc4 - - split linkfunc.cpp into linkent.h, linkgame.cpp, linkplug.cpp - - split entity lists for mods into separate files, one for each mod; these - are used to build linkgame.cpp - - metamod/mm_trace version info should indicate debugging/optimized compile - - added entity support for Judgement DM - - added "-fno-rtti" to mm_trace gcc cflags, to address problem of - unresolved CSaveRestoreBuffer symbols using older versions of gcc - - lowered debug levels in GetEntityAPI, GetNewDLLFunctions, etc to enable - "+developer" messages (6 -> 3). - - removed "-Werror" from Makefile's default cflags; should only be used - on devl system with edited SDK - -2001/03/18 1.0-rc3 - - central Makefile can now build optimzed as well as debugging targets; - default to compile is debugging; default in 'dlls' dir is optimized - - toplevel Makefile builds release tgz/zip files. TGZ file includes only - linux .so objects, and text files in unix-LF format. ZIP file includes - only win32 .dll objects, and text files in dos-CRLF format, and actual - files rather than symlinks. - - added mod recognition for "judgedm" mod; still need entities list - - added 4 entities for Firearms 2.5 - -2001/03/07 1.0-rc2 - - fixed missing WINAPI in mm_trace GiveFnptrsToDll - - added HTML version of docs - - description field in metamod.ini is now optional: - - uses "name" from plugin info for desc by default - - desc field in metamod.ini will override this - - "meta list" shows just desc, rather than desc and name - - altered debug levels for a couple API routines in api_info.cpp - - added missing "load" cmd in "meta" usage help - - added to "meta load" usage help - - added macros RETURN_META(result) and RETURN_META_VALUE(result, value) to - simplify plugin coding - - added parameter "gamedll_funcs" to meta_attach(), to give each plugin a - copy of the gamedll's API function tables - - raised META_INTERFACE_VERSION to "5:2" - - now load gamedll before plugins (rather than the reverse) so that - it'll have the gamedll func tables to hand to the plugins - - changed trace plugin console commands: - trace_version -> trace version - trace -> trace set - untrace -> trace unset - showtrace -> trace show - - added "trace list " to list all available routines for tracing - - fixed broken trace cvars - - for "meta {load,unload,etc}" console cmd, added matching against plugin - logtag, as well as for "mm_" in plugin file - - handle null 'info' after failed plugin load (ie in "meta info" etc) - - fixed "usage: meta list" errors on some meta commands; was calling - cmd_meta_pluginlist() instead of Plugins->show() - - fixed: unload/attach delayed plugins at changelevel - - now doesn't export newapi if gamedll doesn't provide it - - now doesn't call plugins getnewapi if gamedll doesn't provide it - - fixed incorrect apitable references in MPlugin::show() - -2001/02/08 1.0-rc1 - - fixed unistd.h under MSVC - - fixed S_ISREG under MSVC - - fixed strncasecmp under MSVC - - fixed void svr_meta() returning value - - fixed missing WINAPI in mm_stub GiveFnptrsToDll - - remade MSVC project for metamod - - created MSVC project for mm_stub - - added an example "metamod.ini" to ./docs diff --git a/doc/README.txt b/doc/README.txt deleted file mode 100644 index fffe7c6..0000000 --- a/doc/README.txt +++ /dev/null @@ -1,6 +0,0 @@ -Please see the files in the "html" or "txt" directory for documentation. - -Example files in the current directory: - - plugins.ini - config.ini diff --git a/doc/TODO b/doc/TODO deleted file mode 100644 index 79af2e1..0000000 --- a/doc/TODO +++ /dev/null @@ -1,37 +0,0 @@ -# vi: set ts=4 sw=4 : -# vim: set tw=75 : - - - event notification and log-parsing interface for plugins - - interaction between plugins - - rename trace functions to "tr_*" for easier debug breakpoints - - add meta console command to debug indiv functions, like mm_trace can - - catch register cmds/cvars from gameDLL and list then in "meta game" - - in win32, doesn't report parsed plugin line properly; says only: - [META] ini: Read plugin config for: - - use scanf for file parsing ? - - "meta cancel" command - - more documentation info - - don't refresh_ini on "quit" - - test more bot support for metagame.ini - - - track "messages" for plugins and provide READ_* functions (usermsg.cpp) - - provide other "engine" functions to plugins - - is_connected - - is_ingame - - x fix stat()-related code for linux only - x remake MSVC project - x use resources - x doublecheck DLLEXPORT and stuff - x txt files in "dos" format? - x separate zip/tgz files - x compat support for "admin.ini" - x support dir-specific "metamod.ini" files, similar to servercfgfile - x more documentation info: engineapi_info.txt - x html view of source - x handle RegUserMsg and allow lists of registered messages to be queried - by bot plugins or other plugins that want to catch these things, and to - allow these plugins to be loaded during a map (since after mapstart, the - plugin can't catch RegUserMsg calls, since they've all already been made). - x find some way to generally allow plugins to use LINK_ENTITY_TO_CLASS, - without requiring explicit support in metamod \ No newline at end of file diff --git a/doc/config.ini b/doc/config.ini deleted file mode 100644 index cf7ea60..0000000 --- a/doc/config.ini +++ /dev/null @@ -1,90 +0,0 @@ -// vim: set ft=c : -// -// Format is as follows: -// -// -// Fields are whitespace delimited (tabs/spaces). -// -// Comments are either c++ style ("//") or unix shell style ("#"), and -// can appear ONLY at the beginning of a line. -// -// The following provide a list of recognized options, their defaults, and -// examples of usage. -// -// debuglevel -// gamedll -// plugins_file -// exec_cfg -// autodetect - - -// debuglevel -// where is an integer, 0 and up. -// Sets the initial debugging level for metamod (same as cvar "meta_debug"). -// Default is normally 0. If hlds is run with "-dev", default is 3. -// Overridden by: +localinfo mm_debug -// Examples: -// -// debuglevel 0 -// debuglevel 42 - - -// gamedll -// where is an absolute path, or a path relative to the gamedir. -// Overrides the auto-detected gamedll, in particular for bots. -// Default is empty, with gamedll being auto-recognized based on the -// gamedir. -// Overridden by: +localinfo mm_gamedll -// Examples: -// -// gamedll dlls/hl.dll -// gamedll ../podbot/podbot.dll -// gamedll /home/bots/dlls/mybot.dll - - -// plugins_file -// where is an absolute path, or a path relative to the gamedir. -// Overrides the default filename containing the MM plugins to load. -// Default is "addons/metamod/plugins.ini". -// Overridden by: +localinfo mm_pluginsfile -// Examples: -// -// plugins_file cfg/clanmode.ini -// plugins_file ../private.ini -// plugins_file /home/half-life/testing.ini - - -// exec_cfg -// where is a path relative to the gamedir. Note! This CANNOT be -// an absolute path, as hlds will not "exec" absolute pathnames. -// Overrides the default filename containing hlds commands to run just -// after loading Metamod. -// Default is "addons/metamod/exec.cfg". -// Overridden by: +localinfo mm_execcfg -// Examples: -// -// exec_cfg configs/debugging.cfg -// exec_cfg ../clan/match.cfg - - -// autodetect -// Setting to disable or enable autodetection of gamedll. -// Extra feature for Metamod+All-Mod-Support Patch. -// Default is "yes". -// Overridden by: +localinfo mm_autodetect -// Examples: -// -// autodetect yes -// autodetect no - - -// clientmeta -// Setting to disable or enable Metamod's client commands ('meta list' and -// 'meta version') -// Extra setting for Metamod+All-Mod-Support Patch. -// Default is "yes". -// Overridden by: +localinfo mm_clientmeta -// Examples: -// -// clientmeta yes -// clientmeta no diff --git a/doc/html/Index.html b/doc/html/Index.html deleted file mode 100644 index 83e22b9..0000000 --- a/doc/html/Index.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - -Metamod - - - -

Metamod -

- -

Metamod is a plugin/DLL manager that sits between the Half-Life Engine and -an HL Game mod, allowing the dynamic loading/unloading of mod-like DLL -plugins to add functionality to the HL server or game mod. - -

-


- -

-See metamod.org for news, downloads, -and plugin links. - -

-


- - - - - - - - -
-

Metamod Docs

- -
-

Other HLDS info

- -
- -

-


-
<willday@metamod.org>
- - - - - diff --git a/doc/html/a.html b/doc/html/a.html deleted file mode 100644 index 8f78ca8..0000000 --- a/doc/html/a.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - -Metamod Supported Games - - - - -

Supported Games -

-
- -Metamod includes support for the following mods, with version and last -update if known. - -

-To get support added for a new Mod, or for an updated version of a Mod, see -Adding game support. - -

- - - - - -
Name Version Last update Ent list Comments
ALL MODS SUPPORTED BY
-    All-Mod-Support PATCH
-    By Jussi Kivilinna
-    http://koti.mbnet.fi/axh/ -
NONE
- - - diff --git a/doc/html/about.html b/doc/html/about.html deleted file mode 100644 index 7266364..0000000 --- a/doc/html/about.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - -About Metamod - - - -

Metamod -

- -

a Half-Life utility mod

- -
-    meta /me't*/ or /may't*/ or (Commonwealth) /mee't*/ adj.,pref.
-        [from analytic philosophy] One level of description up.
-
- -

The purpose of MetaMod is to function "one level up" from the normal -Half-Life game mod DLL. Sitting between the mod game DLL and the Half-Life -engine/binary, it intercepts the function calls between the two, with the -option of passing them along untouched, as well as passing them on to as -any number of additional mod-like DLLs. - -

Thus, you can actually have multiple "mod-like" DLLs in operation at -one time. I say "mod-like" because these additional DLLs (we'll call them -"plugins") are not intended to provide a full "game"; that functionality is -still provided by the "game dll". However, these plugins can add -to or modify the functionality provided by the game -dll, or by the engine itself - for instance, adding new server commands, or -new client commands, or even disabling commands built into the game dll. -Although the plugin isn't intended to provide full HL-game functionality, -since it's receiving the same information given to the game DLL, it has the -opportunity to do anything the game DLL can do (given enough -coding effort of course). - -

This is very similar to the way Alfred Reynolds' -AdminMod works, as it also sits -between the engine and game dll, catching routines, and passing them on. -thus modifying functionality. However, rather than providing just the -additional server features builtin to AdminMod DLL, MetaMod allows you to -add features from multiple, separate DLLs. Under that framework, AdminMod -can be a plugin itself, and be run alongside numerous other plugins. And, -as of version 2.50 of AdminMod, AM has now transitioned to running as a -Metamod plugin. - -

-


- - - diff --git a/doc/html/coding.html b/doc/html/coding.html deleted file mode 100644 index e13114f..0000000 --- a/doc/html/coding.html +++ /dev/null @@ -1,396 +0,0 @@ - - - - - -Coding for Metamod - - - -

Coding for Metamod -

- -


- -

Compiling -

- -You'll need the Half-Life SDK, of course. In particular you'll need HL SDK -version 2.3. You can find the original SDK 2.3 at the Valve Editing Resource Center (VERC), -and a modified version of SDK 2.3 at metmod.org/files/sdk. - -


- -

Operation -

- -The basic operation is, for each api call: - -
    -
  • iterate through list of plugins -
  • for each plugin, if it provides this api call, then call the function - in the plugin -
  • call the "real" function (in the game dll, or from the engine) -
  • for each plugin, check for a "post" version of the function, and call - if present -
- -Also, for any api call, each plugin has the opportunity to replace the -real routine, in two ways: - -
    -
  • prevent the real routine from being called (SUPERCEDE). -
  • allow the real routine to be called, but change the value that's - returned (OVERRIDE) -
- -Thus after each plugin is called, its META_RESULT flag is -checked, and action taken appropriately. Note that supercede/override only -affects the _real_ routine; other plugins will still be called. - -In addition to the SUPERCEDE and -OVERRIDE flags, there are two additional flags a plugin can -return: - -
    -
  • HANDLED ("I did something here") -
  • IGNORED ("I didn't really do anything") -
- -These aren't used by Metamod itself, but could be used by plugins to -get an idea if a previous plugin did anything. - -

Note that each routine needs to set its -META_RESULT value before returning. Plugin routines that -do not set a value will be reported as errors in the logs. - -


- -

Plugin coding requirements -

- -Plugins must provide the following standard HLSDK exported function: - -

-   void GiveFnptrsToDll(enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals);
-

- -As well as the following new functions: - -

-   void Meta_Init(void); (optional)
-   int Meta_Query(char *interfaceVersion, plugin_info_t **pinfo, mutil_funcs_t *pMetaUtilFuncs);
-   int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, meta_globals_t *pMGlobals, gamedll_funcs_t *pGamedllFuncs);
-   int Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason);
-

- -Also, it must provide at least one function returning a standard HL -function table, from either the following standard HLSDK functions: - -

-   int GetEntityAPI( DLL_FUNCTIONS *pFunctionTable, int interfaceVersion );
-   int GetEntityAPI2( DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion );
-   int GetNewDLLFunctions( NEW_DLL_FUNCTIONS *pNewFunctionTable, int *interfaceVersion );
-

- -or from the following new functions: - -

-   int GetEntityAPI_Post(DLL_FUNCTIONS *pFunctionTable, int interfaceVersion);
-   int GetEntityAPI2_Post(DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion ;
-   int GetNewDLLFunctions_Post(NEW_DLL_FUNCTIONS *pNewFunctionTable, int *interfaceVersion);
-
-   int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion);
-   int GetEngineFunctions_Post(enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion);
-

- -Thus, it needs to have (at least): -

-   GiveFnptrsToDll
-   Meta_Query
-   Meta_Attach
-   Meta_Detach
-   <one or more Get function>
-

- -See the "stub_plugin" for an example of bare -minimum code. See "trace_plugin" for an example of -more complete functionality. - -

Also, if the plugin needs to use LINK_ENTITY_TO_CLASS, -support for the particular entity(ies) has to be added explicitly to -Metamod (linkfunc.cpp), just as it does for entities in game DLLs. - -


- -

Operation Details -

- -

These are the valid META_RESULT values a plugin routine can -specify: - -

    -

  • -MRES_IGNORED -
    The plugin did nothing. This could be used to tell a subsequent - plugin that the some situation hasn't been handled yet. This would be - recognized only by other plugins; Metamod itself doesn't do anything - special for this situation. Unless otherwise specified by a later - plugin, execution of routine in the gameDLL will take place. This is - valid in both normal and post routines. -

  • -MRES_HANDLED -
    The plugin handled the situation, or did something with the - information. Again, this could be used to tell a subsequent plugin - that some situation has already been taken care of, and is not - recognized specially by Metamod. Unless otherwise specified by a later - plugin, execution of routine in the gameDLL will take place. This is - valid in both normal and post routines. -

  • -MRES_OVERRIDE -
    The plugin is providing a return value for the routine, which - should be used in place of the return value from the gameDLL's routine - (the plugin "overrides" the gameDLL's return value). - Unless otherwise specified by a later plugin, the gameDLL routine will - still be called. Note this only makes sense for non-void routines. - This is valid in both normal and post routines. -

  • -MRES_SUPERCEDE -
    The plugin has performed sufficient actions for the routine, and - the gameDLL's routine should not be called (the plugin - "supercedes" the gameDLL's routine, more or less replacing it - entirely). Any return value for the routine should be specified as - well by the plugin. Note this is only valid for normal routines, as - post routines cannot prevent calling the gameDLL's routine (as it has - already happened!). Also note, this doesn't prevent subsequent plugins - from being called for this routine; it supercedes only - the gameDLL. -
- -As the plugins are called, a running status is kept of the "highest" meta -status so far, in the order (lowest to highets) shown above. After calling -all the "normal" routines, the status is checked to see if the gameDLL's -routine should be called - ie, it will not be called if one (or more) of -the plugin's has specified META_SUPERCEDE. The gameDLL's -routine is then called, or skipped, as appropriate. Then, all the "post" -routines are called in the same manner (except -META_SUPERCEDE is no longer a valid meta result). - -

Last, if any plugins specified META_OVERRIDE or -META_SUPERCEDE, the return value given by the -last such plugin is returned as the routine's return code to -the engine (assuming a non-void routine). Thus, the order of the plugins -as specified in the metamod.ini does have a possible -effect. - - -


- -

Available Macros -

- -The meta_api.h -header that describes the Metamod API functions, types, and structures also -includes several macros that can be of help when coding a plugin. - -
    -

  • -SET_META_RESULT(result) -
    Sets the META_RESULT for the plugin. -

  • -RETURN_META(result) -
    Sets the META_RESULT for the plugin, and then calls - return. This assumes a void function. -

  • -RETURN_META_VALUE(result, value) -
    Sets the META_RESULT for the plugin, and then returns the - given value. This assumes a non-void function, and - it doesn't matter the particular type of the return value. -

  • -META_RESULT_STATUS -
    Gives the current status of META_RESULT for this routine - from plugins so far. It will return the "highest" result so far, in - the order of lesser to greater: IGNORED, HANDLED, - OVERRIDE, SUPERCEDE (see also above Operation Details) -

  • -META_RESULT_PREVIOUS -
    Gives the META_RESULT of the previous plugin. -

  • -META_RESULT_ORIG_RET(type) -
    Gives the "original" return value for the routine, ie the return - value of the routine from gameDLL. The type for the routine's return - value must be specified in the macro; this is used as a cast for - assignment. Note this is only valid in a "post" routine. -

  • -META_RESULT_OVERRIDE_RET(type) -
    Gives the return value from any previous plugin that specified - META_OVERRIDE or META_SUPERCEDE. The - type for the routine's return value must be specified in the macro; - this is used as a cast for assignment. This should only be used after - checking the META_RESULT to see if there's actually an override value - available. -

  • -MDLL_*(args) -
    Calls a given DLLAPI routine in the gameDLL. For instance, - MDLL_GameDLLInit(args), MDLL_Spawn(args), - etc. -

  • -MNEW_*(args) -
    Calls a given NEWAPI routine in the gameDLL. For instance, - MNEW_GameShutdown(args), etc. -
- - -


- -

Utility Callback Functions -

- -In version 1.05, Metamod began providing a set of utility functions to -plugins to centralize functionality, reduce code reuse, and to provide some -convenience in plugin coding. Presently, only a few functions are -provided. More are added as I find the time, and identify some advantage -to having them (either for my own plugins, or by others' request for their -plugins). - -

Note the PLID keyword passed to each function. This is -basically a "plugin id" to indicate to Metamod which plugin is calling the -function (else it's difficult to tell), and is a macro that should be -specified verbatim with each call. (Currently, the macro is merely the -plugin_info struct pointer returned by the plugin via Meta_Query; -in the future this could change to some other identifier.) - -

    -

  • - void LOG_CONSOLE(PLID, char *fmt, ...) -
    Print a message line on the console. Message is specified as a - printf style format string and arguments. A trailing newline - is provided by the routine and should not be specified in the string - (unless you want two newlines). -

  • - void LOG_MESSAGE(PLID, char *fmt, ...) -
    Print a message line in the server logs. Message is specified as a - printf style format string and arguments. A trailing newline - is provided by the routine and should not be specified in the string. - Log message is prefixed by the logtag string in the plugin's - "info" struct, surrounded by brackets. For instance: -

    L 04/17/2001 - 18:00:35: [TraceAPI] Tracing Engine routine 'RegUserMsg' -

  • - void LOG_ERROR(PLID, char *fmt, ...) -
    As in LOG_MESSAGE above, only marked as well with the - string "ERROR:". For example: -

    L 04/17/2001 - 18:03:13: [TraceAPI] ERROR: malloc failed -

  • - void LOG_DEVELOPER(PLID, char *fmt, ...) -
    As in LOG_MESSAGE above, only message will be logged only - if cvar developer is set to 1; message is marked as well with - the string "dev:". For example: -

    L 04/17/2001 - 18:03:13: [TraceAPI] dev: called: GiveFnptrsToDll -

  • - void CENTER_SAY(PLID, char *fmt, ...) -
    Prints a message on the center of all players' screens. This is - like the "centersay" of AdminMod, with pretty_say enabled, with the - same defaults (green, and a 10 second fade-in). A message is logged as - well, ie: [added in 1.06] -

    L 04/17/2001 - 15:44:52: [WDMISC] (centersay) random set up us the bomb! -

  • - void CENTER_SAY_PARMS(PLID, hudtextparms_t tparms, char *fmt, ...) -
    As in CENTER_SAY above, but allows specifying all the - parameters. (see SDK dlls/util.h for the struct - hudtextparms_t). [added in 1.06] -

  • - void CENTER_SAY_VARARGS(PLID, hudtextparms_t tparms, char *fmt, va_list ap) -
    As in CENTER_SAY_PARMS above, only the message is passed - as a vsnprintf style varargs format string and args list. - This is included merely because both the previous CENTER_SAY functions - actually call this, and it was convenient to include it as well. - [added in 1.06] -

  • - qboolean CALL_GAME_ENTITY(PLID, char *entStr, entvars_t *pev) -
    Calls an entity function in the gameDLL. For instance, a bot usually - needs to call the player entity function. - [added in 1.09] -

  • - int GET_USER_MSG_ID(PLID, const char *name, int *size) -
    Returns the id number corresponding to the given message name, of - those messages registered by the gamedll with RegUserMsg, optionally - returning the registered size of the message as well. This is to - allow things like bots to access the name/id mapping without having to - catch RegUserMsg themselves, and thus have to be loaded at startup. - [added in 1.11] -

  • - const char * GET_USER_MSG_NAME(PLID, int msgid, int *size) -
    Returns the name corresponding to the given msgid number, of those - messages registered by the gamedll with RegUserMsg, optionally - returning the registered size of the message as well. It will return - guess-names for any builtin Engine messages that it knows about - (SVC_TEMPENTITY, etc). The returned string is presumed to be - a compile-time constant string, stored in the text segment of the - gamedll. - [added in 1.11] -

  • - const char * GET_PLUGIN_PATH(PLID) -
    Returns the full pathname of the loaded dll/so file for the calling - plugin. The returned string is a pointer to a static buffer, and should be - copied by the caller to local storage. - [added in 1.12] -

  • - const char * GET_GAME_INFO(PLID, ginfo_t type) -
    Returns various string-based information about the running - game/MOD/gamedll. The given type can be one of: -
      -
    • GINFO_NAME - short name of game, from "-game" argument to hlds (ie "cstrike") -
    • GINFO_DESC - long name of game, from autodetection (ie "Counter-Strike") -
    • GINFO_GAMEDIR - game directory, full pathname (ie "/usr/local/half-life/cstrike") -
    • GINFO_DLL_FULLPATH - full pathname of the game dll (ie "/usr/local/half-life/cstrike/dlls/cs_i386.so") -
    • GINFO_DLL_FILENAME - bare filename of the gamedll (ie "cs_i386.so") -
    - The returned string is a pointer to a static buffer, and should be - copied by the caller to local storage. - [added in 1.14] -
- -


- -

Plugin Loading -

- -(this is some rough notes I intend to fill in in the future)

- -Plugins are loaded when the engine calls GiveFnptrsToDll(). -The config file is parsed, and for each valid plugin (uncommented, platform -relevant), the operation is: - -

    -
  • dlopen() the file, store the handle -
  • dlsym() and call: -
    -   Meta_Init (if present)
    -   GiveFnptrsToDll
    -   Meta_Query
    -   Meta_Attach
    -
    -
  • if present, call function pointers, and store resulting function table: -
    -   GetEntityAPI
    -   GetEntityAPI2
    -   GetNewDLLFunctions
    -
    -   GetEntityAPI_Post
    -   GetEntityAPI2_Post
    -   GetNewDLLFunctions_Post
    -
    -   GetEngineFunctions
    -   GetEngineFunctions_Post
    -
    -
- -

-


- - - diff --git a/doc/html/dllapi_notes.html b/doc/html/dllapi_notes.html deleted file mode 100644 index 05f1e31..0000000 --- a/doc/html/dllapi_notes.html +++ /dev/null @@ -1,569 +0,0 @@ - - - - - -HLSDK DLLAPI Notes - - - -

HLSDK DLLAPI Notes -

- -
- - -

GameDLLInit

-from dlls/game.cpp:
-
void GameDLLInit(void);

-

- Register your console variables here.
- This gets called one time when the game is initialied.
- Initialize the game (one-time call after loading of game .dll)
-
-

comments:
-

- Called just after hlds reports "Dll loaded for mod Half-Life". -
- -

DispatchSpawn

-from dlls/cbase.cpp -
int DispatchSpawn(edict_t *pent);

-

comments:
-

- 0==Success, -1==Failure ? -
- -

DispatchThink

-from dlls/cbase.cpp
-
void DispatchThink(edict_t *pent);

- -


DispatchUse

-from dlls/cbase.cpp
-
void DispatchUse(edict_t *pentUsed, edict_t *pentOther);

- -


DispatchTouch

-from dlls/cbase.cpp
-
void DispatchTouch(edict_t *pentTouched, edict_t *pentOther);

- -


DispatchBlocked

-from dlls/cbase.cpp
-
void DispatchBlocked(edict_t *pentBlocked, edict_t *pentOther);

- -


DispatchKeyValue

-from dlls/cbase.cpp
-
void DispatchKeyValue(edict_t *pentKeyvalue, KeyValueData *pkvd);

- -


DispatchSave

-from dlls/cbase.cpp
-
void DispatchSave(edict_t *pent, SAVERESTOREDATA *pSaveData);

- -


DispatchRestore

-from dlls/cbase.cpp
-
int DispatchRestore(edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity);

-

comments:
-

- 0==Success, -1==Failure ? -
- -

DispatchObjectCollsionBox

-from dlls/cbase.cpp
-
void DispatchObjectCollsionBox(edict_t *pent);

- -


SaveWriteFields

-from dlls/cbase.cpp
-
void SaveWriteFields(SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount);

- -


SaveReadFields

-from dlls/cbase.cpp
-
void SaveReadFields(SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount);

- -


SaveGlobalState

-from dlls/world.cpp
-
void SaveGlobalState(SAVERESTOREDATA *pSaveData);

- -


RestoreGlobalState

-from dlls/world.cpp
-
void RestoreGlobalState(SAVERESTOREDATA *pSaveData);

- -


ResetGlobalState

-from dlls/world.cpp
-
void ResetGlobalState(void);

- -


ClientConnect

-from dlls/client.cpp:
-
BOOL ClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[128]);

-

- Called when a player connects to a server. -
-

comments:
-

- Called on initial connect, just after hlds reports "connected", ie: -
    "John<1><WON:9856723>" connected, address "127.0.0.1:27005"
- This is before the user begins downloading, or anything else. -
- -

ClientDisconnect

-from dlls/client.cpp:
-
void ClientDisconnect(edict_t *pEntity);

-

- Called when a player disconnects from a server.
- GLOBALS ASSUMED SET: g_fGameOver -
-

comments:
-

- This is not the opposite of ClientConnect, despite the similar name. - It appears to only be called if the client was PutInServer first. If - the client disconnects before being PutInServer, no API routine is - called. This would be more appropriately named ClientRemoveFromServer. -
- -

ClientKill

-from dlls/client.cpp:
-
void ClientKill(edict_t *pEntity);

-

- Player entered the suicide command.
- GLOBALS ASSUMED SET: g_ulModelIndexPlayer -
-

comments:
-

- When the client typed "kill" in the console? -
- -

ClientPutInServer

-from dlls/client.cpp:
-
void ClientPutInServer(edict_t *pEntity);

-

- Called each time a player is spawned. -
-

comments:
-

- Called after the client has uploaded/download all necessary resources, - just after hlds reports "entered the game", ie: -
   "John<1>" has entered the game
-
- -

ClientCommand

-from dlls/client.cpp:
-
void ClientCommand(edict_t *pEntity);

-

- Called each time a player uses a "cmd" command. - Use CMD_ARGS, CMD_ARGV, and CMD_ARGC to get pointers to the character - string command. -
- -

ClientUserInfoChanged

-from dlls/client.cpp:
-
void ClientUserInfoChanged(edict_t *pEntity, char *infobuffer);

-

- Called after the player changes userinfo - gives dll a chance to modify - it before it gets sent into the rest of the engine. -
-

comments:
-

- Called when user issues "setinfo" from the console. Also appears to be - called whenever the user returns to the game from the ESC menu. -
- -

ServerActivate

-from dlls/client.cpp:
-
void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax);

-

- Every call to ServerActivate should be matched by a call to - ServerDeactivate. -
-

comments:
-

- Added in SDK 2.0. - Apparently called when the server has loaded the map, but before it - precaches from the .res file. -
- -

ServerDeactivate

-from dlls/client.cpp:
-
void ServerDeactivate(void);

-

- Peform any shutdown operations here.
- It's possible that the engine will call this function more times than - is necessary. Therefore, only run it one time for each call to - ServerActivate.
-
-

comments:
-

- Called upon "quit" or "changelevel" . -
- -

PlayerPreThink

-from dlls/client.cpp:
-
void PlayerPreThink(edict_t *pEntity);

-

- Called every frame before physics are run. -
- -

PlayerPostThink

-from dlls/client.cpp:
-
void PlayerPostThink(edict_t *pEntity);

-

- Called every frame after physics are run. -
- -

StartFrame

-from dlls/client.cpp:
-
void StartFrame(void);

-

- GLOBALS ASSUMED SET: g_ulFrameCount -
- -

ParmsNewLevel

-from dlls/client.cpp
-
void ParmsNewLevel(void);

- -


ParmsChangeLevel

-from dlls/client.cpp
-
void ParmsChangeLevel(void);

- -


GetGameDescription

-from dlls/client.cpp:
-
const char *GetGameDescription(void);

-

- Returns string describing current .dll game.
- Returns the descriptive name of this .dll. E.g., Half-Life, or Team - Fortress 2.
- This function might be called before the world has spawned, and the game - rules initialized.
-
- -

PlayerCustomization

-from dlls/client.cpp:
-
void PlayerCustomization(edict_t *pEntity, customization_t *pCust);

-

- Notifies .dll of new customization for player.
- A new player customization has been registered on the server. - UNDONE: This only sets the # of frames of the spray can logo animation - right now.
-
- -

SpectatorConnect

-from dlls/client.cpp:
-
void SpectatorConnect(edict_t *pEntity);

-

- Called when spectator joins server.
- A spectator has joined the game.
-
- -

SpectatorDisconnect

-from dlls/client.cpp:
-
void SpectatorDisconnect(edict_t *pEntity);

-

- Called when spectator leaves the server.
- A spectator has left the game.
-
- -

SpectatorThink

-from dlls/client.cpp:
-
void SpectatorThink(edict_t *pEntity);

-

- Called when spectator sends a command packet (usercmd_t).
- A spectator has sent a usercmd.
-
- -

Sys_Error

-from dlls/client.cpp:
-
void Sys_Error(const char *error_string);

-

- Called when engine has encountered an error.
- Notify game .dll that engine is going to shut down.
- Engine is going to shut down, allows setting a breakpoint in game dll - to catch that occasion.
- Add code ( e.g., _asm { int 3 }; here to cause a breakpoint for - debugging your game .dlls.
-
-

comments:
-

- Added in SDK 2.0. -
- -

PM_Move

-from pm_shared/pm_shared.c:
-
void PM_Move(struct playermove_s *ppmove, int server);

-

- This modume implements the shared player physics code between - any particular game and the engine. The same PM_Move routine is built - into the game .dll and the client .dll and is invoked by each side as - appropriate. There should be no distinction, internally, between server - and client. This will ensure that prediction behaves appropriately. -
-

comments:
-

- Added in SDK 2.0. -
- -

PM_Init

-from pm_shared/pm_shared.c: -
void PM_Init(struct playermove_s *ppmove);

-

- Server version of player movement initialization. -
-

comments:
-

- Added in SDK 2.0. -
- -

PM_FindTextureType

-from pm_shared/pm_shared.c
-
char PM_FindTextureType(char *name);

-

comments:
-

- Added in SDK 2.0. -
- -

SetupVisibility

-from dlls/client.cpp:
-
void SetupVisibility(edict_t *pViewEntity, edict_t *pClient, unsigned char **pvs, unsigned char **pas);

-from dlls/client.cpp: -

- Set up PVS and PAS for networking for this client. -

- A client can have a separate "view entity" indicating - that his/her view should depend on the origin of that view entity. If - that's the case, then pViewEntity will be non-NULL and will be used. - Otherwise, the current entity's origin is used. Either is offset by the - view_ofs to get the eye position. -

- From the eye position, we set up the PAS and PVS to use for filtering - network messages to the client. At this point, we could override the - actual PAS or PVS values, or use a different origin. -

- NOTE: Do not cache the values of pas and pvs, as they depend on - reusable memory in the engine, they are only good for this one frame -

-

comments:
-

- Added in SDK 2.0. -
- -

UpdateClientData

-from dlls/client.cpp:
-
void UpdateClientData (const struct edict_s *ent, int sendweapons, struct clientdata_s *cd);

-

- Set up data sent only to specific client.
- Data sent to current client only.
- Engine sets argument 'cd' to 0 before calling.
-
-

comments:
-

- Added in SDK 2.0. -
- -

AddToFullPack

-from dlls/client.cpp:
-
int AddToFullPack(struct entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet);

-

- Return 1 if the entity state has been filled in for the ent and the - entity will be propagated to the client, 0 otherwise. -

- State is the server maintained copy of the state info that is - transmitted to the client. A MOD could alter values copied into state - to send the "host" a different look for a particular entity update, - etc. -

- Arguments 'e' and 'ent' are the entity that is being added to the - update, if 1 is returneds. Host is the player's edict of the player - whom we are sending the update to. Player is 1 if the ent/e is a - player and 0 otherwise. Argument 'pSet' is either the PAS or PVS that - we previous set up. We can use it to ask the engine to filter the - entity against the PAS or PVS. -

- We could also use the pas/ pvs that we set in SetupVisibility, if we - wanted to. Caching the value is valid in that case, but still only for - the current frame. -

-

comments:
-

- Added in SDK 2.0. -
- -

CreateBaseline

-from dlls/client.cpp:
-
void CreateBaseline(int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, vec3_t player_mins, vec3_t player_maxs);

-

- Tweak entity baseline for network encoding, allows setup of player - baselines, too.
- Creates baselines used for network encoding, especially for player data - since players are not spawned until connect time.
-
-

comments:
-

- Added in SDK 2.0. -
- -

RegisterEncoders

-from dlls/client.cpp:
-
void RegisterEncoders(void);

-

- Callbacks for network encoding.
- Allows game .dll to override network encoding of certain types of - entities and tweak values, etc.
-
-

comments:
-

- Added in SDK 2.0. -
- -

GetWeaponData

-from dlls/client.cpp
-
int GetWeaponData(struct edict_s *player, struct weapon_data_s *info);

-

comments:
-

- Added in SDK 2.0. -
- -

CmdStart

-from dlls/client.cpp:
-
void CmdStart(const edict_t *player, const struct usercmd_s *cmd, unsigned int random_seed);

-

- We're about to run this usercmd for the specified player. We can set - up groupinfo and masking here, etc. This is the time to examine the - usercmd for anything extra. This call happens even if think does not. -
-

comments:
-

- Added in SDK 2.0. -
- -

CmdEnd

-from dlls/client.cpp:
-
void CmdEnd (const edict_t *player);

-

- Each cmdstart is exactly matched with a cmd end, clean up any - group trace flags, etc. here. -
-

comments:
-

- Added in SDK 2.0. -
- -

ConnectionlessPacket

-from dlls/client.cpp:
-
int ConnectionlessPacket(const struct netadr_s *net_from, const char *args, char *response_buffer, int *response_buffer_size); -
- Return 1 if the packet is valid. Set response_buffer_size if you want - to send a response packet. Incoming, it holds the max size of the - response_buffer, so you must zero it out if you choose not to respond. -
-

comments:
-

- Added in SDK 2.0. -
- -

GetHullBounds

-from dlls/client.cpp:
-
int GetHullBounds(int hullnumber, float *mins, float *maxs);

-

- Engine calls this to enumerate player collision hulls, - for prediction. Return 0 if the hullnumber doesn't exist. -
-

comments:
-

- Added in SDK 2.0. -
- -

CreateInstancedBaselines

-from dlls/client.cpp:
-
void CreateInstancedBaselines (void);

-

- Tweak entity baseline for network encoding, allows setup of player baselines, too.
- Create pseudo-baselines for items that aren't placed in the map at - spawn time, but which are likely to be created during play (e.g., - grenades, ammo packs, projectiles, corpses, etc.).
-
-

comments:
-

- Added in SDK 2.0. -
- -

InconsistentFile

-from dlls/client.cpp:
-
int InconsistentFile(const edict_t *player, const char *filename, char *disconnect_message); -
- One of the ENGINE_FORCE_UNMODIFIED files failed the consistency check - for the specified player Return 0 to allow the client to continue, 1 to - force immediate disconnection (with an optional disconnect message of - up to 256 characters). -
-

comments:
-

- Added in SDK 2.0. -
- -

AllowLagCompensation

-from dlls/client.cpp:
-
int AllowLagCompensation(void);

-

- The game .dll should return 1 if lag compensation should be allowed - (could also just set the sv_unlag cvar. Most games right now should - return 0, until client-side weapon prediction code is written and - tested for them (note you can predict weapons, but not do lag - compensation, too, if you want. -
-

comments:
-

- Added in SDK 2.0. -
- -

-


- - - diff --git a/doc/html/engine_notes.html b/doc/html/engine_notes.html deleted file mode 100644 index d8ff278..0000000 --- a/doc/html/engine_notes.html +++ /dev/null @@ -1,1705 +0,0 @@ - - - - - -HLSDK Engine Notes - - - -

HLSDK Engine Notes -

- -
- - -

PrecacheModel

-from engine/eiface.h:
-
int PrecacheModel(char *s);
-
PRECACHE_MODEL() -

comments:
-

- . -
- -

PrecacheSound

-from engine/eiface.h:
-
int PrecacheSound(char *s);
-
PRECACHE_SOUND() -

comments:
-

- . -
- -

SetModel

-from engine/eiface.h:
-
void SetModel(edict_t *e, const char *m);
-
SET_MODEL() -

comments:
-

- . -
- -

ModelIndex

-from engine/eiface.h:
-
int ModelIndex(const char *m);
-
MODEL_INDEX() -

comments:
-

- . -
- -

ModelFrames

-from engine/eiface.h:
-
int ModelFrames(int modelIndex);
-
MODEL_FRAMES() -

comments:
-

- . -
- -

SetSize

-from engine/eiface.h:
-
void SetSize(edict_t *e, const float *rgflMin, const float *rgflMax);
-
SET_SIZE() -

comments:
-

- . -
- -

ChangeLevel

-from engine/eiface.h:
-
void ChangeLevel(char *s1, char *s2);
-
CHANGE_LEVEL() -

comments:
-

- . -
- -

GetSpawnParms

-from engine/eiface.h:
-
void GetSpawnParms(edict_t *ent);
-
GET_SPAWN_PARMS() -

comments:
-

- . -
- -

SaveSpawnParms

-from engine/eiface.h:
-
void SaveSpawnParms(edict_t *ent);
-
SAVE_SPAWN_PARMS() -

comments:
-

- . -
- -

VecToYaw

-from engine/eiface.h:
-
float VecToYaw(const float *rgflVector);
-
VEC_TO_YAW() -

comments:
-

- . -
- -

VecToAngles

-from engine/eiface.h:
-
void VecToAngles(const float *rgflVectorIn, float *rgflVectorOut);
-
VEC_TO_ANGLES() -

comments:
-

- . -
- -

MoveToOrigin

-from engine/eiface.h:
-
void MoveToOrigin(edict_t *ent, const float *pflGoal, float dist, int iMoveType);
-
MOVE_TO_ORIGIN() -

comments:
-

- . -
- -

ChangeYaw

-from engine/eiface.h:
-
void ChangeYaw(edict_t *ent);
-
oldCHANGE_YAW() -

comments:
-

- . -
- -

ChangePitch

-from engine/eiface.h:
-
void ChangePitch(edict_t *ent);
-
CHANGE_PITCH() -

comments:
-

- . -
- -

FindEntityByString

-from engine/eiface.h:
-
edict_t *FindEntityByString(edict_t *pEdictStartSearchAfter, const char *pszField, const char *pszValue);
-
FIND_ENTITY_BY_STRING() -

comments:
-

- . -
- -

GetEntityIllum

-from engine/eiface.h:
-
int GetEntityIllum(edict_t *pEnt);
-
GETENTITYILLUM() -

comments:
-

- . -
- -

FindEntityInSphere

-from engine/eiface.h:
-
edict_t *FindEntityInSphere(edict_t *pEdictStartSearchAfter, const float *org, float rad);
-
FIND_ENTITY_IN_SPHERE() -

comments:
-

- . -
- -

FindClientInPVS

-from engine/eiface.h:
-
edict_t *FindClientInPVS(edict_t *pEdict);
-
FIND_ENTITY_IN_PVS() -

comments:
-

- . -
- -

EntitiesInPVS

-from engine/eiface.h:
-
edict_t *EntitiesInPVS(edict_t *pplayer); -

comments:
-

- . -
- -

MakeVectors

-from engine/eiface.h:
-
void MakeVectors(const float *rgflVector);
-
MAKE_VECTORS() -

comments:
-

- . -
- -

AngleVectors

-from engine/eiface.h:
-
void AngleVectors(const float *rgflVector, float *forward, float *right, float *up); -

comments:
-

- . -
- -

CreateEntity

-from engine/eiface.h:
-
edict_t *CreateEntity(void);
-
CREATE_ENTITY() -

comments:
-

- . -
- -

RemoveEntity

-from engine/eiface.h:
-
void RemoveEntity(edict_t *e);
-
REMOVE_ENTITY() -

comments:
-

- . -
- -

CreateNamedEntity

-from engine/eiface.h:
-
edict_t *CreateNamedEntity(int className);
-
CREATE_NAMED_ENTITY() -

comments:
-

- . -
- -

MakeStatic

-from engine/eiface.h:
-
void MakeStatic(edict_t *ent);
-
MAKE_STATIC() -

comments:
-

- . -
- -

EntIsOnFloor

-from engine/eiface.h:
-
int EntIsOnFloor(edict_t *e);
-
ENT_IS_ON_FLOOR() -

comments:
-

- . -
- -

DropToFloor

-from engine/eiface.h:
-
int DropToFloor(edict_t *e);
-
DROP_TO_FLOOR() -

comments:
-

- . -
- -

WalkMove

-from engine/eiface.h:
-
int WalkMove(edict_t *ent, float yaw, float dist, int iMode);
-
WALK_MOVE() -

comments:
-

- . -
- -

SetOrigin

-from engine/eiface.h:
-
void SetOrigin(edict_t *e, const float *rgflOrigin);
-
SET_ORIGIN() -

comments:
-

- . -
- -

EmitSound

-from engine/eiface.h:
-
void EmitSound(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch);
-
EMIT_SOUND_DYN2() -

comments:
-

- . -
- -

EmitAmbientSound

-from engine/eiface.h:
-
void EmitAmbientSound(edict_t *entity, float *pos, const char *samp, float vol, float attenuation, int fFlags, int pitch);
-
EMIT_AMBIENT_SOUND() -

comments:
-

- . -
- -

TraceLine

-from engine/eiface.h:
-
void TraceLine(const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr);
-
TRACE_LINE() -

comments:
-

- . -
- -

TraceToss

-from engine/eiface.h:
-
void TraceToss(edict_t *pent, edict_t *pentToIgnore, TraceResult *ptr);
-
TRACE_TOSS() -

comments:
-

- . -
- -

TraceMonsterHull

-from engine/eiface.h:
-
int TraceMonsterHull(edict_t *pEdict, const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr);
-
TRACE_MONSTER_HULL() -

comments:
-

- . -
- -

TraceHull

-from engine/eiface.h:
-
void TraceHull(const float *v1, const float *v2, int fNoMonsters, int hullNumber, edict_t *pentToSkip, TraceResult *ptr);
-
TRACE_HULL() -

comments:
-

- . -
- -

TraceModel

-from engine/eiface.h:
-
void TraceModel(const float *v1, const float *v2, int hullNumber, edict_t *pent, TraceResult *ptr); -

comments:
-

- . -
- -

TraceTexture

-from engine/eiface.h:
-
const char *TraceTexture(edict_t *pTextureEntity, const float *v1, const float *v2);
-
TRACE_TEXTURE() -

comments:
-

- . -
- -

TraceSphere

-from engine/eiface.h:
-
void TraceSphere(const float *v1, const float *v2, int fNoMonsters, float radius, edict_t *pentToSkip, TraceResult *ptr); -

comments:
-

- . -
- -

GetAimVector

-from engine/eiface.h:
-
void GetAimVector(edict_t *ent, float speed, float *rgflReturn);
-
GET_AIM_VECTOR() -

comments:
-

- . -
- -

ServerCommand

-from engine/eiface.h:
-
void ServerCommand(char *str);
-
SERVER_COMMAND() -

comments:
-

- Executes a server command, as if typed at the console (ie "exec - myconfig.cfg", or "quit"). Note that it appears no commands are - executed until after GameDLLInit is called. If - ServerCommand is called earlier than that, the command is delayed until - then. -
- -

ServerExecute

-from engine/eiface.h:
-
void ServerExecute(void);
-
SERVER_EXECUTE() -

comments:
-

- . -
- -

ClientCommand

-from engine/eiface.h:
-
void ClientCommand(edict_t *pEdict, char *szFmt, ...);
-
CLIENT_COMMAND() -

comments:
-

- . -
- -

ParticleEffect

-from engine/eiface.h:
-
void ParticleEffect(const float *org, const float *dir, float color, float count);
-
PARTICLE_EFFECT() -

comments:
-

- . -
- -

LightStyle

-from engine/eiface.h:
-
void LightStyle(int style, char *val);
-
LIGHT_STYLE() -

comments:
-

- . -
- -

DecalIndex

-from engine/eiface.h:
-
int DecalIndex(const char *name);
-
DECAL_INDEX() -

comments:
-

- . -
- -

PointContents

-from engine/eiface.h:
-
int PointContents(const float *rgflVector);
-
POINT_CONTENTS() -

comments:
-

- . -
- -

MessageBegin

-from engine/eiface.h:
-
void MessageBegin(int msg_dest, int msg_type, const float *pOrigin, edict_t *ed);
-
MESSAGE_BEGIN() -

comments:
-

- Begin a network message to send to the client. -
msg_type should be a number returned by RegUserMsg. -
msg_dest is one of: -
    -
  • MSG_BROADCAST - "unreliable to all" -
  • MSG_ONE - "reliable to one (msg_entity)" -
  • MSG_ALL - "reliable to all" -
  • MSG_INIT - "write to the init string" -
  • MSG_PVS - "Ents in PVS of org" (PVS=potentially visible set) -
  • MSG_PAS - "Ents in PAS of org" (PAS=potentially audible set) -
  • MSG_PVS_R - "Reliable to PVS" -
  • MSG_PAS_R - "Reliable to PAS" -
  • MSG_ONE_UNRELIABLE - "Send to one client, but don't put in reliable stream, put in unreliable datagram (could be dropped)" -
-
- -

MessageEnd

-from engine/eiface.h:
-
void MessageEnd(void);
-
MESSAGE_END() -

comments:
-

- . -
- -

WriteByte

-from engine/eiface.h:
-
void WriteByte(int iValue);
-
WRITE_BYTE() -

comments:
-

- . -
- -

WriteChar

-from engine/eiface.h:
-
void WriteChar(int iValue);
-
WRITE_CHAR() -

comments:
-

- . -
- -

WriteShort

-from engine/eiface.h:
-
void WriteShort(int iValue);
-
WRITE_SHORT() -

comments:
-

- . -
- -

WriteLong

-from engine/eiface.h:
-
void WriteLong(int iValue);
-
WRITE_LONG() -

comments:
-

- . -
- -

WriteAngle

-from engine/eiface.h:
-
void WriteAngle(float flValue);
-
WRITE_ANGLE() -

comments:
-

- . -
- -

WriteCoord

-from engine/eiface.h:
-
void WriteCoord(float flValue);
-
WRITE_COORD() -

comments:
-

- . -
- -

WriteString

-from engine/eiface.h:
-
void WriteString(const char *sz);
-
WRITE_STRING() -

comments:
-

- . -
- -

WriteEntity

-from engine/eiface.h:
-
void WriteEntity(int iValue);
-
WRITE_ENTITY() -

comments:
-

- . -
- -

CVarRegister

-from engine/eiface.h:
-
void CVarRegister(cvar_t *pCvar);
-
CVAR_REGISTER() -

comments:
-

- Register a new cvar (server variable). -
- -

CVarGetFloat

-from engine/eiface.h:
-
float CVarGetFloat(const char *szVarName);
-
CVAR_GET_FLOAT() -

comments:
-

- Return the float value of a cvar. -
- -

CVarGetString

-from engine/eiface.h:
-
const char *CVarGetString(const char *szVarName);
-
CVAR_GET_STRING() -

comments:
-

- Return the string value of a cvar. -
- -

CVarSetFloat

-from engine/eiface.h:
-
void CVarSetFloat(const char *szVarName, float flValue);
-
CVAR_SET_FLOAT() -

comments:
-

- Set the float value of a cvar. -
- -

CVarSetString

-from engine/eiface.h:
-
void CVarSetString(const char *szVarName, const char *szValue);
-
CVAR_SET_STRING() -

comments:
-

- Set the string value of a cvar. -
- -

AlertMessage

-from engine/eiface.h:
-
void AlertMessage(ALERT_TYPE atype, char *szFmt, ...);
-
ALERT() -

comments:
-

- Print an alert message. -
atype is one of: -
    -
  • at_notice -
  • at_console - "same as at_notice, but forces a ConPrintf, not a message box". Prints output to server console, but only shown if 'developer' is set. -
  • at_aiconsole - "same as at_console, but only shown if developer level is 2!" -
  • at_warning -
  • at_error -
  • at_logged - "Server print to console (only in multiplayer games)." Prints output to server logs and console. -
-
- -

EngineFprintf

-from engine/eiface.h:
-
void EngineFprintf(FILE *pfile, char *szFmt, ...);
-
ENGINE_FPRINTF() -

comments:
-

- . -
- -

PvAllocEntPrivateData

-from engine/eiface.h:
-
void *PvAllocEntPrivateData(edict_t *pEdict, long cb);
-
ALLOC_PRIVATE() -

comments:
-

- . -
- -

PvEntPrivateData

-from engine/eiface.h:
-
void *PvEntPrivateData(edict_t *pEdict);
-
GET_PRIVATE() -

comments:
-

- Returns a pointer to the base class type of the given edict. For - instance: -
-    CBaseEntity *pPlayer=(CBaseEntity *)GET_PRIVATE(pEntity);
-	
-
- -

FreeEntPrivateData

-from engine/eiface.h:
-
void FreeEntPrivateData(edict_t *pEdict);
-
FREE_PRIVATE() -

comments:
-

- . -
- -

SzFromIndex

-from engine/eiface.h:
-
const char *SzFromIndex(int iString); -

comments:
-

- . -
- -

AllocString

-from engine/eiface.h:
-
int AllocString(const char *szValue);
-
ALLOC_STRING() -

comments:
-

- . -
- -

GetVarsOfEnt

-from engine/eiface.h:
-
struct entvars_s *GetVarsOfEnt(edict_t *pEdict); -

comments:
-

- . -
- -

PEntityOfEntOffset

-from engine/eiface.h:
-
edict_t *PEntityOfEntOffset(int iEntOffset);
-
ENT() -

comments:
-

- . -
- -

EntOffsetOfPEntity

-from engine/eiface.h:
-
int EntOffsetOfPEntity(const edict_t *pEdict); -

comments:
-

- . -
- -

IndexOfEdict

-from engine/eiface.h:
-
int IndexOfEdict(const edict_t *pEdict);
-
ENTINDEX() -

comments:
-

- Returns the server slot (ie 1 to maxplayers) of the given player edict. -
- -

PEntityOfEntIndex

-from engine/eiface.h:
-
edict_t *PEntityOfEntIndex(int iEntIndex);
-
INDEXENT() -

comments:
-

- Returns the edict for the player in the given server slot (ie 1 to - maxplayers). -
- -

FindEntityByVars

-from engine/eiface.h:
-
edict_t *FindEntityByVars(struct entvars_s *pvars); -

comments:
-

- . -
- -

GetModelPtr

-from engine/eiface.h:
-
void *GetModelPtr(edict_t *pEdict);
-
GET_MODEL_PTR() -

comments:
-

- . -
- -

RegUserMsg

-from engine/eiface.h:
-
int RegUserMsg(const char *pszName, int iSize);
-
REG_USER_MSG() -

comments:
-

- Register a network message type with the given name, and size if known. - Returns the number assigned for the network message, to be used with MessageBegin. It appears that message - ID's 1-63 are reserved for the Engine, and that GameDLL messages are - allocated IDs starting at 64. The SDK dlls/util.h appears to - define six Engine messages: -
    -
  • SVC_TEMPENTITY = 23 -
  • SVC_INTERMISSION = 30 -
  • SVC_CDTRACK = 32 -
  • SVC_WEAPONANIM = 35 -
  • SVC_ROOMTYPE = 37 -
  • SVC_HLTV = 50 -
-
- -

AnimationAutomove

-from engine/eiface.h:
-
void AnimationAutomove(const edict_t *pEdict, float flTime); -

comments:
-

- . -
- -

GetBonePosition

-from engine/eiface.h:
-
void GetBonePosition(const edict_t *pEdict, int iBone, float *rgflOrigin, float *rgflAngles);
-
GET_BONE_POSITION() -

comments:
-

- . -
- -

FunctionFromName

-from engine/eiface.h:
-
unsigned long FunctionFromName(const char *pName);
-
FUNCTION_FROM_NAME() -

comments:
-

- Apparently, this finds the given exported function name string in the - GameDLL, and returns a pointer to said function (much like unix dlsym - or win32 GetProcAddress?). This appears to be used in GameDLL code for - loading savegames, as the savegames contain names of exported functions - in the GameDLL. Basically, this is the opposite of NameForFunction. -
- -

NameForFunction

-from engine/eiface.h:
-
const char *NameForFunction(unsigned long function);
-
NAME_FOR_FUNCTION() -

comments:
-

- Basically, the opposite of FunctionFromName. Finds the given - function pointer address in the GameDLL, and returns the string name - for the corresponding function. This appears to be used in GameDLL - code for saving games, taking known function pointers and converting - them to function name strings to be stored in the savegames, so that - they can be converted back to function pointers upon game load. -
- -

ClientPrintf

-from engine/eiface.h:
-
void ClientPrintf(edict_t *pEdict, PRINT_TYPE ptype, const char *szMsg);
-
CLIENT_PRINTF() -
- JOHN: engine callbacks so game DLL can print messages to individual - clients -
-

comments:
-

- . -
- -

ServerPrint

-from engine/eiface.h:
-
void ServerPrint(const char *szMsg); -

comments:
-

- Prints output to the server console. -
- -

Cmd_Args

-from engine/eiface.h:
-
const char *Cmd_Args(void);
-
CMD_ARGS() -
- these 3 added so game DLL can easily access client 'cmd' strings -
-

comments:
-

- Returns the arguments for a command, as a single string. The command - string itself is not included, and must be queried with - CMD_ARGV(0). For use in DLLAPI ClientCommand, or in - the function provided to AddServerCommand. -
- -

Cmd_Argv

-from engine/eiface.h:
-
const char *Cmd_Argv(int argc);
-
CMD_ARGV() -

comments:
-

- Returns the nth argument to the command. CMD_ARGV(0) - returns the command name itself. -
- -

Cmd_Argc

-from engine/eiface.h:
-
int Cmd_Argc(void);
-
CMD_ARGC() -

comments:
-

- Returns the number of arguments given to the command. -
- -

GetAttachment

-from engine/eiface.h:
-
void GetAttachment(const edict_t *pEdict, int iAttachment, float *rgflOrigin, float *rgflAngles);
-
GET_ATTACHMENT() -

comments:
-

- . -
- -

CRC32_Init

-from engine/eiface.h:
-
void CRC32_Init(CRC32_t *pulCRC);
-
CRC32_INIT() -

comments:
-

- . -
- -

CRC32_ProcessBuffer

-from engine/eiface.h:
-
void CRC32_ProcessBuffer(CRC32_t *pulCRC, void *p, int len);
-
CRC32_PROCESS_BUFFER() -

comments:
-

- . -
- -

CRC32_ProcessByte

-from engine/eiface.h:
-
void CRC32_ProcessByte(CRC32_t *pulCRC, unsigned char ch);
-
CRC32_PROCESS_BYTE() -

comments:
-

- . -
- -

CRC32_Final

-from engine/eiface.h:
-
CRC32_t CRC32_Final(CRC32_t pulCRC);
-
CRC32_FINAL() -

comments:
-

- . -
- -

RandomLong

-from engine/eiface.h:
-
long RandomLong(long lLow, long lHigh);
-
RANDOM_LONG() -

comments:
-

- . -
- -

RandomFloat

-from engine/eiface.h:
-
float RandomFloat(float flLow, float flHigh);
-
RANDOM_FLOAT() -

comments:
-

- . -
- -

SetView

-from engine/eiface.h:
-
void SetView(const edict_t *pClient, const edict_t *pViewent);
-
SET_VIEW() -

comments:
-

- . -
- -

Time

-from engine/eiface.h:
-
float Time(void); -

comments:
-

- . -
- -

CrosshairAngle

-from engine/eiface.h:
-
void CrosshairAngle(const edict_t *pClient, float pitch, float yaw);
-
SET_CROSSHAIRANGLE() -

comments:
-

- . -
- -

LoadFileForMe

-from engine/eiface.h:
-
byte * LoadFileForMe(char *filename, int *pLength);
-
LOAD_FILE_FOR_ME() -

comments:
-

- Opens the given filename (relative to the gamedir, or relative to the - hlds directory, in that order), and returns a pointer to a byte array - (character string) with the contents of the file. NULL-termination of - the array indicates end of file. Length of the file in bytes is - returned in the given int pointer. -
- -

FreeFile

-from engine/eiface.h:
-
void FreeFile(void *buffer);
-
FREE_FILE() -

comments:
-

- Free the byte array of the given buffer which was returned by LoadFileForMe. -
- -

EndSection

-from engine/eiface.h:
-
void EndSection(const char *pszSectionName); -
- trigger_endsection -
-

comments:
-

- . -
- -

CompareFileTime

-from engine/eiface.h:
-
int CompareFileTime(char *filename1, char *filename2, int *iCompare);
-
COMPARE_FILE_TIME() -

comments:
-

- . -
- -

GetGameDir

-from engine/eiface.h:
-
void GetGameDir(char *szGetGameDir);
-
GET_GAME_DIR() -

comments:
-

- Copies the pathname of the game directory into the given buffer. Note - that there's no way to inform the engine how big the buffer is, so be - forewarned. -

- Prior to HL 1.1.1.1 (CS 1.6), this gave the full pathname of the game - directory, ie "/usr/local/half-life/cstrike" or - "C:\Games\Half-Life\cstrike". Now, it is only the string passed to - hlds as the argument to "-game", ie "cstrike". -

- -

Cvar_RegisterVariable

-from engine/eiface.h:
-
void Cvar_RegisterVariable(cvar_t *variable);
-
CVAR_CREATE() -

comments:
-

- . -
- -

FadeClientVolume

-from engine/eiface.h:
-
void FadeClientVolume(const edict_t *pEdict, int fadePercent, int fadeOutSeconds, int holdTime, int fadeInSeconds); -

comments:
-

- . -
- -

SetClientMaxspeed

-from engine/eiface.h:
-
void SetClientMaxspeed(const edict_t *pEdict, float fNewMaxspeed); -

comments:
-

- . -
- -

CreateFakeClient

-from engine/eiface.h:
-
edict_t * CreateFakeClient(const char *netname); -
- returns NULL if fake client can't be created -
-

comments:
-

- Creates "bots" (?). -
- -

RunPlayerMove

-from engine/eiface.h:
-
void RunPlayerMove(edict_t *fakeclient, const float *viewangles, float forwardmove, float sidemove, float upmove, unsigned short buttons, byte impulse, byte msec); -

comments:
-

- . -
- -

NumberOfEntities

-from engine/eiface.h:
-
int NumberOfEntities(void);
-
NUMBER_OF_ENTITIES() -

comments:
-

- . -
- -

GetInfoKeyBuffer

-from engine/eiface.h:
-
char *GetInfoKeyBuffer(edict_t *e); -
- passing in NULL gets the serverinfo -
-

comments:
-

- Returns the InfoKeyBuffer for the given edict. This is basically the - fields from "setinfo" at the client console, and includes things like - the player name. -

- The sourcecode comment ("passing in NULL gets the serverinfo") - isn't entirely accurate. There appear to be two server-side info - buffers available, "serverinfo" and "localinfo", both - accessible from the console by those two commands, respectively. -

- Calling GetInfoKeyBuffer(NULL) will return the - localinfo buffer. Calling - GetInfoKeyBuffer(PEntityOfEntIndex(0)), ie passing the entity - of slot 0, will return the serverinfo buffer. -

- -

InfoKeyValue

-from engine/eiface.h:
-
char *InfoKeyValue(char *infobuffer, char *key); -

comments:
-

- Returns the value for the given key in the given InfoKeyBuffer. -
- -

SetKeyValue

-from engine/eiface.h:
-
void SetKeyValue(char *infobuffer, char *key, char *value); -

comments:
-

- Adds or sets a key/value pair in the given InfoKeyBuffer. Appears to - work for only server info, and not client info. For clients, use SetClientKeyValue. -
- -

SetClientKeyValue

-from engine/eiface.h:
-
void SetClientKeyValue(int clientIndex, char *infobuffer, char *key, char *value); -

comments:
-

- Adds or sets a key/value pair in a client's InfoKeyBuffer, by server - slot (ie 1 to maxplayers). -
- -

IsMapValid

-from engine/eiface.h:
-
int IsMapValid(char *filename);
-
IS_MAP_VALID() -

comments:
-

- . -
- -

StaticDecal

-from engine/eiface.h:
-
void StaticDecal(const float *origin, int decalIndex, int entityIndex, int modelIndex); -

comments:
-

- . -
- -

PrecacheGeneric

-from engine/eiface.h:
-
int PrecacheGeneric(char *s);
-
PRECACHE_GENERIC() -

comments:
-

- . -
- -

GetPlayerUserId

-from engine/eiface.h:
-
int GetPlayerUserId(edict_t *e);
-
GETPLAYERUSERID() -
- returns the server assigned userid for this player. useful for logging - frags, etc. returns -1 if the edict couldn't be found in the list of - clients -
-

comments:
-

- Returns the session userid for the given player edict. As of server - x106, this is constant for the life of the player connection, and - unique for the life of the server process. Each time a client - connects, they are given a userid of 1 plus the userid of the previous - connecting client. When the server starts/restarts, the server starts - again at userid 1. -
- -

BuildSoundMsg

-from engine/eiface.h:
-
void BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed);
-
BUILD_SOUND_MSG() -

comments:
-

- . -
- -

IsDedicatedServer

-from engine/eiface.h:
-
int IsDedicatedServer(void);
-
IS_DEDICATED_SERVER() -
- is this a dedicated server? -
-

comments:
-

- . -
- -

CVarGetPointer

-from engine/eiface.h:
-
cvar_t *CVarGetPointer(const char *szVarName);
-
CVAR_GET_POINTER() -

comments:
-

- Returns a pointer to a cvar_t struct for the given cvar - (server variable) name. -
- -

GetPlayerWONId

-from engine/eiface.h:
-
unsigned int GetPlayerWONId(edict_t *e); -
GETPLAYERWONID() -
- returns the server assigned WONid for this player. useful for logging - frags, etc. returns -1 if the edict couldn't be found in the list of - clients -
-

comments:
-

- Returns the WON id for the given player edict. As of server x106, this - should be unique per client CD KEY, and should be consistent across all - WON auth servers. -
- -

Info_RemoveKey

-from engine/eiface.h:
-
void Info_RemoveKey(char *s, const char *key); -
- YWB 8/1/99 TFF Physics additions -
-

comments:
-

- . -
- -

GetPhysicsKeyValue

-from engine/eiface.h:
-
const char *GetPhysicsKeyValue(const edict_t *pClient, const char *key); -

comments:
-

- . -
- -

SetPhysicsKeyValue

-from engine/eiface.h:
-
void SetPhysicsKeyValue(const edict_t *pClient, const char *key, const char *value); -

comments:
-

- . -
- -

GetPhysicsInfoString

-from engine/eiface.h:
-
const char *GetPhysicsInfoString(const edict_t *pClient);
-
ENGINE_GETPHYSINFO() -

comments:
-

- . -
- -

PrecacheEvent

-from engine/eiface.h:
-
unsigned short PrecacheEvent(int type, const char *psz);
-
PRECACHE_EVENT() -

comments:
-

- . -
- -

PlaybackEvent

-from engine/eiface.h:
-
void PlaybackEvent(int flags, const edict_t *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2);
-
PLAYBACK_EVENT_FULL() -

comments:
-

- . -
- -

SetFatPVS

-from engine/eiface.h:
-
unsigned char *SetFatPVS(float *org);
-
ENGINE_SET_PVS() -

comments:
-

- . -
- -

SetFatPAS

-from engine/eiface.h:
-
unsigned char *SetFatPAS(float *org);
-
ENGINE_SET_PAS() -

comments:
-

- . -
- -

CheckVisibility

-from engine/eiface.h:
-
int CheckVisibility(const edict_t *entity, unsigned char *pset);
-
ENGINE_CHECK_VISIBILITY() -

comments:
-

- . -
- -

DeltaSetField

-from engine/eiface.h:
-
void DeltaSetField(struct delta_s *pFields, const char *fieldname);
-
DELTA_SET() -

comments:
-

- . -
- -

DeltaUnsetField

-from engine/eiface.h:
-
void DeltaUnsetField(struct delta_s *pFields, const char *fieldname);
-
DELTA_UNSET() -

comments:
-

- . -
- -

DeltaAddEncoder

-from engine/eiface.h:
-
void DeltaAddEncoder(char *name, void (*conditionalencode)( struct delta_s *pFields, const unsigned char *from, const unsigned char *to) );
-
DELTA_ADDENCODER() -

comments:
-

- . -
- -

GetCurrentPlayer

-from engine/eiface.h:
-
int GetCurrentPlayer(void);
-
ENGINE_CURRENT_PLAYER() -

comments:
-

- . -
- -

CanSkipPlayer

-from engine/eiface.h:
-
int CanSkipPlayer(const edict_t *player);
-
ENGINE_CANSKIP() -

comments:
-

- . -
- -

DeltaFindField

-from engine/eiface.h:
-
int DeltaFindField(struct delta_s *pFields, const char *fieldname);
-
DELTA_FINDFIELD() -

comments:
-

- . -
- -

DeltaSetFieldByIndex

-from engine/eiface.h:
-
void DeltaSetFieldByIndex(struct delta_s *pFields, int fieldNumber);
-
DELTA_SETBYINDEX() -

comments:
-

- . -
- -

DeltaUnsetFieldByIndex

-from engine/eiface.h:
-
void DeltaUnsetFieldByIndex(struct delta_s *pFields, int fieldNumber);
-
DELTA_UNSETBYINDEX() -

comments:
-

- . -
- -

SetGroupMask

-from engine/eiface.h:
-
void SetGroupMask(int mask, int op);
-
ENGINE_SETGROUPMASK() -

comments:
-

- . -
- -

CreateInstancedBaseline

-from engine/eiface.h:
-
int CreateInstancedBaseline(int classname, struct entity_state_s *baseline);
-
ENGINE_INSTANCE_BASELINE() -

comments:
-

- . -
- -

Cvar_DirectSet

-from engine/eiface.h:
-
void Cvar_DirectSet(struct cvar_s *var, char *value); -

comments:
-

- . -
- -

ForceUnmodified

-from engine/eiface.h:
-
void ForceUnmodified(FORCE_TYPE type, float *mins, float *maxs, const char *filename);
-
ENGINE_FORCE_UNMODIFIED() -
- Forces the client and server to be running with the same version of the - specified file ( e.g., a player model ). Calling this has no effect in - single player. -
-

comments:
-

- . -
- -

GetPlayerStats

-from engine/eiface.h:
-
void GetPlayerStats(const edict_t *pClient, int *ping, int *packet_loss);
-
PLAYER_CNX_STATS() -

comments:
-

- . -
- -

AddServerCommand

-from engine/eiface.h:
-
void AddServerCommand(char *cmd_name, void (*function) (void)); -

comments:
-

- Registers a new server console command. When the given command string - is typed at the console, the given function will be called. Arguments - for the command can be retrieved in the function with - Cmd_Args, Cmd_Argv, and - Cmd_Argc. -
- -

Voice_GetClientListening

-from engine/eiface.h:
-
qboolean Voice_GetClientListening)(int iReceiver, int iSender); -
- For voice communications, set which clients hear each other. NOTE: these - functions take player entity indices (starting at 1). -
-

comments:
-

- Added in SDK 2.2. -
- -

Voice_SetClientListening

-from engine/eiface.h:
-
qboolean Voice_SetClientListening)(int iReceiver, int iSender, qboolean bListen); -
- For voice communications, set which clients hear each other. NOTE: these - functions take player entity indices (starting at 1). -
-

comments:
-

- Added in SDK 2.2. -
- -

GetPlayerAuthId

-from engine/eiface.h:
-
const char *GetPlayerAuthId(edict_t *e); -

From Eric Smith <EricS@valvesoftware.com> on hlcoders: -

- The AuthID is a way for applications/mods to get the Authentication ID - (uniqueID) for a player. The AuthID can be a WonID or a SteamID. The - function I've written returns the AuthID as a string. Calling GetPlayerWONId will still work for Non-Steam - players just like it always has. If applications/mods want to get a - jump start on getting ready to support Steam players, then they can - start using GetPlayerAuthId, which will still work for Non-Steam - players, but it will give the WonID as a string instead of an unsigned - int. -
-

From Eric Smith <EricS@valvesoftware.com> on servertest: -

- Only clients playing via Steam will have SteamIDs. Clients who are not - using Steam will still have WonIDs (just like they always have). The - server now supports WonIDs\SteamIDs and banning using either of them. - WonIDs have not changed. SteamIDs use the format: STEAM_<#>:<#> where - <#> is replaced by numbers. An example SteamID would be - "STEAM_0:94534". -
-

From Eric Smith <EricS@valvesoftware.com> on hlcoders: -

- This function will now return the string "BOT" as the AuthID for fake - clients. -
-

comments:
-

- Added for HL 1109; no SDK update. -
- -

SequenceGet

-from engine/eiface.h:
-
void *SequenceGet(const char *fileName, const char *entryName); -

comments:
-

- Added for HL 1xxx; no SDK update. -
- -

SequencePickSentence

-from engine/eiface.h:
-
void *SequencePickSentence(const char *groupName, int pickMethod, -int *picked); -

comments:
-

- Added for HL 1xxx; no SDK update. -
- -

GetFileSize

-from engine/eiface.h:
-
int GetFileSize(char *filename); -

comments:
-

- Added for HL 1xxx; no SDK update. -
- -

GetApproxWavePlayLen

-from engine/eiface.h:
-
unsigned int GetApproxWavePlayLen(const char *filepath); -

comments:
-

- Added for HL 1xxx; no SDK update. -
- -

IsCareerMatch

-from engine/eiface.h:
-
int IsCareerMatch(void); -

comments:
-

- Added for HL 1xxx; no SDK update. -
- -

GetLocalizedStringLength

-from engine/eiface.h:
-
int GetLocalizedStringLength(const char *label); -

comments:
-

- Added for HL 1xxx; no SDK update. -
- -

RegisterTutorMessageShown

-from engine/eiface.h:
-
void RegisterTutorMessageShown(int mid); -

comments:
-

- Added for HL 1xxx; no SDK update. -
- -

GetTimesTutorMessageShown

-from engine/eiface.h:
-
int GetTimesTutorMessageShown(int mid); -

comments:
-

- Added for HL 1xxx; no SDK update. -
- -

ProcessTutorMessageDecayBuffer

-from engine/eiface.h:
-
void ProcessTutorMessageDecayBuffer(int *buffer, int bufferLength); -

comments:
-

- Added for HL 1xxx; no SDK update. -
- -

ConstructTutorMessageDecayBuffer

-from engine/eiface.h:
-
void ConstructTutorMessageDecayBuffer(int *buffer, int bufferLength); -

comments:
-

- Added for HL 1xxx; no SDK update. -
- -

ResetTutorMessageDecayData

-from engine/eiface.h:
-
void ResetTutorMessageDecayData(void); -

comments:
-

- Added for HL 1xxx; no SDK update. -
- - -

-


- - - diff --git a/doc/html/faq.html b/doc/html/faq.html deleted file mode 100644 index f4f49c9..0000000 --- a/doc/html/faq.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - -Metamod FAQ - - - -

Metamod FAQ -

- -

- Please add support for (some) mod. -

-Please see game support -requirements in the documentation. -
- - -

- How do I use bots with Metamod? -

-If the bot is not a Metamod plugin, then you will need to tell -Metamod to use your bot as the gamedll, by specifying it on the hlds -command line with the "+localinfo mm_gamedll" option. See the -Metamod docs. See also the -AdminMod docs. -
- - -

- The download links give corrupt files. -

-I think what you're observing is that your web client is quietly -uncompressing the file, but not updating the name of the downloaded file to -reflect this. In particular, some web clients will silently decompress -(gunzip) files _without_ removing the ".gz" from the filename, so you'll -end up with a file "metamod_i386.so.gz" which is _really_ -"metamod_i386.so", and so trying to gunzip it will produce an error ("not -in gzip format"). Try running "file" on the resulting file to see what the -OS thinks it is. Or, where you don't have "file" (ie windows), just look -at the file size - it should be pretty indicative of whether the file is -still compressed or not. -
- - -

- How do I install Metamod? -

-This is covered briefly in the Metamod -docs. Typically, though, Metamod is installed as part of some major -plugin, like AdminMod. There is -also some discussion of installing Metamod by hand in the AdminMod docs. If you already have Metamod installed and merely want -to update it, this requires only replacing the .so/.dll with the latest -version from the webpage. -
- - -

- I'm having trouble with AdminMod. -

-You'll need to ask your AdminMod questions on the AdminMod forums. -
- - -

- How do I do (something) in a Metamod plugin? -

-Generally speaking, a Metamod plugin works very much like an Half-Life Game -Mod, since all it's doing is making the same calls to the same SDK that the -Game Mod does. So, the question typically isn't "how do I do this in -Metamod?" but instead "how do I do this in an Half-Life Mod?", and is best -asked in a HL SDK Programming forum/mailinglist (see related links -and especially Botman's MOD FAQ). -Once you figure out how it would normally be done in a Game Mod, figuring -out how to do it in Metamod is relatively straightforward. -

-However, if you have questions on how to convert a piece of code from HLmod -to Metamod plugin, then I can provide some pointers, or you can ask on the -Metamod mailing list. -And of course, if you have questions about things in the code specific to -Metamod (ie things mentioned in the Metamod Coding -docs) feel free to ask me or on the mailing list. -

- - -

- Is there a tutorial or example of how to write a Metamod plugin? -

-The sourcecode includes a couple of plugins that can be used as examples. -The "stub" plugin is the bare basics of what a plugin needs. The "trace" -plugin provides an example of hooking _every_ SDK function. The "wdmisc" -plugin provides a couple of basic useful features. You can also look at -several of the other plugins out there for more examples. -

-Note that the example plugins in the Metamod sourcecode show how to use -Metamod to interface with Half-Life code, but they mostly assume you -already know how to write Half-Life code. If you need examples or info on -how to write Half-Life code itself, you'll need to go look through the HL -SDK programming websites (see related links -and Botman's MOD FAQ). -

- - -

- I have (or know of) a Metamod plugin not listed on the webpage. -

-Send me the information about the plugin (name, author, description, URL), -and I'd be happy to provide a link from the webpage. -
- - -

- I'm having trouble compiling under MSVC. -

-Please note that I do not use MSVC, so I can't help a lot with using that -compiler. I do all my development under linux, using gcc for linux -binaries and mingw32 for windows -binaries. The sourcecode does include an MSVC project file for Metamod, as -well as a project file for the stub plugin, both mostly as examples. They -should work, and indeed did work the last time I dug up MSVC to test -them. That said, there are a few folks on the Metamod mailing list that -do use MSVC, so you might find some assistance there. -
- - -

- If I create a Metamod plugin, does it have to be open source? -

-Generally speaking, yes. The way the GPL is interpreted, plugins of a GPL -program need to be also GPL. See also the FAQ entry on the GNU site about -plugins of a GPL program. -
- - -

- How about a port of Metamod to other engines like Q3, Unreal, etc? -

-I haven't looked into it myself, but several folks on the AdminMod team -(from which Metamod was derived) had looked at porting to other games like -Q3 and UT, and determined that those engines either didn't provide the -necessary API hooks, or that they already provided a suitable method for -extending functionality. So, I wouldn't expect to see a version of Metamod -for those. Perhaps for some other future engines, although I believe most -modern engines are now providing their own method for extensions or -plugins, so that a third-party solution like Metamod wouldn't be necessary. -

-If Half-Life 2 ever sees the light of day, I expect I'd look seriously at -porting to that - unless, of course, Valve ends up providing their -own plugin framework themselves. :) -

- -

-


- - - diff --git a/doc/html/gamesupport.html b/doc/html/gamesupport.html deleted file mode 100644 index 60aa7f2..0000000 --- a/doc/html/gamesupport.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - -Metamod Adding Game/Mod Support - - - -

Adding Game/Mod Support -

- -Metamod-P already supports your Mod. - -
- - diff --git a/doc/html/links.html b/doc/html/links.html deleted file mode 100644 index 9e57593..0000000 --- a/doc/html/links.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - -Metamod Related Links - - - -

Related links -

- -Here's a list of links, other sites, and information I found useful when -working on Metamod: - - - -

Books

- -And here are books I picked up that I found useful as well: - - -

-


- - - diff --git a/doc/html/maillist.html b/doc/html/maillist.html deleted file mode 100644 index 6b24383..0000000 --- a/doc/html/maillist.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - -Metamod Mailing lists - - - -

Mailing lists -

- -I've created a couple of lists on YahooGroups (formerly egroups (formerly -onelist)): - -
    -
  • metamod-announce for announcements of new versions and plugins -
  • metamod for - questions, support, discussion, etc -
- -There are simple subscribe forms below. - - - - - - - - -
- Subscribe to metamod-announce
-
- groups.yahoo.com/metamod-announce -
- -
- -

- - - - - - - - -
- Subscribe to metamod
-
- groups.yahoo.com/metamod -
- -
- -

-


- - - diff --git a/doc/html/metamod.html b/doc/html/metamod.html deleted file mode 100644 index a791639..0000000 --- a/doc/html/metamod.html +++ /dev/null @@ -1,696 +0,0 @@ - - - - - -Using Metamod - - - -

Using Metamod -

- - -

Client Commands -

- -Similar to the server console interface, clients -can also issue commands to Metamod, of the following form: -
    - -
  • meta version - displays version information about the - Metamod instance currently running on the server, ie: -

    - Metamod v1.21p37 2013/05/30 (5:13) -
    by Will Day -
      http://www.metamod.org/ -
     Patch: Metamod-P (mm-p) v37 -
     by Jussi Kivilinna -
       http://koti.mbnet.fi/axh/ -
    compiled: Feb 18 2013, 11:53:27 EET (optimized) -
    - -

  • meta list - displays information about the list of - currently running plugins, ie: -

    - Currently running plugins: -
    [ 1] Trace HLSDK API, v1.XX.93, 2003/02/17, by Will Day <willday@metamod.org>, see http://www.metamod.org/ -
    [ 2] Adminmod, v2.50.56 (MM), Jul 13 2003, by Alfred Reynolds <alfred@valvesoftware.com>, see http://www.adminmod.org/ -
    2 plugins -
    - -

- - -

Client Cvars -

- -Also available to client browser applications is a cvar -metamod_version that should report the version of Metamod -running on the server, ie: -

-

"metamod_version" is "1.21p37" - - -

Installation -

- - -If you want to install Metamod by hand, here's what you have to do: -
    - -

  • Install the Metamod library (.dll for win32, or .so for linux) to a -directory under your game directory. For instance, if you were -running Counter-Strike, under win32 you might want have: - -

    -	half-life/cstrike/addons/metamod/dlls/metamod.dll
    -
    - -

    If a directory you want doesn't exist, create it. - -

  • Edit the "liblist.gam" file in your game directory, -replacing the game dll filename with the Metamod dll filename. For -instance with Counter-Strike, you would change: -

    -
    gamedll "dlls/mp.dll" -
    gamedll_linux "dlls/cs.so" -
    -to: -
    -
    gamedll "addons/metamod/dlls/metamod.dll" -
    gamedll_linux "addons/metamod/dlls/metamod.so" -
    - -

    Note that it's only really necessary to change the line corresponding -to your OS (win32 or linux); you can leave the other line unchanged, or you -can change it - it doesn't matter. - -

  • To load plugins at game startup, you'll need to create a "plugins.ini" file containing a list of the plugins -you want to load. - -
- -


-

Configuration -

- -Metamod has several ways to provide config options, partially because it -started with one method and then added other methods, but also because one -method can be more convenient than the other, varying with the situation. - -

-Generally speaking, the two methods of providing configuration -information to Metamod are: -

    -
  • on the command line, via +localinfo - arguments to hlds. -
  • as the contents of some file that Metamod reads and parses. -
- -

-The confusing part can come when the pathnames to some of the config -files can be specified via command line options - or indeed, when the -pathnames to some config files can be specified in other -config files. - -

-In any case, here are the various config options and config files Metamod -uses, (listed in order of priority), where "$gamedir" -indicates the game directory, ie "cstrike": - -

    -
  • +localinfo mm_configfile - <file> - -

    -

  • +localinfo mm_pluginsfile - <file> -
  • config.ini option: plugins_file - <file> -
  • $gamedir/addons/metamod/plugins.ini -
  • $gamedir/metamod.ini - -

    -

  • $localinfo mm_execcfg - <file> -
  • config.ini option: exec_cfg - <file> -
  • $gamedir/addons/metamod/exec.cfg -
  • $gamedir/metaexec.cfg - -

    -

  • $localinfo mm_gamedll - <file> -
  • config.ini option: gamedll - <file> -
  • $gamedir/metagame.ini - -- No longer supported. -
- - -


-

File: plugins.ini -

- -Default location: $gamedir/addons/metamod/plugins.ini, ie -"cstrike/addons/metamod/plugins.ini". - -

Plugins are described in a file "plugins.ini" and each line describes a -plugin to load: - -

-
<platform> <filepath> [<description>] -
- -

Fields are whitespace delimited (tabs/spaces). - -

    -
  • Platform is a keyword, either "linux" or - "win32". - -

  • Filepath is a path to the DLL/so file. Relative paths - are from the game dir; absolute paths are also valid. Paths should use - unix-style forward slashes (/) and not backward - slashes (\), even on windows platforms. - -

    Also, the filepath (once expanded to full path name) is expected to - be unique within the list of plugins. Thus, a plugin with a - fullpathname matching that of a previous plugin is considered a - duplicate, and is not loaded. - -

  • Description is an optional description of the plugin, used - in place of the plugin's internal name in log messages and console - output. Whitespace in the description is allowed; - quoting is unnecessary. -
- -Comments are recognized at only the beginning of a line, and -can be in either shell style ("#") or c++ style ("//"). - -

For instance, in "cstrike/addons/metamod/plugins.ini" -these are all valid lines: - -

-    // linux    dlls/mybot.so
-    # win32     dlls/mybot-old.dll         Mybot old
-    win32       dlls/mybot.dll             Mybot current
-    linux       /tmp/stub_mm_i386.so
-    win32       /tmp/stub_mm_i386.dll
-    linux       ../dlls/trace_mm_i386.so
-    win32       ../dlls/trace_mm_i386.dll
-    linux       dlls/admin_MM_i386.so
-    win32       dlls/admin_MM_i386.dll
-
- -

Note that order in the plugins.ini file is significant. -Plugins are loaded and accessed in the order specified, so ordering -can be important, depending on the plugin(s). - -

The file is re-read at changelevel, as well as on demand (via -"meta refresh" console command; see below). When the file -is re-read, it will: - -

    -
  • load any new plugins added to the file - -
  • unload any plugins that have been deleted from the file. This is - only applicable to plugins loaded from the inifile. If the - plugin was loaded from the console, it will not be unloaded during a - refresh, whether it's in the inifile or not. - -
  • reload any plugin whose file on disk has been updated since it was - loaded. Note this appears to be only useful under linux, as under Windows - you cannot rename or overwrite an open DLL, so it doesn't look a loaded - plugin could ever have a newer file on disk. Oh well. -
- -

The game dll is auto-detected, along the same lines AdminMod operated -(looking at the "gamedir"); see "mm_gamedll" below if you want to use a -"bot" DLL. - -

You can override the name of this file by specifying it via the +localinfo field "mm_pluginsfile". - -

For compatibility with previous versions, Metamod will also look for a -file "metamod.ini" under the gamedir, ie "cstrike/metamod.ini". - - -


-

File: config.ini -

- -Default location: $gamedir/addons/metamod/config.ini, ie -"cstrike/addons/metamod/config.ini". - -

-This contains basic config information, at the moment duplicating most of -the +localinfo variables, but allowing for more -flexible expansion of config options in the future. Also, it provides -somewhat more reliable options setting, since +localinfo munges some -argument values (in particular, pathnames with leading dots, ie -"../dlls/blah.dll"). - -

-Basic format is: - -

-
<option> <value> -
- -

Fields are whitespace delimited (tabs/spaces). Comments are recognized -at only the beginning of a line, and can be in either shell -style ("#") or c++ style ("//"). - -The following is a list of currently recognized options, their defaults, -and examples of usage: - -

    - -

  • debuglevel <number> -

    where <number> is an integer, 0 and up. -
    Sets the initial debugging level for metamod (same as cvar - "meta_debug"). -
    Default is normally 0. If hlds is run with "-dev", default is 3. -
    Overridden by: +localinfo mm_debug <number> -
    Examples: -
    debuglevel 0 -
    debuglevel 42 - -

  • gamedll <path> -

    where <path> is an absolute path, or a path relative to - the gamedir. -
    Overrides the auto-detected gamedll, in particular for bots. -
    Default is empty, with gamedll being auto-recognized based on the - gamedir. -
    Overridden by: +localinfo mm_gamedll <number> -
    Examples: -
    gamedll dlls/hl.dll -
    gamedll ../podbot/podbot.dll -
    gamedll /home/bots/dlls/mybot.dll - -

  • plugins_file <path> -

    where <path> is an absolute path, or a path relative to - the gamedir. -
    Overrides the default filename containing the MM plugins to load. -
    Default is "addons/metamod/plugins.ini". -
    Overridden by: +localinfo mm_pluginsfile <number> -
    Examples: -
    plugins_file cfg/clanmode.ini -
    plugins_file ../private.ini -
    plugins_file /home/half-life/testing.ini - -

  • exec_cfg <path> -

    where <path> is a path relative to the gamedir. - NOTE! This cannot be an absolute path, as hlds will - not "exec" absolute pathnames. -
    Overrides the default filename containing hlds commands to run - just after loading Metamod. -
    Default is "addons/metamod/exec.cfg". -
    Overridden by: +localinfo mm_execcfg <number> -
    Examples: -
    exec_cfg configs/debugging.cfg -
    exec_cfg ../clan/match.cfg - -

  • autodetect <yes/no> -

    Setting to disable or enable autodetection of gamedll. Extra feature for Metamod+All-Mod-Support Patch. -
    Default is "yes". -
    Overridden by: +localinfo mm_autodetect <yes/no> - -

  • clientmeta <yes/no> -

    Setting to disable or enable Metamod's client commands, 'meta list' and 'meta version'. Extra setting for Metamod+All-Mod-Support Patch. -
    Default is "yes". -
    Overridden by: +localinfo mm_clientmeta <yes/no> - -

- -

You can override the name of this file by specifying it via the +localinfo field "mm_configfile". - - -


- -

File: exec.cfg -

- -Default location: $gamedir/addons/metamod/exec.cfg, ie -"cstrike/addons/metamod/exec.cfg". - -This is necessary for plugins that need to have settings specified prior -to early API routines like ServerActivate, since autoexec.cfg is -read too early and server.cfg is read to late. In particular, I -found this necessary for the Trace plugin, in order to trace routines like -RegUserMsg which are called during ServerActivate. - -

You can override the name of this file by specifying it via the +localinfo field "mm_execcfg". - -

For compatibility with previous versions, Metamod will also look for a -file "metaexec.cfg" under the gamedir, ie "cstrike/metaexec.cfg". - - -


- -

file: metagame.ini -

- -NOTE! This file is no longer supported! -- use instead the -+localinfo field -"mm_gamedll" or the config.ini option gamedll. - - -


- -

Commandline option: +localinfo -

- -Several of Metamod's configuration options can be specified by the -"+localinfo" facility on the hlds command line. This is similar to the -"setinfo" console command, where the syntax is: - -
-
+localinfo <field> <value> -
- -Current localinfo fields recognized by Metamod: -
    - -

  • mm_configfile Specifies the - file that lists config options, instead of using the file config.ini. The <value> - should be the pathname of the config file, either absolute path or - path relative to the gamedir. - -

  • mm_pluginsfile Specifies a - file that lists the Metamod plugins to load, instead of using the file plugins.ini. The <value> - should be the pathname of the plugins file, either absolute path or - path relative to the gamedir. - -

  • mm_execcfg Specifies a file - that contains cvar or other configs to be exec'd after loading the - plugins, instead of using the file exec.cfg. - The <value> should be the pathname of the exec - file, either absolute path or path relative to the gamedir. - -

  • mm_autodetect Specifies if 'autodetect of gamedll' should be enabled - or disabled. It's enabled by default. This is extra feature of - Metamod+All-Mod-Support Patch. - -

  • mm_clientmeta Specifies if Metamod's client commands should be enabled - or disabled. It's enabled by default. This is extra setting of - Metamod+All-Mod-Support Patch. - -

  • mm_gamedll Specifies a game or Bot - DLL to be used instead of the normal gameDLL. The - <value> should be the pathname of the DLL, - either absolute path or path relative to the gamedir. - -

    This replaces using the metagame.ini - file. With previous versions of AdminMod (2.10 and earlier), this same - functionality was provided by the file "admin.ini". - -

  • mm_debug Specifies an initial - meta_debug value. - -
- -

Note that each localinfo field can have only one value. If -specified more than once on the command line, only the last one will -be recognized. (In particular, trying to use mm_gamedll to load multiple -dll-style bots will not work. In a case like that, the multiple -dll's must be chained together). - -

Some examples are: -

-	./hlds_run -game cstrike +localinfo mm_pluginsfile mylist.ini
-	./hlds_run -game cstrike +localinfo mm_execcfg mysettings.cfg
-	./hlds_run -game cstrike +localinfo mm_gamedll dlls/pod_bot.so
-	./hlds_run -game cstrike +localinfo mm_debug 7
-
- -

Note, paths should use unix-style forward slashes (/) and -not backward slashes (\), even on windows platforms. - - -


- -

Commands -

- -

All console command functionality is provide by a single command "meta", -with multiple sub-commands: - -

-   usage: meta <command> [<arguments>]
-   valid commands are:
-      version                - display Metamod version info
-      list                   - list plugins currently loaded
-      cmds                   - list console cmds registered by plugins
-      cvars                  - list cvars registered by plugins
-      refresh                - load/unload any new/deleted/updated plugins
-      config                 - show config info loaded from config.ini
-      load <name>            - find and load a plugin with the given name
-      unload <plugin>        - unload a loaded plugin
-      reload <plugin>        - unload a plugin and load it again
-      info <plugin>          - show all information about a plugin
-      pause <plugin>         - pause a loaded, running plugin
-      unpause <plugin>       - unpause a previously paused plugin
-      retry <plugin>         - retry a plugin that previously failed its action
-      clear <plugin>         - clear a failed plugin from the list
-      force_unload <plugin>  - forcibly unload a loaded plugin
-      require <plugin>       - exit server if plugin not loaded/running
-

- -where <plugin> can be either the plugin index number, or a non-ambiguous prefix -string matching description or file. - -

Also, a single cvar is available: -

-   meta_debug       - set debugging level
-
- -

For instance with: - -

-  Currently loaded plugins:
-        description       stat pend  file               vers    src  load  unlod
-   [ 1] Trace HLSDK API   RUN   -    mm_trace_i386.so   v0.90   ini  ANY   Pause
-   [ 2] adminmod          RUN   -    admin_MM.so        v2.11   ini  Start Start
-   [ 3] stub              RUN   -    mm_stub_i386.so    v0.90   ini  ANY   Pause
-  2 plugins, 2 running
-

- -

You could then do any of the following to unload the API Trace plugin: -

-   meta unload 1
-   meta unload trace
-   meta unload mm_trace
-
- - -
- -

Plugin Loading/Unloading Process -

- -Through the process of loading and unloading, a plugin can be in one of -several different states ('stat' column in the 'meta list' output): - -
    -
  • BADFILE - The plugin file couldn't be found, or it - doesn't appear to be a valid Metamod plugin. -
  • OPENED - The plugin file was found, and is a valid - Metamod plugin, and is ready to be loaded. -
  • FAILED - The plugin file attempted to load or unload, - but couldn't complete for some reason. -
  • RUNNING - The plugin file was loaded and is active - and running. -
  • PAUSED - The plugin file was loaded, but has been - temporarily disabled. -
- -Also through the operation process, a plugin can have a pending "action" to -next take (indicated by the 'pend' column in the 'meta list' output), and -can be one of: - -
    -
  • LOAD - Open and look at the plugin file. -
  • ATTACH - Attach the plugin to the running game; ie - activate it -
  • UNLOAD - Remove the plugin from the running game and - close the file -
  • RELOAD - Unload/close and re-open/load the plugin, - for instance when the plugin file has changed. -
- - -
- -

Example Output -

-

Here's some other example output: - -

-   meta info admin
-            name: adminmod
-            desc: Adminmod
-          status: running
-          action: none
-        filename: dlls/admin_MM.so
-            file: admin_MM.so
-        pathname: /home/willday/test/cstrike/dlls/admin_MM.so
-           index: 3
-          source: ini file
-        loadable: at server startup
-      unloadable: at server startup
-         version: 2.11
-            date: 2001/02/04
-          author: Alfred Reynolds <alfred@mazuma.net.au>
-             url: http://www.adminmod.org/
-          logtag: ADMIN
-     last loaded: Mon Feb  5 02:06:34 2001
-   DLLAPI functions:
-      GameDLLInit
-      DispatchThink
-      ClientConnect
-      ClientCommand
-      ClientUserInfoChanged
-      ServerActivate
-   6 functions (dllapi)
-   No DLLAPI-Post functions.
-   No NEWAPI functions.
-   No NEWAPI-Post functions.
-   No Engine functions.
-   No Engine-Post functions.
-   Registered commands:
-      admin_command
-   1 commands
-   Registered cvars:                      float value  string value
-      users_file                             0.000000  users.ini
-      maps_file                              0.000000  mapvote.txt
-      default_access                         1.000000  1
-      ips_file                               0.000000  0
-      reserve_slots                          1.000000  1
-      reserve_slots_msg                      0.000000  0
-      admin_debug                            1.000000  1
-      password_field                         0.000000  admin_password
-      alarm_message                          0.000000  0
-      alarm_time                             0.000000  0
-      use_regex                              1.000000  1
-      models_password_field                  0.000000  0
-      models_file                            0.000000  models.ini
-      models_kick_msg                        0.000000  Invalid model
-      script_file                            0.000000  cstrike/dlls/admin.amx
-      help_file                              0.000000  admin_help.txt
-      vote_freq                            360.000000  360
-      encrypt_password                       1.000000  1
-      pretty_say                             1.000000  1
-      admin_mod_version                      2.110000  2.11
-      reserve_type                           1.000000  1
-      map_ratio                             60.000000  60
-      kick_ratio                            75.000000  75
-      words_file                             0.000000  0
-      password_timeout                    1800.000000  1800
-      file_access_read                       0.000000  0
-      file_access_write                      0.000000  0
-      public_slots_free                     20.000000  20.000000
-      allow_client_exec                      0.000000  0
-      admin_balance_teams                    0.000000  0
-   30 cvars
-
-   meta cmds
-   Registered plugin commands:
-          plugin              command
-    [  1] API trace           trace_version
-    [  2] API trace           trace
-    [  3] API trace           untrace
-    [  4] API trace           showtrace
-    [  5] Adminmod            admin_command
-   5 commands, 5 available
-
-   meta cvars
-   Registered plugin cvars:
-          plugin      cvar                   float value  string value
-    [  1] API trace   trace_debug               3.000000  3.000000
-    [  2] API trace   trace_dllapi              8.000000  8
-    [  3] API trace   trace_newapi              0.000000  0
-    [  4] API trace   trace_engine              8.000000  8
-    [  5] Adminmod    users_file                0.000000  users.ini
-    [  6] Adminmod    maps_file                 0.000000  mapvote.txt
-    [  7] Adminmod    default_access            1.000000  1
-    [  8] Adminmod    ips_file                  0.000000  0
-    [  9] Adminmod    reserve_slots             1.000000  1
-    [ 10] Adminmod    reserve_slots_msg         0.000000  0
-    [ 11] Adminmod    admin_debug               1.000000  1
-    [ 12] Adminmod    password_field            0.000000  admin_password
-    [ 13] Adminmod    alarm_message             0.000000  0
-    [ 14] Adminmod    alarm_time                0.000000  0
-    [ 15] Adminmod    use_regex                 1.000000  1
-    [ 16] Adminmod    models_password_fiel      0.000000  0
-    [ 17] Adminmod    models_file               0.000000  models.ini
-    [ 18] Adminmod    models_kick_msg           0.000000  Invalid model
-    [ 19] Adminmod    script_file               0.000000  cstrike/dlls/admin.amx
-    [ 20] Adminmod    help_file                 0.000000  admin_help.txt
-    [ 21] Adminmod    vote_freq               360.000000  360
-    [ 22] Adminmod    encrypt_password          1.000000  1
-    [ 23] Adminmod    pretty_say                1.000000  1
-    [ 24] Adminmod    admin_mod_version         2.110000  2.11
-    [ 25] Adminmod    reserve_type              1.000000  1
-    [ 26] Adminmod    map_ratio                60.000000  60
-    [ 27] Adminmod    kick_ratio               75.000000  75
-    [ 28] Adminmod    words_file                0.000000  0
-    [ 29] Adminmod    password_timeout       1800.000000  1800
-    [ 30] Adminmod    file_access_read          0.000000  0
-    [ 31] Adminmod    file_access_write         0.000000  0
-    [ 32] Adminmod    public_slots_free        20.000000  20.000000
-    [ 33] Adminmod    allow_client_exec         0.000000  0
-    [ 34] Adminmod    admin_balance_teams       0.000000  0
-   34 cvars, 34 available
-
-   meta unload stub
-   Unloaded plugin 'Stub plugin'
-   Currently loaded plugins:
-         description       stat pend  file               vers   src  load  unlod
-    [ 1] Trace HLSDK API   RUN   -    mm_trace_i386.so   v0.90  ini  ANY   Pause
-    [ 2] adminmod          RUN   -    admin_MM.so        v2.11  ini  Start Start
-   2 plugins, 2 running
-
-   meta load stub
-   Loaded plugin 'stub' successfully
-   Currently loaded plugins:
-         description       stat pend  file               vers   src  load  unlod
-    [ 1] Trace HLSDK API   RUN   -    mm_trace_i386.so   v0.90  ini  ANY   Pause
-    [ 2] adminmod          RUN   -    admin_MM.so        v2.11  ini  Start Start
-    [ 3] stub              RUN   -    mm_stub_i386.so    v0.90  cmd  ANY   Pause
-   3 plugins, 3 running
-
- -

-


- - - diff --git a/doc/html/newapi_notes.html b/doc/html/newapi_notes.html deleted file mode 100644 index 375c240..0000000 --- a/doc/html/newapi_notes.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - -HLSDK NEWAPI Notes - - - -

HLSDK NEWAPI Notes -

- -
- - -NOTE: No examples of these found in SDK... - -

- -


OnFreeEntPrivateData

-
void OnFreeEntPrivateData(edict_t pEnt);

-from engine/eiface.h:
-

- Called right before the object's memory is freed. Calls its destructor. -
-

comments:
-

- See also Ken Birdwell on constructors, from the HLCoders list. -
Added in SDK 2.0. -
- -

GameShutdown

-
void GameShutdown(void);

-

comments:
-

- Added in SDK 2.0. -
- -

ShouldCollide

-
int ShouldCollide(edict_t *pentTouched, edict_t *pentOther);

-from kenb@valvesoftware.com, via HLCoders:
-

- ..a hook that can override if any two entities should collide - when they try to pass through each other. -
-

comments:
-

- Mugsy from DoD indicates that the return value for normal operation is 1. -
Added in SDK 2.0. -
- -

-


- - - diff --git a/doc/html/release_notes.html b/doc/html/release_notes.html deleted file mode 100644 index 6fc26d4..0000000 --- a/doc/html/release_notes.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - -Metamod Release Notes - - - -

Release Notes -

- - -

Major changes with Metamod 1.17 -

- -
    - -

  • New cvar "metamod_version" that can be queried from -client game browsers. - -

  • New console commands available to clients (much like the existing -server console commands): - -

      -
    • "meta version" prints out version information - (date, compile type, etc). -
    • "meta list" shows a list of the plugins running on - the server (name, author, version, etc). -
    - -

  • New file config.ini to provide a -more reliable and flexible method of specifying configuration options. -At the moment, the recognized options mirror those from +localinfo, ie: - -

    -

      -
    • debuglevel <number> -
    • gamedll <path> -
    • plugins_file <path> -
    • exec_cfg <path> -
    • autodetect <yes/no> -
    • clientmeta <yes/no> -
    - -

    Default path is "addons/metamod/config.ini" but can be -overridden with "+localinfo mm_configfile". - -

    Also, new console command "meta config" to display this -information. - -

  • New console command "meta require" to force the -server to exit if the specified plugin isn't loaded/running. Intended for -use in server.cfg or metaexec.cfg, to keep the server from starting up if -desired plugins don't load. For example: - -

    -

      -
    • meta require adminmod -
    • meta require 1 -
    - -

    The former requires that a plugin with the substring "adminmod" is found -loaded and running. The latter requires that the plugin in slot 1 is -loaded and running. - -

  • If an override gamedll is specified and found to be invalid or -missing, Metamod will now exit with an appropriate error message, rather -than just falling back to the auto-detected gamedll. This should provide -more immediate and useful feedback, and help prevent some confusion. - -
- -

-


- - -

Incompatible changes with Metamod 1.13 -

- -
    - -
  • Config file metagame.ini is no longer supported. This -file was deprecated in Metamod 1.08 (2001/06/16). Use instead the "+localinfo mm_gamedll" option. - -
- - - -

Major changes with Metamod 1.13 -

- -
    - -
  • New config file names and locations, per the Addon -Development Standard rev 1.00, developed on the hlds_apps -list. - -

    Default config file locations are now: -

      -
    • $gamedir/addons/metamod/plugins.ini -
    • $gamedir/addons/metamod/exec.cfg -
    - -

    Previous config file locations are also supported for backwards - compability: - -

      -
    • $gamedir/metamod.ini -
    • $gamedir/metaexec.cfg -
    - -

    Note that the pathnames in plugins.ini are unchanged, and are still - relative to the gamedir. - -

- -

-


- - - diff --git a/doc/html/supportedmods.html b/doc/html/supportedmods.html deleted file mode 100644 index fe8322e..0000000 --- a/doc/html/supportedmods.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - -Metamod Supported Mods/Games - - - - -

Supported Mods/Games -

-
- -Metamod includes support for the following mods, with version and last -update if known. - -

-To get support added for a new Mod, or for an updated version of a Mod, see -Adding game support. - -

- - - - - -
Name Version Last update Ent list Comments
ALL MODS SUPPORTED BY
-    All-Mod-Support PATCH
-    By Jussi Kivilinna
-    http://koti.mbnet.fi/axh/ -
NONE
- - - diff --git a/doc/html/trace.html b/doc/html/trace.html deleted file mode 100644 index eb24ba6..0000000 --- a/doc/html/trace.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - -Metamod TraceAPI Plugin - - - -

TraceAPI plugin -

- -

This was originally intended as a (more or less) complete example of a -Metamod plugin. It catches every call available to it (dll -routines both before and after the game, as well as engine functions both -before and after the engine). - -

Because it catches every routine, I figured I'd give it the ability to -log when given routines are called, so it became an "api tracing" plugin. -:) - -

This can actually be useful for tracking the operation of the HL -engine, as well as that of a particular HL game mod. - -

It recognizes the following server cvars: - -

-   // Tracing debug levels; higher values log increasingly frequent routines.
-   // Currently 0-50.  See "api_info.cpp" for the debug levels of various
-   // functions.
-
-   // Trace level for dllapi routines.
-   trace_dllapi
-
-   // Trace level for "new" dllapi routines.
-   trace_newapi
-
-   // Trace level for engine functions.
-   trace_engine
-
-   // Enable unlimited trace logging.  By default (as of v1.06), it only
-   // logs _one_ trace message per second, to keep from overwhelming the
-   // server.  Set to "1" to enable unlimited logging.  (Default "0")
-   trace_unlimit
-
-   // General debug level, independent of trace levels.  Not currently used.
-   trace_debug
-
-
- -

and the following server commands: - -

-   // Enable tracing of a given routine, independent of "trace_*" level.
-   // See the list of routine names in "api_info.cpp".  Case is insignificant.
-   trace set <APIroutine>
-
-   // Disable tracing of a given routine, iff previously enabled with "trace".
-   // Doesn't affect routines being logged via "trace_*" level.
-   trace unset <APIroutine>
-
-   // Show the routines being traced.
-   trace show
-
-   // List the various routines that can be traced.
-   trace list dllapi
-   trace list newapi
-   trace list engine
-   trace list all
-
-   // Prints out version/date/etc.
-   trace version
-
- -

Note the information it logs on each routine invocation is, at the -moment, relatively minimal. I included information that seemed obvious -(args for a ClientCommand, etc), and I've added info for other -routines as I've come across a need. Most routines I still know too little -about to log any particular information (CreateBaseline, etc). -Feel free to add information that you're interested in to the log messages -in the routines; the examples should be pretty self-explanatory. I'd be -interested in knowing as well, for adding it to the distribution code. - -

-


- - - diff --git a/doc/html/wdmisc.html b/doc/html/wdmisc.html deleted file mode 100644 index 4c919fe..0000000 --- a/doc/html/wdmisc.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - -Metamod WDMisc Plugin - - - -

WDMisc plugin -

- -

This is a simple plugin that I use as a testbed for various features -and other things I need to try from a plugin. - -

It currently provides two features: - -

    - -

  • a cvar "bounce" that, if set to 1, will exit the server at map - change. I use this when I need to shutdown or the server, and don't - want to kill it in the middle of a map, nor watch the server constantly - until the timelimit expires. - -

  • it prints a centersay to all the players whenever someone in - Counter-Strike plants the bomb. This was done basically as a - proof-of-concept for catching certain game-events that aren't otherwise - triggered by the HL API. It works only by examining every log message - that the server generates, and checking to see if it includes the string - indicating the particular event in question (in this case - "Planted_The_Bomb"). - -

    Although this works, it is really a rather poor - solution to the problem, as it assumes a lot of - string-compares, which can seriously degrade the performance of - the server. I did try to take as many short-cuts as reasonable in the - code, to decrease the amount of string-comparing going on, which makes - the code a bit less readable than doing just a "strstr" on the log line. - -

- -Other features to be added/removed in the future... - -

-


- - - diff --git a/doc/plugins.ini b/doc/plugins.ini deleted file mode 100644 index c7d7458..0000000 --- a/doc/plugins.ini +++ /dev/null @@ -1,35 +0,0 @@ -// vim: set ft=c : -// -// Format is as follows: -// -// -// Fields are whitespace delimited (tabs/spaces). -// -// - Platform must be either "linux" or "win32". -// - Path can be either an absolute pathname, or a pathname relative to the -// gamedir. Paths should use unix-style forward slashes (/) rather than -// windows-style backslashes (\), even on windows platforms. Also, the -// path (once expanded to full path name) is expected to be unique within -// the list of plugins. Thus, a plugin with a fullpathname matching that -// of a previous plugin is considered a duplicate, and is not loaded. -// - Description is optional, and replaces the plugin's internal name in -// console output and log messages. -// -// Comments are either c++ style ("//") or unix shell style ("#"), and -// can appear ONLY at the beginning of a line. -// -// Note that the plugins are loaded and accessed in the order specified, so -// ordering CAN be important, depending on the plugin(s). -// -// The following are examples of valid lines. -// - -// linux dlls/mybot.so -# win32 dlls/mybot-old.dll Mybot old -win32 dlls/mybot.dll Mybot current -linux /tmp/stub_mm_i386.so -win32 /tmp/stub_mm_i386.dll -linux ../dlls/trace_mm_i386.so -win32 ../dlls/trace_mm_i386.dll -linux dlls/admin_MM_i386.so -win32 dlls/admin_MM_i386.dll diff --git a/doc/txt/Index.txt b/doc/txt/Index.txt deleted file mode 100644 index 40f558d..0000000 --- a/doc/txt/Index.txt +++ /dev/null @@ -1,27 +0,0 @@ -Metamod -=-=-=-= - -Metamod is a plugin/DLL manager that sits between the Half-Life Engine and -an HL Game mod, allowing the dynamic loading/unloading of mod-like DLL -plugins to add functionality to the HL server or game mod. - --------------------------------------------------------------------------- - -See metamod.org (metamod.org/) for news, downloads, and plugin links. - --------------------------------------------------------------------------- - -Metamod Docs Other HLDS info - - - About metamod * SDK DLLAPI Notes - - FAQ * SDK NEWAPI Notes - - Using metamod * SDK Engine Notes - - Release Notes - - Game/Mod support * Related links & books - - Trace Plugin * Mailing lists - - WDMisc Plugin - - Coding for metamod - --------------------------------------------------------------------------- - - diff --git a/doc/txt/a.txt b/doc/txt/a.txt deleted file mode 100644 index cb6dccb..0000000 --- a/doc/txt/a.txt +++ /dev/null @@ -1,19 +0,0 @@ -Supported Games -=-=-=-=-=-=-=-= - -Metamod includes support for the following mods, with version and last -update if known. - -To get support added for a new Mod, or for an updated version of a Mod, -see Adding game support. - -+-------------------------------------------------------------------------+ -| Name | Version | Last | Ent | Comments | -| | | update | list | | -|---------------------------------+----------+--------+--------+----------| -| ALL MODS SUPPORTED BY | ALL | | NONE | | -| All-Mod-Support PATCH | | | | | -| By Jussi Kivilinna | | | | | -| http://koti.mbnet.fi/axh/ | | | | | -+---------------------------------+----------+--------+--------+----------+ - diff --git a/doc/txt/about.txt b/doc/txt/about.txt deleted file mode 100644 index cfef91c..0000000 --- a/doc/txt/about.txt +++ /dev/null @@ -1,35 +0,0 @@ -Metamod -=-=-=-= - -a Half-Life utility mod - - meta /me't*/ or /may't*/ or (Commonwealth) /mee't*/ adj.,pref. - [from analytic philosophy] One level of description up. - -The purpose of MetaMod is to function "one level up" from the normal -Half-Life game mod DLL. Sitting between the mod game DLL and the Half-Life -engine/binary, it intercepts the function calls between the two, with the -option of passing them along untouched, as well as passing them on to as -any number of _additional mod-like DLLs_. - -Thus, you can actually have multiple "mod-like" DLLs in operation at one -time. I say "mod-like" because these additional DLLs (we'll call them -"plugins") are not intended to provide a full "game"; that functionality -is still provided by the "game dll". However, these plugins can _add to_ -or _modify the functionality provided by the game dll, or by the engine -itself - for instance, adding new server commands, or new client commands, -or even disabling commands built into the game dll. Although the plugin -isn't intended to provide full HL-game functionality, since it's receiving -the same information given to the game DLL, it has the opportunity to do -_anything_ the game DLL can do (given enough coding effort of course). - -This is very similar to the way Alfred Reynolds' AdminMod -(www.adminmod.org) works, as it also sits between the engine and game dll, -catching routines, and passing them on. thus modifying functionality. -However, rather than providing just the additional server features builtin -to AdminMod DLL, MetaMod allows you to add features from multiple, -separate DLLs. Under that framework, AdminMod can be a plugin itself, and -be run alongside numerous other plugins. And, as of version 2.50 of -AdminMod, AM has now transitioned to running as a Metamod plugin. - --------------------------------------------------------------------------- diff --git a/doc/txt/coding.txt b/doc/txt/coding.txt deleted file mode 100644 index f9dcb3c..0000000 --- a/doc/txt/coding.txt +++ /dev/null @@ -1,340 +0,0 @@ -Coding for Metamod -=-=-=-=-=-=-=-=-=-= - - -Compiling -========= - -You'll need the Half-Life SDK, of course. In particular you'll need HL SDK -version 2.3. You can find the original SDK 2.3 at the Valve Editing -Resource Center (VERC) (www.valve-erc.com/), and a modified version of SDK -2.3 at metmod.org/files/sdk (metamod.org/files/sdk/). - - -Operation -========= - -The basic operation is, for each api call: - - - iterate through list of plugins - - for each plugin, if it provides this api call, then call the function - in the plugin - - call the "real" function (in the game dll, or from the engine) - - for each plugin, check for a "post" version of the function, and call - if present - -Also, for any api call, each plugin has the opportunity to replace the -real routine, in two ways: - - - prevent the real routine from being called (SUPERCEDE). - - allow the real routine to be called, but change the value that's - returned (OVERRIDE) - -Thus after each plugin is called, its META_RESULT flag is checked, and -action taken appropriately. Note that supercede/override only affects the -_real_ routine; other plugins will still be called. In addition to the -SUPERCEDE and OVERRIDE flags, there are two additional flags a plugin can -return: - - - HANDLED ("I did something here") - - IGNORED ("I didn't really do anything") - -These aren't used by Metamod itself, but could be used by plugins to get -an idea if a previous plugin did anything. - -Note that each routine _needs_ to set its META_RESULT value before -returning. Plugin routines that do not set a value will be reported as -errors in the logs. - - -Plugin coding requirements -========================== - -Plugins MUST provide the following standard HLSDK exported function: - - void GiveFnptrsToDll(enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals); - -AS WELL AS the following new functions: - - void Meta_Init(void); (optional) - int Meta_Query(char *interfaceVersion, plugin_info_t **pinfo, mutil_funcs_t *pMetaUtilFuncs); - int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, meta_globals_t *pMGlobals, gamedll_funcs_t *pGamedllFuncs); - int Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason); - -Also, it must provide AT LEAST one function returning a standard HL -function table, from either the following standard HLSDK functions: - - int GetEntityAPI( DLL_FUNCTIONS *pFunctionTable, int interfaceVersion ); - int GetEntityAPI2( DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion ); - int GetNewDLLFunctions( NEW_DLL_FUNCTIONS *pNewFunctionTable, int *interfaceVersion ); - -or from the following new functions: - - int GetEntityAPI_Post(DLL_FUNCTIONS *pFunctionTable, int interfaceVersion); - int GetEntityAPI2_Post(DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion ; - int GetNewDLLFunctions_Post(NEW_DLL_FUNCTIONS *pNewFunctionTable, int *interfaceVersion); - - int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion); - int GetEngineFunctions_Post(enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion); - -Thus, it needs to have (at least): - - GiveFnptrsToDll - Meta_Query - Meta_Attach - Meta_Detach - - -See the "stub_plugin" for an example of _bare minimum_ code. See " -trace_plugin" for an example of more complete functionality. - -Also, if the plugin needs to use LINK_ENTITY_TO_CLASS, support for the -particular entity(ies) has to be added explicitly to Metamod -(linkfunc.cpp), just as it does for entities in game DLLs. - - -Operation Details -================= - -These are the valid META_RESULT values a plugin routine can specify: - - - - MRES_IGNORED - The plugin did nothing. This could be used to tell a subsequent plugin - that the some situation hasn't been handled yet. This would be - recognized only by other plugins; Metamod itself doesn't do anything - special for this situation. Unless otherwise specified by a later - plugin, execution of routine in the gameDLL will take place. This is - valid in both normal and post routines. - - - MRES_HANDLED - The plugin handled the situation, or did something with the - information. Again, this could be used to tell a subsequent plugin - that some situation has already been taken care of, and is not - recognized specially by Metamod. Unless otherwise specified by a later - plugin, execution of routine in the gameDLL will take place. This is - valid in both normal and post routines. - - - MRES_OVERRIDE - The plugin is providing a return value for the routine, which should - be used in place of the return value from the gameDLL's routine (the - plugin "overrides" the gameDLL's return value). Unless otherwise - specified by a later plugin, the gameDLL routine will still be called. - Note this only makes sense for non-void routines. This is valid in - both normal and post routines. - - - MRES_SUPERCEDE - The plugin has performed sufficient actions for the routine, and the - gameDLL's routine should NOT be called (the plugin "supercedes" the - gameDLL's routine, more or less replacing it entirely). Any return - value for the routine should be specified as well by the plugin. Note - this is only valid for normal routines, as post routines cannot - prevent calling the gameDLL's routine (as it has already happened!). - Also note, this doesn't prevent subsequent plugins from being called - for this routine; it supercedes _only_ the gameDLL. - -As the plugins are called, a running status is kept of the "highest" meta -status so far, in the order (lowest to highets) shown above. After calling -all the "normal" routines, the status is checked to see if the gameDLL's -routine should be called - ie, it will not be called if one (or more) of -the plugin's has specified META_SUPERCEDE. The gameDLL's routine is then -called, or skipped, as appropriate. Then, all the "post" routines are -called in the same manner (except META_SUPERCEDE is no longer a valid meta -result). - -Last, if any plugins specified META_OVERRIDE or META_SUPERCEDE, the return -value given by the _last_ such plugin is returned as the routine's return -code to the engine (assuming a non-void routine). Thus, the order of the -plugins as specified in the metamod.ini _does_ have a possible effect. - - -Available Macros -================ - -The meta_api.h header that describes the Metamod API functions, types, and -structures also includes several macros that can be of help when coding a -plugin. - - - - SET_META_RESULT(result) - Sets the META_RESULT for the plugin. - - - RETURN_META(result) - Sets the META_RESULT for the plugin, and then calls return. This - assumes a void function. - - - RETURN_META_VALUE(result, value) - Sets the META_RESULT for the plugin, and then returns the given value. - This assumes a non-void function, and it doesn't matter the particular - type of the return value. - - - META_RESULT_STATUS - Gives the current status of META_RESULT for this routine from plugins - so far. It will return the "highest" result so far, in the order of - lesser to greater: IGNORED, HANDLED, OVERRIDE, SUPERCEDE (see also - above Operation Details) - - - META_RESULT_PREVIOUS - Gives the META_RESULT of the previous plugin. - - - META_RESULT_ORIG_RET(type) - Gives the "original" return value for the routine, ie the return value - of the routine from gameDLL. The type for the routine's return value - must be specified in the macro; this is used as a cast for assignment. - Note this is only valid in a "post" routine. - - - META_RESULT_OVERRIDE_RET(type) - Gives the return value from any previous plugin that specified - META_OVERRIDE or META_SUPERCEDE. The type for the routine's return - value must be specified in the macro; this is used as a cast for - assignment. This should only be used after checking the META_RESULT to - see if there's actually an override value available. - - - MDLL_*(args) - Calls a given DLLAPI routine in the gameDLL. For instance, - MDLL_GameDLLInit(args), MDLL_Spawn(args), etc. - - - MNEW_*(args) - Calls a given NEWAPI routine in the gameDLL. For instance, - MNEW_GameShutdown(args), etc. - - -Utility Callback Functions -========================== - -In version 1.05, Metamod began providing a set of utility functions to -plugins to centralize functionality, reduce code reuse, and to provide -some convenience in plugin coding. Presently, only a few functions are -provided. More are added as I find the time, and identify some advantage -to having them (either for my own plugins, or by others' request for their -plugins). - -Note the PLID keyword passed to each function. This is basically a "plugin -id" to indicate to Metamod which plugin is calling the function (else it's -difficult to tell), and is a macro that should be specified verbatim with -each call. (Currently, the macro is merely the plugin_info struct pointer -returned by the plugin via Meta_Query; in the future this could change to -some other identifier.) - - - - void LOG_CONSOLE(PLID, char *fmt, ...) - Print a message line on the console. Message is specified as a printf - style format string and arguments. A trailing newline is provided by - the routine and should not be specified in the string (unless you want - two newlines). - - - void LOG_MESSAGE(PLID, char *fmt, ...) - Print a message line in the server logs. Message is specified as a - printf style format string and arguments. A trailing newline is - provided by the routine and should not be specified in the string. Log - message is prefixed by the logtag string in the plugin's "info" - struct, surrounded by brackets. For instance: - - L 04/17/2001 - 18:00:35: [TraceAPI] Tracing Engine routine - 'RegUserMsg' - - - void LOG_ERROR(PLID, char *fmt, ...) - As in LOG_MESSAGE above, only marked as well with the string "ERROR:". - For example: - - L 04/17/2001 - 18:03:13: [TraceAPI] ERROR: malloc failed - - - void LOG_DEVELOPER(PLID, char *fmt, ...) - As in LOG_MESSAGE above, only message will be logged only if cvar - developer is set to 1; message is marked as well with the string "dev: - ". For example: - - L 04/17/2001 - 18:03:13: [TraceAPI] dev: called: GiveFnptrsToDll - - - void CENTER_SAY(PLID, char *fmt, ...) - Prints a message on the center of all players' screens. This is like - the "centersay" of AdminMod, with pretty_say enabled, with the same - defaults (green, and a 10 second fade-in). A message is logged as - well, ie: [added in 1.06] - - L 04/17/2001 - 15:44:52: [WDMISC] (centersay) random set up us the - bomb! - - - void CENTER_SAY_PARMS(PLID, hudtextparms_t tparms, char *fmt, ...) - As in CENTER_SAY above, but allows specifying all the parameters. (see - SDK dlls/util.h for the struct hudtextparms_t). [added in 1.06] - - - void CENTER_SAY_VARARGS(PLID, hudtextparms_t tparms, char *fmt, - va_list ap) - As in CENTER_SAY_PARMS above, only the message is passed as a - vsnprintf style varargs format string and args list. This is included - merely because both the previous CENTER_SAY functions actually call - this, and it was convenient to include it as well. [added in 1.06] - - - qboolean CALL_GAME_ENTITY(PLID, char *entStr, entvars_t *pev) - Calls an entity function in the gameDLL. For instance, a bot usually - needs to call the player entity function. [added in 1.09] - - - int GET_USER_MSG_ID(PLID, const char *name, int *size) - Returns the id number corresponding to the given message name, of - those messages registered by the gamedll with RegUserMsg, optionally - returning the registered size of the message as well. This is to allow - things like bots to access the name/id mapping without having to catch - RegUserMsg themselves, and thus have to be loaded at startup. [added - in 1.11] - - - const char * GET_USER_MSG_NAME(PLID, int msgid, int *size) - Returns the name corresponding to the given msgid number, of those - messages registered by the gamedll with RegUserMsg, optionally - returning the registered size of the message as well. It will return - guess-names for any builtin Engine messages that it knows about - (SVC_TEMPENTITY, etc). The returned string is presumed to be a - compile-time constant string, stored in the text segment of the - gamedll. [added in 1.11] - - - const char * GET_PLUGIN_PATH(PLID) - Returns the full pathname of the loaded dll/so file for the calling - plugin. The returned string is a pointer to a static buffer, and - should be copied by the caller to local storage. [added in 1.12] - - - const char * GET_GAME_INFO(PLID, ginfo_t type) - Returns various string-based information about the running game/MOD/ - gamedll. The given type can be one of: - - GINFO_NAME - short name of game, from "-game" argument to hlds (ie - "cstrike") - - GINFO_DESC - long name of game, from autodetection (ie - "Counter-Strike") - - GINFO_GAMEDIR - game directory, full pathname (ie "/usr/local/ - half-life/cstrike") - - GINFO_DLL_FULLPATH - full pathname of the game dll (ie "/usr/local - /half-life/cstrike/dlls/cs_i386.so") - - GINFO_DLL_FILENAME - bare filename of the gamedll (ie - "cs_i386.so") - The returned string is a pointer to a static buffer, and should be - copied by the caller to local storage. [added in 1.14] - - -Plugin Loading -============== - -(this is some rough notes I intend to fill in in the future) - -Plugins are loaded when the engine calls GiveFnptrsToDll(). The config -file is parsed, and for each valid plugin (uncommented, platform -relevant), the operation is: - - - dlopen() the file, store the handle - - dlsym() and call: - Meta_Init (if present) - GiveFnptrsToDll - Meta_Query - Meta_Attach - - if present, call function pointers, and store resulting function - table: - GetEntityAPI - GetEntityAPI2 - GetNewDLLFunctions - - GetEntityAPI_Post - GetEntityAPI2_Post - GetNewDLLFunctions_Post - - GetEngineFunctions - GetEngineFunctions_Post - --------------------------------------------------------------------------- diff --git a/doc/txt/dllapi_notes.txt b/doc/txt/dllapi_notes.txt deleted file mode 100644 index d73e450..0000000 --- a/doc/txt/dllapi_notes.txt +++ /dev/null @@ -1,702 +0,0 @@ -HLSDK DLLAPI Notes -=-=-=-=-=-=-=-=-=-= - --------------------------------------------------------------------------- - - - GameDLLInit - - DispatchSpawn - - DispatchThink - - DispatchUse - - DispatchTouch - - DispatchBlocked - - DispatchKeyValue - - DispatchSave - - DispatchRestore - - DispatchObjectCollsionBox - - SaveWriteFields - - SaveReadFields - - SaveGlobalState - - RestoreGlobalState - - ResetGlobalState - - ClientConnect - - ClientDisconnect - - ClientKill - - ClientPutInServer - - ClientCommand - - ClientUserInfoChanged - - ServerActivate - - ServerDeactivate - - PlayerPreThink - - PlayerPostThink - - StartFrame - - ParmsNewLevel - - ParmsChangeLevel - - GetGameDescription - - PlayerCustomization - - SpectatorConnect - - SpectatorDisconnect - - SpectatorThink - - Sys_Error - - PM_Move - - PM_Init - - PM_FindTextureType - - SetupVisibility - - UpdateClientData - - AddToFullPack - - CreateBaseline - - RegisterEncoders - - GetWeaponData - - CmdStart - - CmdEnd - - ConnectionlessPacket - - GetHullBounds - - CreateInstancedBaselines - - InconsistentFile - - AllowLagCompensation - --------------------------------------------------------------------------- - -GameDLLInit - -from dlls/game.cpp: -void GameDLLInit(void); - - Register your console variables here. - This gets called one time when the game is initialied. - Initialize the game (one-time call after loading of game .dll) - -comments: - - Called just after hlds reports "Dll loaded for mod Half-Life". - --------------------------------------------------------------------------- - -DispatchSpawn - -from dlls/cbase.cpp -int DispatchSpawn(edict_t *pent); - -comments: - - Called when entity defined in mapfile is being created. - First entity has classname "worldcraft" and can be used to detect - map start. - - 0==Success, -1==Failure ? - --------------------------------------------------------------------------- - -DispatchThink - -from dlls/cbase.cpp -void DispatchThink(edict_t *pent); - Called when pent->v.nextthink is first time less or equal as - server time. - --------------------------------------------------------------------------- - -DispatchUse - -from dlls/cbase.cpp -void DispatchUse(edict_t *pentUsed, edict_t *pentOther); - Unused. Use is dispatched internally inside gamedll. - --------------------------------------------------------------------------- - -DispatchTouch - -from dlls/cbase.cpp -void DispatchTouch(edict_t *pentTouched, edict_t *pentOther); - Called when other entity collides touched entity. - --------------------------------------------------------------------------- - -DispatchBlocked - -from dlls/cbase.cpp -void DispatchBlocked(edict_t *pentBlocked, edict_t *pentOther); - Unknown. - --------------------------------------------------------------------------- - -DispatchKeyValue - -from dlls/cbase.cpp -void DispatchKeyValue(edict_t *pentKeyvalue, KeyValueData *pkvd); - Client uses 'setinfo' command. - - pentKeyvalue Client edict - - pkvd Client key values - --------------------------------------------------------------------------- - -DispatchSave - -from dlls/cbase.cpp -void DispatchSave(edict_t *pent, SAVERESTOREDATA *pSaveData); - Save game? - --------------------------------------------------------------------------- - -DispatchRestore - -from dlls/cbase.cpp -int DispatchRestore(edict_t *pent, SAVERESTOREDATA *pSaveData, int -globalEntity); - -comments: - Load game? - - 0==Success, -1==Failure ? - --------------------------------------------------------------------------- - -DispatchObjectCollsionBox - -from dlls/cbase.cpp -void DispatchObjectCollsionBox(edict_t *pent); - --------------------------------------------------------------------------- - -SaveWriteFields - -from dlls/cbase.cpp -void SaveWriteFields(SAVERESTOREDATA *pSaveData, const char *pname, void * -pBaseData, TYPEDESCRIPTION *pFields, int fieldCount); - --------------------------------------------------------------------------- - -SaveReadFields - -from dlls/cbase.cpp -void SaveReadFields(SAVERESTOREDATA *pSaveData, const char *pname, void * -pBaseData, TYPEDESCRIPTION *pFields, int fieldCount); - --------------------------------------------------------------------------- - -SaveGlobalState - -from dlls/world.cpp -void SaveGlobalState(SAVERESTOREDATA *pSaveData); - --------------------------------------------------------------------------- - -RestoreGlobalState - -from dlls/world.cpp -void RestoreGlobalState(SAVERESTOREDATA *pSaveData); - --------------------------------------------------------------------------- - -ResetGlobalState - -from dlls/world.cpp -void ResetGlobalState(void); - --------------------------------------------------------------------------- - -ClientConnect - -from dlls/client.cpp: -BOOL ClientConnect(edict_t *pEntity, const char *pszName, const char * -pszAddress, char szRejectReason[128]); - - Called when a player connects to a server. - -comments: - - Called on initial connect, just after hlds reports "connected", ie: - "John<1>" connected, address "127.0.0.1:27005" - This is before the user begins downloading, or anything else. - --------------------------------------------------------------------------- - -ClientDisconnect - -from dlls/client.cpp: -void ClientDisconnect(edict_t *pEntity); - - Called when a player disconnects from a server. - GLOBALS ASSUMED SET: g_fGameOver - -comments: - - This is not the opposite of ClientConnect, despite the similar name. - It appears to only be called if the client was PutInServer first. If - the client disconnects before being PutInServer, no API routine is - called. This would be more appropriately named ClientRemoveFromServer_ - . - --------------------------------------------------------------------------- - -ClientKill - -from dlls/client.cpp: -void ClientKill(edict_t *pEntity); - - Player entered the suicide command. - GLOBALS ASSUMED SET: g_ulModelIndexPlayer - -comments: - - When the client typed "kill" in the console? - --------------------------------------------------------------------------- - -ClientPutInServer - -from dlls/client.cpp: -void ClientPutInServer(edict_t *pEntity); - - Called each time a player is spawned. - -comments: - - Called after the client has uploaded/download all necessary resources, - just after hlds reports "entered the game", ie: - "John<1>" has entered the game - --------------------------------------------------------------------------- - -ClientCommand - -from dlls/client.cpp: -void ClientCommand(edict_t *pEntity); - - Called each time a player uses a "cmd" command. Use CMD_ARGS, - CMD_ARGV, and CMD_ARGC to get pointers to the character string - command. - --------------------------------------------------------------------------- - -ClientUserInfoChanged - -from dlls/client.cpp: -void ClientUserInfoChanged(edict_t *pEntity, char *infobuffer); - - Called after the player changes userinfo - gives dll a chance to - modify it before it gets sent into the rest of the engine. - -comments: - - Called when user issues "setinfo" from the console. Also appears to be - called whenever the user returns to the game from the ESC menu. - --------------------------------------------------------------------------- - -ServerActivate - -from dlls/client.cpp: -void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax); - - Every call to ServerActivate should be matched by a call to - ServerDeactivate. - -comments: - - Added in SDK 2.0. Apparently called when the server has loaded the - map, but before it precaches from the .res file. - --------------------------------------------------------------------------- - -ServerDeactivate - -from dlls/client.cpp: -void ServerDeactivate(void); - - Peform any shutdown operations here. - It's possible that the engine will call this function more times than - is necessary. Therefore, only run it one time for each call to - ServerActivate. - -comments: - - Called upon "quit" or "changelevel" . - --------------------------------------------------------------------------- - -PlayerPreThink - -from dlls/client.cpp: -void PlayerPreThink(edict_t *pEntity); - - Called every frame before physics are run. - --------------------------------------------------------------------------- - -PlayerPostThink - -from dlls/client.cpp: -void PlayerPostThink(edict_t *pEntity); - - Called every frame after physics are run. - --------------------------------------------------------------------------- - -StartFrame - -from dlls/client.cpp: -void StartFrame(void); - - GLOBALS ASSUMED SET: g_ulFrameCount - --------------------------------------------------------------------------- - -ParmsNewLevel - -from dlls/client.cpp -void ParmsNewLevel(void); - --------------------------------------------------------------------------- - -ParmsChangeLevel - -from dlls/client.cpp -void ParmsChangeLevel(void); - --------------------------------------------------------------------------- - -GetGameDescription - -from dlls/client.cpp: -const char *GetGameDescription(void); - - Returns string describing current .dll game. - Returns the descriptive name of this .dll. E.g., Half-Life, or Team - Fortress 2. - This function might be called before the world has spawned, and the - game rules initialized. - --------------------------------------------------------------------------- - -PlayerCustomization - -from dlls/client.cpp: -void PlayerCustomization(edict_t *pEntity, customization_t *pCust); - - Notifies .dll of new customization for player. - A new player customization has been registered on the server. UNDONE: - This only sets the # of frames of the spray can logo animation right - now. - --------------------------------------------------------------------------- - -SpectatorConnect - -from dlls/client.cpp: -void SpectatorConnect(edict_t *pEntity); - - Called when spectator joins server. - A spectator has joined the game. - --------------------------------------------------------------------------- - -SpectatorDisconnect - -from dlls/client.cpp: -void SpectatorDisconnect(edict_t *pEntity); - - Called when spectator leaves the server. - A spectator has left the game. - --------------------------------------------------------------------------- - -SpectatorThink - -from dlls/client.cpp: -void SpectatorThink(edict_t *pEntity); - - Called when spectator sends a command packet (usercmd_t). - A spectator has sent a usercmd. - --------------------------------------------------------------------------- - -Sys_Error - -from dlls/client.cpp: -void Sys_Error(const char *error_string); - - Called when engine has encountered an error. - Notify game .dll that engine is going to shut down. - Engine is going to shut down, allows setting a breakpoint in game dll - to catch that occasion. - Add code ( e.g., _asm { int 3 }; here to cause a breakpoint for - debugging your game .dlls. - -comments: - - Added in SDK 2.0. - --------------------------------------------------------------------------- - -PM_Move - -from pm_shared/pm_shared.c: -void PM_Move(struct playermove_s *ppmove, int server); - - This modume implements the shared player physics code between any - particular game and the engine. The same PM_Move routine is built into - the game .dll and the client .dll and is invoked by each side as - appropriate. There should be no distinction, internally, between - server and client. This will ensure that prediction behaves - appropriately. - -comments: - - Added in SDK 2.0. - --------------------------------------------------------------------------- - -PM_Init - -from pm_shared/pm_shared.c: -void PM_Init(struct playermove_s *ppmove); - - Server version of player movement initialization. - -comments: - - Added in SDK 2.0. - --------------------------------------------------------------------------- - -PM_FindTextureType - -from pm_shared/pm_shared.c -char PM_FindTextureType(char *name); - -comments: - - Added in SDK 2.0. - --------------------------------------------------------------------------- - -SetupVisibility - -from dlls/client.cpp: -void SetupVisibility(edict_t *pViewEntity, edict_t *pClient, unsigned char -**pvs, unsigned char **pas); - -from dlls/client.cpp: - - Set up PVS and PAS for networking for this client. - - A client can have a separate "view entity" indicating that his/her - view should depend on the origin of that view entity. If that's the - case, then pViewEntity will be non-NULL and will be used. Otherwise, - the current entity's origin is used. Either is offset by the view_ofs - to get the eye position. - - From the eye position, we set up the PAS and PVS to use for filtering - network messages to the client. At this point, we could override the - actual PAS or PVS values, or use a different origin. - - NOTE: Do not cache the values of pas and pvs, as they depend on - reusable memory in the engine, they are only good for this one frame - -comments: - - Added in SDK 2.0. - --------------------------------------------------------------------------- - -UpdateClientData - -from dlls/client.cpp: -void UpdateClientData (const struct edict_s *ent, int sendweapons, struct -clientdata_s *cd); - - Set up data sent only to specific client. - Data sent to current client only. - Engine sets argument 'cd' to 0 before calling. - -comments: - - Added in SDK 2.0. - --------------------------------------------------------------------------- - -AddToFullPack - -from dlls/client.cpp: -int AddToFullPack(struct entity_state_s *state, int e, edict_t *ent, -edict_t *host, int hostflags, int player, unsigned char *pSet); - - Return 1 if the entity state has been filled in for the ent and the - entity will be propagated to the client, 0 otherwise. - - State is the server maintained copy of the state info that is - transmitted to the client. A MOD could alter values copied into state - to send the "host" a different look for a particular entity update, - etc. - - Arguments 'e' and 'ent' are the entity that is being added to the - update, if 1 is returneds. Host is the player's edict of the player - whom we are sending the update to. Player is 1 if the ent/e is a - player and 0 otherwise. Argument 'pSet' is either the PAS or PVS that - we previous set up. We can use it to ask the engine to filter the - entity against the PAS or PVS. - - We could also use the pas/ pvs that we set in SetupVisibility, if we - wanted to. Caching the value is valid in that case, but still only for - the current frame. - -comments: - - Added in SDK 2.0. - --------------------------------------------------------------------------- - -CreateBaseline - -from dlls/client.cpp: -void CreateBaseline(int player, int eindex, struct entity_state_s * -baseline, struct edict_s *entity, int playermodelindex, vec3_t -player_mins, vec3_t player_maxs); - - Tweak entity baseline for network encoding, allows setup of player - baselines, too. - Creates baselines used for network encoding, especially for player - data since players are not spawned until connect time. - -comments: - - Added in SDK 2.0. - --------------------------------------------------------------------------- - -RegisterEncoders - -from dlls/client.cpp: -void RegisterEncoders(void); - - Callbacks for network encoding. - Allows game .dll to override network encoding of certain types of - entities and tweak values, etc. - -comments: - - Added in SDK 2.0. - --------------------------------------------------------------------------- - -GetWeaponData - -from dlls/client.cpp -int GetWeaponData(struct edict_s *player, struct weapon_data_s *info); - -comments: - - Added in SDK 2.0. - --------------------------------------------------------------------------- - -CmdStart - -from dlls/client.cpp: -void CmdStart(const edict_t *player, const struct usercmd_s *cmd, unsigned -int random_seed); - - We're about to run this usercmd for the specified player. We can set - up groupinfo and masking here, etc. This is the time to examine the - usercmd for anything extra. This call happens even if think does not. - -comments: - - Added in SDK 2.0. - --------------------------------------------------------------------------- - -CmdEnd - -from dlls/client.cpp: -void CmdEnd (const edict_t *player); - - Each cmdstart is exactly matched with a cmd end, clean up any group - trace flags, etc. here. - -comments: - - Added in SDK 2.0. - --------------------------------------------------------------------------- - -ConnectionlessPacket - -from dlls/client.cpp: -int ConnectionlessPacket(const struct netadr_s *net_from, const char * -args, char *response_buffer, int *response_buffer_size); - - Return 1 if the packet is valid. Set response_buffer_size if you want - to send a response packet. Incoming, it holds the max size of the - response_buffer, so you must zero it out if you choose not to respond. - -comments: - - Added in SDK 2.0. - --------------------------------------------------------------------------- - -GetHullBounds - -from dlls/client.cpp: -int GetHullBounds(int hullnumber, float *mins, float *maxs); - - Engine calls this to enumerate player collision hulls, for prediction. - Return 0 if the hullnumber doesn't exist. - -comments: - - Added in SDK 2.0. - --------------------------------------------------------------------------- - -CreateInstancedBaselines - -from dlls/client.cpp: -void CreateInstancedBaselines (void); - - Tweak entity baseline for network encoding, allows setup of player - baselines, too. - Create pseudo-baselines for items that aren't placed in the map at - spawn time, but which are likely to be created during play (e.g., - grenades, ammo packs, projectiles, corpses, etc.). - -comments: - - Added in SDK 2.0. - --------------------------------------------------------------------------- - -InconsistentFile - -from dlls/client.cpp: -int InconsistentFile(const edict_t *player, const char *filename, char * -disconnect_message); - - One of the ENGINE_FORCE_UNMODIFIED files failed the consistency check - for the specified player Return 0 to allow the client to continue, 1 - to force immediate disconnection (with an optional disconnect message - of up to 256 characters). - -comments: - - Added in SDK 2.0. - --------------------------------------------------------------------------- - -AllowLagCompensation - -from dlls/client.cpp: -int AllowLagCompensation(void); - - The game .dll should return 1 if lag compensation should be allowed - (could also just set the sv_unlag cvar. Most games right now should - return 0, until client-side weapon prediction code is written and - tested for them (note you can predict weapons, but not do lag - compensation, too, if you want. - -comments: - - Added in SDK 2.0. - --------------------------------------------------------------------------- diff --git a/doc/txt/engine_notes.txt b/doc/txt/engine_notes.txt deleted file mode 100644 index 8b12394..0000000 --- a/doc/txt/engine_notes.txt +++ /dev/null @@ -1,2166 +0,0 @@ -HLSDK Engine Notes -=-=-=-=-=-=-=-=-=-= - --------------------------------------------------------------------------- - - - PrecacheModel - - PrecacheSound - - SetModel - - ModelIndex - - ModelFrames - - SetSize - - ChangeLevel - - GetSpawnParms - - SaveSpawnParms - - VecToYaw - - VecToAngles - - MoveToOrigin - - ChangeYaw - - ChangePitch - - FindEntityByString - - GetEntityIllum - - FindEntityInSphere - - FindClientInPVS - - EntitiesInPVS - - MakeVectors - - AngleVectors - - CreateEntity - - RemoveEntity - - CreateNamedEntity - - MakeStatic - - EntIsOnFloor - - DropToFloor - - WalkMove - - SetOrigin - - EmitSound - - EmitAmbientSound - - TraceLine - - TraceToss - - TraceMonsterHull - - TraceHull - - TraceModel - - TraceTexture - - TraceSphere - - GetAimVector - - ServerCommand - - ServerExecute - - ClientCommand - - ParticleEffect - - LightStyle - - DecalIndex - - PointContents - - MessageBegin - - MessageEnd - - WriteByte - - WriteChar - - WriteShort - - WriteLong - - WriteAngle - - WriteCoord - - WriteString - - WriteEntity - - CVarRegister - - CVarGetFloat - - CVarGetString - - CVarSetFloat - - CVarSetString - - AlertMessage - - EngineFprintf - - PvAllocEntPrivateData - - PvEntPrivateData - - FreeEntPrivateData - - SzFromIndex - - AllocString - - GetVarsOfEnt - - PEntityOfEntOffset - - EntOffsetOfPEntity - - IndexOfEdict - - PEntityOfEntIndex - - FindEntityByVars - - GetModelPtr - - RegUserMsg - - AnimationAutomove - - GetBonePosition - - FunctionFromName - - NameForFunction - - ClientPrintf - - ServerPrint - - Cmd_Args - - Cmd_Argv - - Cmd_Argc - - GetAttachment - - CRC32_Init - - CRC32_ProcessBuffer - - CRC32_ProcessByte - - CRC32_Final - - RandomLong - - RandomFloat - - SetView - - Time - - CrosshairAngle - - LoadFileForMe - - FreeFile - - EndSection - - CompareFileTime - - GetGameDir - - Cvar_RegisterVariable - - FadeClientVolume - - SetClientMaxspeed - - CreateFakeClient - - RunPlayerMove - - NumberOfEntities - - GetInfoKeyBuffer - - InfoKeyValue - - SetKeyValue - - SetClientKeyValue - - IsMapValid - - StaticDecal - - PrecacheGeneric - - GetPlayerUserId - - BuildSoundMsg - - IsDedicatedServer - - CVarGetPointer - - GetPlayerWONId - - Info_RemoveKey - - GetPhysicsKeyValue - - SetPhysicsKeyValue - - GetPhysicsInfoString - - PrecacheEvent - - PlaybackEvent - - SetFatPVS - - SetFatPAS - - CheckVisibility - - DeltaSetField - - DeltaUnsetField - - DeltaAddEncoder - - GetCurrentPlayer - - CanSkipPlayer - - DeltaFindField - - DeltaSetFieldByIndex - - DeltaUnsetFieldByIndex - - SetGroupMask - - CreateInstancedBaseline - - Cvar_DirectSet - - ForceUnmodified - - GetPlayerStats - - AddServerCommand - - Voice_GetClientListening - - Voice_SetClientListening - - GetPlayerAuthId - - SequenceGet - - SequencePickSentence - - GetFileSize - - GetApproxWavePlayLen - - IsCareerMatch - - GetLocalizedStringLength - - RegisterTutorMessageShown - - GetTimesTutorMessageShown - - ProcessTutorMessageDecayBuffer - - ConstructTutorMessageDecayBuffer - - ResetTutorMessageDecayData - --------------------------------------------------------------------------- - -PrecacheModel - -from engine/eiface.h: -int PrecacheModel(char *s); -PRECACHE_MODEL() - -comments: - - . - --------------------------------------------------------------------------- - -PrecacheSound - -from engine/eiface.h: -int PrecacheSound(char *s); -PRECACHE_SOUND() - -comments: - - . - --------------------------------------------------------------------------- - -SetModel - -from engine/eiface.h: -void SetModel(edict_t *e, const char *m); -SET_MODEL() - -comments: - - . - --------------------------------------------------------------------------- - -ModelIndex - -from engine/eiface.h: -int ModelIndex(const char *m); -MODEL_INDEX() - -comments: - - . - --------------------------------------------------------------------------- - -ModelFrames - -from engine/eiface.h: -int ModelFrames(int modelIndex); -MODEL_FRAMES() - -comments: - - . - --------------------------------------------------------------------------- - -SetSize - -from engine/eiface.h: -void SetSize(edict_t *e, const float *rgflMin, const float *rgflMax); -SET_SIZE() - -comments: - - . - --------------------------------------------------------------------------- - -ChangeLevel - -from engine/eiface.h: -void ChangeLevel(char *s1, char *s2); -CHANGE_LEVEL() - -comments: - - . - --------------------------------------------------------------------------- - -GetSpawnParms - -from engine/eiface.h: -void GetSpawnParms(edict_t *ent); -GET_SPAWN_PARMS() - -comments: - - . - --------------------------------------------------------------------------- - -SaveSpawnParms - -from engine/eiface.h: -void SaveSpawnParms(edict_t *ent); -SAVE_SPAWN_PARMS() - -comments: - - . - --------------------------------------------------------------------------- - -VecToYaw - -from engine/eiface.h: -float VecToYaw(const float *rgflVector); -VEC_TO_YAW() - -comments: - - . - --------------------------------------------------------------------------- - -VecToAngles - -from engine/eiface.h: -void VecToAngles(const float *rgflVectorIn, float *rgflVectorOut); -VEC_TO_ANGLES() - -comments: - - . - --------------------------------------------------------------------------- - -MoveToOrigin - -from engine/eiface.h: -void MoveToOrigin(edict_t *ent, const float *pflGoal, float dist, int -iMoveType); -MOVE_TO_ORIGIN() - -comments: - - . - --------------------------------------------------------------------------- - -ChangeYaw - -from engine/eiface.h: -void ChangeYaw(edict_t *ent); -oldCHANGE_YAW() - -comments: - - . - --------------------------------------------------------------------------- - -ChangePitch - -from engine/eiface.h: -void ChangePitch(edict_t *ent); -CHANGE_PITCH() - -comments: - - . - --------------------------------------------------------------------------- - -FindEntityByString - -from engine/eiface.h: -edict_t *FindEntityByString(edict_t *pEdictStartSearchAfter, const char * -pszField, const char *pszValue); -FIND_ENTITY_BY_STRING() - -comments: - - . - --------------------------------------------------------------------------- - -GetEntityIllum - -from engine/eiface.h: -int GetEntityIllum(edict_t *pEnt); -GETENTITYILLUM() - -comments: - - . - --------------------------------------------------------------------------- - -FindEntityInSphere - -from engine/eiface.h: -edict_t *FindEntityInSphere(edict_t *pEdictStartSearchAfter, const float * -org, float rad); -FIND_ENTITY_IN_SPHERE() - -comments: - - . - --------------------------------------------------------------------------- - -FindClientInPVS - -from engine/eiface.h: -edict_t *FindClientInPVS(edict_t *pEdict); -FIND_ENTITY_IN_PVS() - -comments: - - . - --------------------------------------------------------------------------- - -EntitiesInPVS - -from engine/eiface.h: -edict_t *EntitiesInPVS(edict_t *pplayer); - -comments: - - . - --------------------------------------------------------------------------- - -MakeVectors - -from engine/eiface.h: -void MakeVectors(const float *rgflVector); -MAKE_VECTORS() - -comments: - - . - --------------------------------------------------------------------------- - -AngleVectors - -from engine/eiface.h: -void AngleVectors(const float *rgflVector, float *forward, float *right, -float *up); - -comments: - - . - --------------------------------------------------------------------------- - -CreateEntity - -from engine/eiface.h: -edict_t *CreateEntity(void); -CREATE_ENTITY() - -comments: - - . - --------------------------------------------------------------------------- - -RemoveEntity - -from engine/eiface.h: -void RemoveEntity(edict_t *e); -REMOVE_ENTITY() - -comments: - - . - --------------------------------------------------------------------------- - -CreateNamedEntity - -from engine/eiface.h: -edict_t *CreateNamedEntity(int className); -CREATE_NAMED_ENTITY() - -comments: - - . - --------------------------------------------------------------------------- - -MakeStatic - -from engine/eiface.h: -void MakeStatic(edict_t *ent); -MAKE_STATIC() - -comments: - - . - --------------------------------------------------------------------------- - -EntIsOnFloor - -from engine/eiface.h: -int EntIsOnFloor(edict_t *e); -ENT_IS_ON_FLOOR() - -comments: - - . - --------------------------------------------------------------------------- - -DropToFloor - -from engine/eiface.h: -int DropToFloor(edict_t *e); -DROP_TO_FLOOR() - -comments: - - . - --------------------------------------------------------------------------- - -WalkMove - -from engine/eiface.h: -int WalkMove(edict_t *ent, float yaw, float dist, int iMode); -WALK_MOVE() - -comments: - - . - --------------------------------------------------------------------------- - -SetOrigin - -from engine/eiface.h: -void SetOrigin(edict_t *e, const float *rgflOrigin); -SET_ORIGIN() - -comments: - - . - --------------------------------------------------------------------------- - -EmitSound - -from engine/eiface.h: -void EmitSound(edict_t *entity, int channel, const char *sample, /*int*/ -float volume, float attenuation, int fFlags, int pitch); -EMIT_SOUND_DYN2() - -comments: - - . - --------------------------------------------------------------------------- - -EmitAmbientSound - -from engine/eiface.h: -void EmitAmbientSound(edict_t *entity, float *pos, const char *samp, float -vol, float attenuation, int fFlags, int pitch); -EMIT_AMBIENT_SOUND() - -comments: - - . - --------------------------------------------------------------------------- - -TraceLine - -from engine/eiface.h: -void TraceLine(const float *v1, const float *v2, int fNoMonsters, edict_t -*pentToSkip, TraceResult *ptr); -TRACE_LINE() - -comments: - - . - --------------------------------------------------------------------------- - -TraceToss - -from engine/eiface.h: -void TraceToss(edict_t *pent, edict_t *pentToIgnore, TraceResult *ptr); -TRACE_TOSS() - -comments: - - . - --------------------------------------------------------------------------- - -TraceMonsterHull - -from engine/eiface.h: -int TraceMonsterHull(edict_t *pEdict, const float *v1, const float *v2, -int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr); -TRACE_MONSTER_HULL() - -comments: - - . - --------------------------------------------------------------------------- - -TraceHull - -from engine/eiface.h: -void TraceHull(const float *v1, const float *v2, int fNoMonsters, int -hullNumber, edict_t *pentToSkip, TraceResult *ptr); -TRACE_HULL() - -comments: - - . - --------------------------------------------------------------------------- - -TraceModel - -from engine/eiface.h: -void TraceModel(const float *v1, const float *v2, int hullNumber, edict_t -*pent, TraceResult *ptr); - -comments: - - . - --------------------------------------------------------------------------- - -TraceTexture - -from engine/eiface.h: -const char *TraceTexture(edict_t *pTextureEntity, const float *v1, const -float *v2); -TRACE_TEXTURE() - -comments: - - . - --------------------------------------------------------------------------- - -TraceSphere - -from engine/eiface.h: -void TraceSphere(const float *v1, const float *v2, int fNoMonsters, float -radius, edict_t *pentToSkip, TraceResult *ptr); - -comments: - - . - --------------------------------------------------------------------------- - -GetAimVector - -from engine/eiface.h: -void GetAimVector(edict_t *ent, float speed, float *rgflReturn); -GET_AIM_VECTOR() - -comments: - - . - --------------------------------------------------------------------------- - -ServerCommand - -from engine/eiface.h: -void ServerCommand(char *str); -SERVER_COMMAND() - -comments: - - Executes a server command, as if typed at the console (ie "exec - myconfig.cfg", or "quit"). Note that it appears no commands are - executed until after GameDLLInit is called. If ServerCommand is called - earlier than that, the command is delayed until then. - --------------------------------------------------------------------------- - -ServerExecute - -from engine/eiface.h: -void ServerExecute(void); -SERVER_EXECUTE() - -comments: - - . - --------------------------------------------------------------------------- - -ClientCommand - -from engine/eiface.h: -void ClientCommand(edict_t *pEdict, char *szFmt, ...); -CLIENT_COMMAND() - -comments: - - . - --------------------------------------------------------------------------- - -ParticleEffect - -from engine/eiface.h: -void ParticleEffect(const float *org, const float *dir, float color, float -count); -PARTICLE_EFFECT() - -comments: - - . - --------------------------------------------------------------------------- - -LightStyle - -from engine/eiface.h: -void LightStyle(int style, char *val); -LIGHT_STYLE() - -comments: - - . - --------------------------------------------------------------------------- - -DecalIndex - -from engine/eiface.h: -int DecalIndex(const char *name); -DECAL_INDEX() - -comments: - - . - --------------------------------------------------------------------------- - -PointContents - -from engine/eiface.h: -int PointContents(const float *rgflVector); -POINT_CONTENTS() - -comments: - - . - --------------------------------------------------------------------------- - -MessageBegin - -from engine/eiface.h: -void MessageBegin(int msg_dest, int msg_type, const float *pOrigin, -edict_t *ed); -MESSAGE_BEGIN() - -comments: - - Begin a network message to send to the client. - msg_type should be a number returned by RegUserMsg. - msg_dest is one of: - - MSG_BROADCAST - "unreliable to all" - - MSG_ONE - "reliable to one (msg_entity)" - - MSG_ALL - "reliable to all" - - MSG_INIT - "write to the init string" - - MSG_PVS - "Ents in PVS of org" (PVS=potentially visible set) - - MSG_PAS - "Ents in PAS of org" (PAS=potentially audible set) - - MSG_PVS_R - "Reliable to PVS" - - MSG_PAS_R - "Reliable to PAS" - - MSG_ONE_UNRELIABLE - "Send to one client, but don't put in - reliable stream, put in unreliable datagram (could be dropped)" - --------------------------------------------------------------------------- - -MessageEnd - -from engine/eiface.h: -void MessageEnd(void); -MESSAGE_END() - -comments: - - . - --------------------------------------------------------------------------- - -WriteByte - -from engine/eiface.h: -void WriteByte(int iValue); -WRITE_BYTE() - -comments: - - . - --------------------------------------------------------------------------- - -WriteChar - -from engine/eiface.h: -void WriteChar(int iValue); -WRITE_CHAR() - -comments: - - . - --------------------------------------------------------------------------- - -WriteShort - -from engine/eiface.h: -void WriteShort(int iValue); -WRITE_SHORT() - -comments: - - . - --------------------------------------------------------------------------- - -WriteLong - -from engine/eiface.h: -void WriteLong(int iValue); -WRITE_LONG() - -comments: - - . - --------------------------------------------------------------------------- - -WriteAngle - -from engine/eiface.h: -void WriteAngle(float flValue); -WRITE_ANGLE() - -comments: - - . - --------------------------------------------------------------------------- - -WriteCoord - -from engine/eiface.h: -void WriteCoord(float flValue); -WRITE_COORD() - -comments: - - . - --------------------------------------------------------------------------- - -WriteString - -from engine/eiface.h: -void WriteString(const char *sz); -WRITE_STRING() - -comments: - - . - --------------------------------------------------------------------------- - -WriteEntity - -from engine/eiface.h: -void WriteEntity(int iValue); -WRITE_ENTITY() - -comments: - - . - --------------------------------------------------------------------------- - -CVarRegister - -from engine/eiface.h: -void CVarRegister(cvar_t *pCvar); -CVAR_REGISTER() - -comments: - - Register a new cvar (server variable). - --------------------------------------------------------------------------- - -CVarGetFloat - -from engine/eiface.h: -float CVarGetFloat(const char *szVarName); -CVAR_GET_FLOAT() - -comments: - - Return the float value of a cvar. - --------------------------------------------------------------------------- - -CVarGetString - -from engine/eiface.h: -const char *CVarGetString(const char *szVarName); -CVAR_GET_STRING() - -comments: - - Return the string value of a cvar. - --------------------------------------------------------------------------- - -CVarSetFloat - -from engine/eiface.h: -void CVarSetFloat(const char *szVarName, float flValue); -CVAR_SET_FLOAT() - -comments: - - Set the float value of a cvar. - --------------------------------------------------------------------------- - -CVarSetString - -from engine/eiface.h: -void CVarSetString(const char *szVarName, const char *szValue); -CVAR_SET_STRING() - -comments: - - Set the string value of a cvar. - --------------------------------------------------------------------------- - -AlertMessage - -from engine/eiface.h: -void AlertMessage(ALERT_TYPE atype, char *szFmt, ...); -ALERT() - -comments: - - Print an alert message. - atype is one of: - - at_notice - - at_console - "same as at_notice, but forces a ConPrintf, not a - message box". Prints output to server console, but only shown if - 'developer' is set. - - at_aiconsole - "same as at_console, but only shown if developer - level is 2!" - - at_warning - - at_error - - at_logged - "Server print to console (only in multiplayer games)." - Prints output to server logs and console. - --------------------------------------------------------------------------- - -EngineFprintf - -from engine/eiface.h: -void EngineFprintf(FILE *pfile, char *szFmt, ...); -ENGINE_FPRINTF() - -comments: - - . - --------------------------------------------------------------------------- - -PvAllocEntPrivateData - -from engine/eiface.h: -void *PvAllocEntPrivateData(edict_t *pEdict, long cb); -ALLOC_PRIVATE() - -comments: - - . - --------------------------------------------------------------------------- - -PvEntPrivateData - -from engine/eiface.h: -void *PvEntPrivateData(edict_t *pEdict); -GET_PRIVATE() - -comments: - - Returns a pointer to the base class type of the given edict. For - instance: - CBaseEntity *pPlayer=(CBaseEntity *)GET_PRIVATE(pEntity); - - --------------------------------------------------------------------------- - -FreeEntPrivateData - -from engine/eiface.h: -void FreeEntPrivateData(edict_t *pEdict); -FREE_PRIVATE() - -comments: - - . - --------------------------------------------------------------------------- - -SzFromIndex - -from engine/eiface.h: -const char *SzFromIndex(int iString); - -comments: - - . - --------------------------------------------------------------------------- - -AllocString - -from engine/eiface.h: -int AllocString(const char *szValue); -ALLOC_STRING() - -comments: - - . - --------------------------------------------------------------------------- - -GetVarsOfEnt - -from engine/eiface.h: -struct entvars_s *GetVarsOfEnt(edict_t *pEdict); - -comments: - - . - --------------------------------------------------------------------------- - -PEntityOfEntOffset - -from engine/eiface.h: -edict_t *PEntityOfEntOffset(int iEntOffset); -ENT() - -comments: - - . - --------------------------------------------------------------------------- - -EntOffsetOfPEntity - -from engine/eiface.h: -int EntOffsetOfPEntity(const edict_t *pEdict); - -comments: - - . - --------------------------------------------------------------------------- - -IndexOfEdict - -from engine/eiface.h: -int IndexOfEdict(const edict_t *pEdict); -ENTINDEX() - -comments: - - Returns the server slot (ie 1 to maxplayers) of the given player - edict. - --------------------------------------------------------------------------- - -PEntityOfEntIndex - -from engine/eiface.h: -edict_t *PEntityOfEntIndex(int iEntIndex); -INDEXENT() - -comments: - - Returns the edict for the player in the given server slot (ie 1 to - maxplayers). - --------------------------------------------------------------------------- - -FindEntityByVars - -from engine/eiface.h: -edict_t *FindEntityByVars(struct entvars_s *pvars); - -comments: - - . - --------------------------------------------------------------------------- - -GetModelPtr - -from engine/eiface.h: -void *GetModelPtr(edict_t *pEdict); -GET_MODEL_PTR() - -comments: - - . - --------------------------------------------------------------------------- - -RegUserMsg - -from engine/eiface.h: -int RegUserMsg(const char *pszName, int iSize); -REG_USER_MSG() - -comments: - - Register a network message type with the given name, and size if - known. Returns the number assigned for the network message, to be used - with MessageBegin. It appears that message ID's 1-63 are reserved for - the Engine, and that GameDLL messages are allocated IDs starting at - 64. The SDK dlls/util.h appears to define six Engine messages: - - SVC_TEMPENTITY = 23 - - SVC_INTERMISSION = 30 - - SVC_CDTRACK = 32 - - SVC_WEAPONANIM = 35 - - SVC_ROOMTYPE = 37 - - SVC_HLTV = 50 - --------------------------------------------------------------------------- - -AnimationAutomove - -from engine/eiface.h: -void AnimationAutomove(const edict_t *pEdict, float flTime); - -comments: - - . - --------------------------------------------------------------------------- - -GetBonePosition - -from engine/eiface.h: -void GetBonePosition(const edict_t *pEdict, int iBone, float *rgflOrigin, -float *rgflAngles); -GET_BONE_POSITION() - -comments: - - . - --------------------------------------------------------------------------- - -FunctionFromName - -from engine/eiface.h: -unsigned long FunctionFromName(const char *pName); -FUNCTION_FROM_NAME() - -comments: - - Apparently, this finds the given exported function name string in the - GameDLL, and returns a pointer to said function (much like unix dlsym - or win32 GetProcAddress?). This appears to be used in GameDLL code for - loading savegames, as the savegames contain names of exported - functions in the GameDLL. Basically, this is the opposite of - NameForFunction. - --------------------------------------------------------------------------- - -NameForFunction - -from engine/eiface.h: -const char *NameForFunction(unsigned long function); -NAME_FOR_FUNCTION() - -comments: - - Basically, the opposite of FunctionFromName. Finds the given function - pointer address in the GameDLL, and returns the string name for the - corresponding function. This appears to be used in GameDLL code for - saving games, taking known function pointers and converting them to - function name strings to be stored in the savegames, so that they can - be converted back to function pointers upon game load. - --------------------------------------------------------------------------- - -ClientPrintf - -from engine/eiface.h: -void ClientPrintf(edict_t *pEdict, PRINT_TYPE ptype, const char *szMsg); -CLIENT_PRINTF() - - JOHN: engine callbacks so game DLL can print messages to individual - clients - -comments: - - . - --------------------------------------------------------------------------- - -ServerPrint - -from engine/eiface.h: -void ServerPrint(const char *szMsg); - -comments: - - Prints output to the server console. - --------------------------------------------------------------------------- - -Cmd_Args - -from engine/eiface.h: -const char *Cmd_Args(void); -CMD_ARGS() - - these 3 added so game DLL can easily access client 'cmd' strings - -comments: - - Returns the arguments for a command, as a single string. The command - string itself is not included, and must be queried with CMD_ARGV(0). - For use in DLLAPI ClientCommand, or in the function provided to - AddServerCommand. - --------------------------------------------------------------------------- - -Cmd_Argv - -from engine/eiface.h: -const char *Cmd_Argv(int argc); -CMD_ARGV() - -comments: - - Returns the nth argument to the command. CMD_ARGV(0) returns the - command name itself. - --------------------------------------------------------------------------- - -Cmd_Argc - -from engine/eiface.h: -int Cmd_Argc(void); -CMD_ARGC() - -comments: - - Returns the number of arguments given to the command. - --------------------------------------------------------------------------- - -GetAttachment - -from engine/eiface.h: -void GetAttachment(const edict_t *pEdict, int iAttachment, float * -rgflOrigin, float *rgflAngles); -GET_ATTACHMENT() - -comments: - - . - --------------------------------------------------------------------------- - -CRC32_Init - -from engine/eiface.h: -void CRC32_Init(CRC32_t *pulCRC); -CRC32_INIT() - -comments: - - . - --------------------------------------------------------------------------- - -CRC32_ProcessBuffer - -from engine/eiface.h: -void CRC32_ProcessBuffer(CRC32_t *pulCRC, void *p, int len); -CRC32_PROCESS_BUFFER() - -comments: - - . - --------------------------------------------------------------------------- - -CRC32_ProcessByte - -from engine/eiface.h: -void CRC32_ProcessByte(CRC32_t *pulCRC, unsigned char ch); -CRC32_PROCESS_BYTE() - -comments: - - . - --------------------------------------------------------------------------- - -CRC32_Final - -from engine/eiface.h: -CRC32_t CRC32_Final(CRC32_t pulCRC); -CRC32_FINAL() - -comments: - - . - --------------------------------------------------------------------------- - -RandomLong - -from engine/eiface.h: -long RandomLong(long lLow, long lHigh); -RANDOM_LONG() - -comments: - - . - --------------------------------------------------------------------------- - -RandomFloat - -from engine/eiface.h: -float RandomFloat(float flLow, float flHigh); -RANDOM_FLOAT() - -comments: - - . - --------------------------------------------------------------------------- - -SetView - -from engine/eiface.h: -void SetView(const edict_t *pClient, const edict_t *pViewent); -SET_VIEW() - -comments: - - . - --------------------------------------------------------------------------- - -Time - -from engine/eiface.h: -float Time(void); - -comments: - - . - --------------------------------------------------------------------------- - -CrosshairAngle - -from engine/eiface.h: -void CrosshairAngle(const edict_t *pClient, float pitch, float yaw); -SET_CROSSHAIRANGLE() - -comments: - - . - --------------------------------------------------------------------------- - -LoadFileForMe - -from engine/eiface.h: -byte * LoadFileForMe(char *filename, int *pLength); -LOAD_FILE_FOR_ME() - -comments: - - Opens the given filename (relative to the gamedir, or relative to the - hlds directory, in that order), and returns a pointer to a byte array - (character string) with the contents of the file. NULL-termination of - the array indicates end of file. Length of the file in bytes is - returned in the given int pointer. - --------------------------------------------------------------------------- - -FreeFile - -from engine/eiface.h: -void FreeFile(void *buffer); -FREE_FILE() - -comments: - - Free the byte array of the given buffer which was returned by - LoadFileForMe. - --------------------------------------------------------------------------- - -EndSection - -from engine/eiface.h: -void EndSection(const char *pszSectionName); - - trigger_endsection - -comments: - - . - --------------------------------------------------------------------------- - -CompareFileTime - -from engine/eiface.h: -int CompareFileTime(char *filename1, char *filename2, int *iCompare); -COMPARE_FILE_TIME() - -comments: - - . - --------------------------------------------------------------------------- - -GetGameDir - -from engine/eiface.h: -void GetGameDir(char *szGetGameDir); -GET_GAME_DIR() - -comments: - - Copies the pathname of the game directory into the given buffer. Note - that there's no way to inform the engine how big the buffer is, so be - forewarned. - - Prior to HL 1.1.1.1 (CS 1.6), this gave the full pathname of the game - directory, ie "/usr/local/half-life/cstrike" or "C:\Games\Half-Life\ - cstrike". Now, it is only the string passed to hlds as the argument to - "-game", ie "cstrike". - --------------------------------------------------------------------------- - -Cvar_RegisterVariable - -from engine/eiface.h: -void Cvar_RegisterVariable(cvar_t *variable); -CVAR_CREATE() - -comments: - - . - --------------------------------------------------------------------------- - -FadeClientVolume - -from engine/eiface.h: -void FadeClientVolume(const edict_t *pEdict, int fadePercent, int -fadeOutSeconds, int holdTime, int fadeInSeconds); - -comments: - - . - --------------------------------------------------------------------------- - -SetClientMaxspeed - -from engine/eiface.h: -void SetClientMaxspeed(const edict_t *pEdict, float fNewMaxspeed); - -comments: - - . - --------------------------------------------------------------------------- - -CreateFakeClient - -from engine/eiface.h: -edict_t * CreateFakeClient(const char *netname); - - returns NULL if fake client can't be created - -comments: - - Creates "bots" (?). - --------------------------------------------------------------------------- - -RunPlayerMove - -from engine/eiface.h: -void RunPlayerMove(edict_t *fakeclient, const float *viewangles, float -forwardmove, float sidemove, float upmove, unsigned short buttons, byte -impulse, byte msec); - -comments: - - . - --------------------------------------------------------------------------- - -NumberOfEntities - -from engine/eiface.h: -int NumberOfEntities(void); -NUMBER_OF_ENTITIES() - -comments: - - . - --------------------------------------------------------------------------- - -GetInfoKeyBuffer - -from engine/eiface.h: -char *GetInfoKeyBuffer(edict_t *e); - - passing in NULL gets the serverinfo - -comments: - - Returns the InfoKeyBuffer for the given edict. This is basically the - fields from "setinfo" at the client console, and includes things like - the player name. - - The sourcecode comment ("passing in NULL gets the serverinfo") isn't - entirely accurate. There appear to be two server-side info buffers - available, "serverinfo" and "localinfo", both accessible from the - console by those two commands, respectively. - - Calling GetInfoKeyBuffer(NULL) will return the localinfo buffer. - Calling GetInfoKeyBuffer(PEntityOfEntIndex(0)), ie passing the entity - of slot 0, will return the serverinfo buffer. - --------------------------------------------------------------------------- - -InfoKeyValue - -from engine/eiface.h: -char *InfoKeyValue(char *infobuffer, char *key); - -comments: - - Returns the value for the given key in the given InfoKeyBuffer. - --------------------------------------------------------------------------- - -SetKeyValue - -from engine/eiface.h: -void SetKeyValue(char *infobuffer, char *key, char *value); - -comments: - - Adds or sets a key/value pair in the given InfoKeyBuffer. Appears to - work for only server info, and not client info. For clients, use - SetClientKeyValue. - --------------------------------------------------------------------------- - -SetClientKeyValue - -from engine/eiface.h: -void SetClientKeyValue(int clientIndex, char *infobuffer, char *key, char -*value); - -comments: - - Adds or sets a key/value pair in a client's InfoKeyBuffer, by server - slot (ie 1 to maxplayers). - --------------------------------------------------------------------------- - -IsMapValid - -from engine/eiface.h: -int IsMapValid(char *filename); -IS_MAP_VALID() - -comments: - - . - --------------------------------------------------------------------------- - -StaticDecal - -from engine/eiface.h: -void StaticDecal(const float *origin, int decalIndex, int entityIndex, int -modelIndex); - -comments: - - . - --------------------------------------------------------------------------- - -PrecacheGeneric - -from engine/eiface.h: -int PrecacheGeneric(char *s); -PRECACHE_GENERIC() - -comments: - - . - --------------------------------------------------------------------------- - -GetPlayerUserId - -from engine/eiface.h: -int GetPlayerUserId(edict_t *e); -GETPLAYERUSERID() - - returns the server assigned userid for this player. useful for logging - frags, etc. returns -1 if the edict couldn't be found in the list of - clients - -comments: - - Returns the session userid for the given player edict. As of server - x106, this is constant for the life of the player connection, and - unique for the life of the server process. Each time a client - connects, they are given a userid of 1 plus the userid of the previous - connecting client. When the server starts/restarts, the server starts - again at userid 1. - --------------------------------------------------------------------------- - -BuildSoundMsg - -from engine/eiface.h: -void BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int -*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, -int msg_type, const float *pOrigin, edict_t *ed); -BUILD_SOUND_MSG() - -comments: - - . - --------------------------------------------------------------------------- - -IsDedicatedServer - -from engine/eiface.h: -int IsDedicatedServer(void); -IS_DEDICATED_SERVER() - - is this a dedicated server? - -comments: - - . - --------------------------------------------------------------------------- - -CVarGetPointer - -from engine/eiface.h: -cvar_t *CVarGetPointer(const char *szVarName); -CVAR_GET_POINTER() - -comments: - - Returns a pointer to a cvar_t struct for the given cvar (server - variable) name. - --------------------------------------------------------------------------- - -GetPlayerWONId - -from engine/eiface.h: -unsigned int GetPlayerWONId(edict_t *e); -GETPLAYERWONID() - - returns the server assigned WONid for this player. useful for logging - frags, etc. returns -1 if the edict couldn't be found in the list of - clients - -comments: - - Returns the WON id for the given player edict. As of server x106, this - should be unique per client CD KEY, and should be consistent across - all WON auth servers. - --------------------------------------------------------------------------- - -Info_RemoveKey - -from engine/eiface.h: -void Info_RemoveKey(char *s, const char *key); - - YWB 8/1/99 TFF Physics additions - -comments: - - . - --------------------------------------------------------------------------- - -GetPhysicsKeyValue - -from engine/eiface.h: -const char *GetPhysicsKeyValue(const edict_t *pClient, const char *key); - -comments: - - . - --------------------------------------------------------------------------- - -SetPhysicsKeyValue - -from engine/eiface.h: -void SetPhysicsKeyValue(const edict_t *pClient, const char *key, const -char *value); - -comments: - - . - --------------------------------------------------------------------------- - -GetPhysicsInfoString - -from engine/eiface.h: -const char *GetPhysicsInfoString(const edict_t *pClient); -ENGINE_GETPHYSINFO() - -comments: - - . - --------------------------------------------------------------------------- - -PrecacheEvent - -from engine/eiface.h: -unsigned short PrecacheEvent(int type, const char *psz); -PRECACHE_EVENT() - -comments: - - . - --------------------------------------------------------------------------- - -PlaybackEvent - -from engine/eiface.h: -void PlaybackEvent(int flags, const edict_t *pInvoker, unsigned short -eventindex, float delay, float *origin, float *angles, float fparam1, -float fparam2, int iparam1, int iparam2, int bparam1, int bparam2); -PLAYBACK_EVENT_FULL() - -comments: - - . - --------------------------------------------------------------------------- - -SetFatPVS - -from engine/eiface.h: -unsigned char *SetFatPVS(float *org); -ENGINE_SET_PVS() - -comments: - - . - --------------------------------------------------------------------------- - -SetFatPAS - -from engine/eiface.h: -unsigned char *SetFatPAS(float *org); -ENGINE_SET_PAS() - -comments: - - . - --------------------------------------------------------------------------- - -CheckVisibility - -from engine/eiface.h: -int CheckVisibility(const edict_t *entity, unsigned char *pset); -ENGINE_CHECK_VISIBILITY() - -comments: - - . - --------------------------------------------------------------------------- - -DeltaSetField - -from engine/eiface.h: -void DeltaSetField(struct delta_s *pFields, const char *fieldname); -DELTA_SET() - -comments: - - . - --------------------------------------------------------------------------- - -DeltaUnsetField - -from engine/eiface.h: -void DeltaUnsetField(struct delta_s *pFields, const char *fieldname); -DELTA_UNSET() - -comments: - - . - --------------------------------------------------------------------------- - -DeltaAddEncoder - -from engine/eiface.h: -void DeltaAddEncoder(char *name, void (*conditionalencode)( struct delta_s -*pFields, const unsigned char *from, const unsigned char *to) ); -DELTA_ADDENCODER() - -comments: - - . - --------------------------------------------------------------------------- - -GetCurrentPlayer - -from engine/eiface.h: -int GetCurrentPlayer(void); -ENGINE_CURRENT_PLAYER() - -comments: - - . - --------------------------------------------------------------------------- - -CanSkipPlayer - -from engine/eiface.h: -int CanSkipPlayer(const edict_t *player); -ENGINE_CANSKIP() - -comments: - - . - --------------------------------------------------------------------------- - -DeltaFindField - -from engine/eiface.h: -int DeltaFindField(struct delta_s *pFields, const char *fieldname); -DELTA_FINDFIELD() - -comments: - - . - --------------------------------------------------------------------------- - -DeltaSetFieldByIndex - -from engine/eiface.h: -void DeltaSetFieldByIndex(struct delta_s *pFields, int fieldNumber); -DELTA_SETBYINDEX() - -comments: - - . - --------------------------------------------------------------------------- - -DeltaUnsetFieldByIndex - -from engine/eiface.h: -void DeltaUnsetFieldByIndex(struct delta_s *pFields, int fieldNumber); -DELTA_UNSETBYINDEX() - -comments: - - . - --------------------------------------------------------------------------- - -SetGroupMask - -from engine/eiface.h: -void SetGroupMask(int mask, int op); -ENGINE_SETGROUPMASK() - -comments: - - . - --------------------------------------------------------------------------- - -CreateInstancedBaseline - -from engine/eiface.h: -int CreateInstancedBaseline(int classname, struct entity_state_s * -baseline); -ENGINE_INSTANCE_BASELINE() - -comments: - - . - --------------------------------------------------------------------------- - -Cvar_DirectSet - -from engine/eiface.h: -void Cvar_DirectSet(struct cvar_s *var, char *value); - -comments: - - . - --------------------------------------------------------------------------- - -ForceUnmodified - -from engine/eiface.h: -void ForceUnmodified(FORCE_TYPE type, float *mins, float *maxs, const char -*filename); -ENGINE_FORCE_UNMODIFIED() - - Forces the client and server to be running with the same version of - the specified file ( e.g., a player model ). Calling this has no - effect in single player. - -comments: - - . - --------------------------------------------------------------------------- - -GetPlayerStats - -from engine/eiface.h: -void GetPlayerStats(const edict_t *pClient, int *ping, int *packet_loss); -PLAYER_CNX_STATS() - -comments: - - . - --------------------------------------------------------------------------- - -AddServerCommand - -from engine/eiface.h: -void AddServerCommand(char *cmd_name, void (*function) (void)); - -comments: - - Registers a new server console command. When the given command string - is typed at the console, the given function will be called. Arguments - for the command can be retrieved in the function with Cmd_Args, - Cmd_Argv, and Cmd_Argc. - --------------------------------------------------------------------------- - -Voice_GetClientListening - -from engine/eiface.h: -qboolean Voice_GetClientListening)(int iReceiver, int iSender); - - For voice communications, set which clients hear each other. NOTE: - these functions take player entity indices (starting at 1). - -comments: - - Added in SDK 2.2. - --------------------------------------------------------------------------- - -Voice_SetClientListening - -from engine/eiface.h: -qboolean Voice_SetClientListening)(int iReceiver, int iSender, qboolean -bListen); - - For voice communications, set which clients hear each other. NOTE: - these functions take player entity indices (starting at 1). - -comments: - - Added in SDK 2.2. - --------------------------------------------------------------------------- - -GetPlayerAuthId - -from engine/eiface.h: -const char *GetPlayerAuthId(edict_t *e); - -From Eric Smith on hlcoders -(list.valvesoftware.com/pipermail/hlcoders/2002-April/002865.html): - - The AuthID is a way for applications/mods to get the Authentication ID - (uniqueID) for a player. The AuthID can be a WonID or a SteamID. The - function I've written returns the AuthID as a string. Calling - GetPlayerWONId will still work for Non-Steam players just like it - always has. If applications/mods want to get a jump start on getting - ready to support Steam players, then they can start using - GetPlayerAuthId, which will still work for Non-Steam players, but it - will give the WonID as a string instead of an unsigned int. - -From Eric Smith on servertest: -(list.valvesoftware.com/pipermail/servertest/2002-April/000567.html) - - Only clients playing via Steam will have SteamIDs. Clients who are not - using Steam will still have WonIDs (just like they always have). The - server now supports WonIDs\SteamIDs and banning using either of them. - WonIDs have not changed. SteamIDs use the format: STEAM_<#>:<#> where - <#> is replaced by numbers. An example SteamID would be "STEAM_0: - 94534". - -From Eric Smith on hlcoders: -(list.valvesoftware.com/pipermail/hlcoders/2002-April/002925.html) - - This function will now return the string "BOT" as the AuthID for fake - clients. - -comments: - - Added for HL 1109; no SDK update. - --------------------------------------------------------------------------- - -SequenceGet - -from engine/eiface.h: -void *SequenceGet(const char *fileName, const char *entryName); - -comments: - - Added for HL 1xxx; no SDK update. - --------------------------------------------------------------------------- - -SequencePickSentence - -from engine/eiface.h: -void *SequencePickSentence(const char *groupName, int pickMethod, int * -picked); - -comments: - - Added for HL 1xxx; no SDK update. - --------------------------------------------------------------------------- - -GetFileSize - -from engine/eiface.h: -int GetFileSize(char *filename); - -comments: - - Added for HL 1xxx; no SDK update. - --------------------------------------------------------------------------- - -GetApproxWavePlayLen - -from engine/eiface.h: -unsigned int GetApproxWavePlayLen(const char *filepath); - -comments: - - Added for HL 1xxx; no SDK update. - --------------------------------------------------------------------------- - -IsCareerMatch - -from engine/eiface.h: -int IsCareerMatch(void); - -comments: - - Added for HL 1xxx; no SDK update. - --------------------------------------------------------------------------- - -GetLocalizedStringLength - -from engine/eiface.h: -int GetLocalizedStringLength(const char *label); - -comments: - - Added for HL 1xxx; no SDK update. - --------------------------------------------------------------------------- - -RegisterTutorMessageShown - -from engine/eiface.h: -void RegisterTutorMessageShown(int mid); - -comments: - - Added for HL 1xxx; no SDK update. - --------------------------------------------------------------------------- - -GetTimesTutorMessageShown - -from engine/eiface.h: -int GetTimesTutorMessageShown(int mid); - -comments: - - Added for HL 1xxx; no SDK update. - --------------------------------------------------------------------------- - -ProcessTutorMessageDecayBuffer - -from engine/eiface.h: -void ProcessTutorMessageDecayBuffer(int *buffer, int bufferLength); - -comments: - - Added for HL 1xxx; no SDK update. - --------------------------------------------------------------------------- - -ConstructTutorMessageDecayBuffer - -from engine/eiface.h: -void ConstructTutorMessageDecayBuffer(int *buffer, int bufferLength); - -comments: - - Added for HL 1xxx; no SDK update. - --------------------------------------------------------------------------- - -ResetTutorMessageDecayData - -from engine/eiface.h: -void ResetTutorMessageDecayData(void); - -comments: - - Added for HL 1xxx; no SDK update. - --------------------------------------------------------------------------- diff --git a/doc/txt/faq.txt b/doc/txt/faq.txt deleted file mode 100644 index 89dceaf..0000000 --- a/doc/txt/faq.txt +++ /dev/null @@ -1,120 +0,0 @@ -Metamod FAQ -=-=-=-=-=-= - -Please add support for (some) mod. - - Please see game support requirements in the documentation. - -How do I use bots with Metamod? - - If the bot is not a Metamod plugin, then you will need to tell Metamod - to use your bot as the gamedll, by specifying it on the hlds command - line with the "+localinfo mm_gamedll" option. See the Metamod docs. - See also the AdminMod docs (www.adminmod.org/help/online/Configuration - /How_to_Use_Bots_with_MetaMod_AM_2.50_and_up.htm). - -The download links give corrupt files. - - I think what you're observing is that your web client is quietly - uncompressing the file, but not updating the name of the downloaded - file to reflect this. In particular, some web clients will silently - decompress (gunzip) files _without_ removing the ".gz" from the - filename, so you'll end up with a file "metamod_i386.so.gz" which is - _really_ "metamod_i386.so", and so trying to gunzip it will produce an - error ("not in gzip format"). Try running "file" on the resulting file - to see what the OS thinks it is. Or, where you don't have "file" (ie - windows), just look at the file size - it should be pretty indicative - of whether the file is still compressed or not. - -How do I install Metamod? - - This is covered briefly in the Metamod docs. Typically, though, - Metamod is installed as part of some major plugin, like AdminMod - (www.adminmod.org/). There is also some discussion of installing - Metamod by hand in the AdminMod docs (www.adminmod.org/help/online/ - Installing/Manual_Installation_-_Walk-Through.htm). If you already - have Metamod installed and merely want to update it, this requires - only replacing the .so/.dll with the latest version from the webpage - (metamod.org/). - -I'm having trouble with AdminMod. - - You'll need to ask your AdminMod questions on the AdminMod forums - (www.ozforums.com/forumdisplay.php?forumid=143). - -How do I do (something) in a Metamod plugin? - - Generally speaking, a Metamod plugin works very much like an Half-Life - Game Mod, since all it's doing is making the same calls to the same - SDK that the Game Mod does. So, the question typically isn't "how do I - do this in Metamod?" but instead "how do I do this in an Half-Life - Mod?", and is best asked in a HL SDK Programming forum/mailinglist - (see related links and especially Botman's MOD FAQ (planethalflife.com - /botman/MOD_FAQ.shtml)). Once you figure out how it would normally be - done in a Game Mod, figuring out how to do it in Metamod is relatively - straightforward. - - However, if you have questions on how to convert a piece of code from - HLmod to Metamod plugin, then I can provide some pointers, or you can - ask on the Metamod mailing list (groups.yahoo.com/group/metamod/). And - of course, if you have questions about things in the code specific to - Metamod (ie things mentioned in the Metamod Coding docs) feel free to - ask me or on the mailing list. - -Is there a tutorial or example of how to write a Metamod plugin? - - The sourcecode includes a couple of plugins that can be used as - examples. The "stub" plugin is the bare basics of what a plugin needs. - The "trace" plugin provides an example of hooking _every_ SDK - function. The "wdmisc" plugin provides a couple of basic useful - features. You can also look at several of the other plugins out there - for more examples. - - Note that the example plugins in the Metamod sourcecode show how to - use Metamod to interface with Half-Life code, but they mostly assume - you already know how to write Half-Life code. If you need examples or - info on how to write Half-Life code itself, you'll need to go look - through the HL SDK programming websites (see related links and - Botman's MOD FAQ (planethalflife.com/botman/MOD_FAQ.shtml)). - -I have (or know of) a Metamod plugin not listed on the webpage. - - Send me the information about the plugin (name, author, description, - URL), and I'd be happy to provide a link from the webpage. - -I'm having trouble compiling under MSVC. - - Please note that I do not use MSVC, so I can't help a lot with using - that compiler. I do all my development under linux, using gcc for - linux binaries and mingw32 (www.mingw.org/) for windows binaries. The - sourcecode does include an MSVC project file for Metamod, as well as a - project file for the stub plugin, both mostly as examples. They should - work, and indeed did work the last time I dug up MSVC to test them. - That said, there are a few folks on the Metamod mailing list - (groups.yahoo.com/group/metamod/) that do use MSVC, so you might find - some assistance there. - -If I create a Metamod plugin, does it have to be open source? - - Generally speaking, yes. The way the GPL is interpreted, plugins of a - GPL program need to be also GPL. See also the FAQ entry on the GNU - site about plugins of a GPL program (www.gnu.org/licenses/gpl-faq.html - #GPLAndPlugins). - -How about a port of Metamod to other engines like Q3, Unreal, etc? - - I haven't looked into it myself, but several folks on the AdminMod - team (from which Metamod was derived) had looked at porting to other - games like Q3 and UT, and determined that those engines either didn't - provide the necessary API hooks, or that they already provided a - suitable method for extending functionality. So, I wouldn't expect to - see a version of Metamod for those. Perhaps for some other future - engines, although I believe most modern engines are now providing - their own method for extensions or plugins, so that a third-party - solution like Metamod wouldn't be necessary. - - If Half-Life 2 ever sees the light of day, I expect I'd look seriously - at porting to that - unless, of course, Valve ends up providing their - own plugin framework themselves. :) - --------------------------------------------------------------------------- diff --git a/doc/txt/gamesupport.txt b/doc/txt/gamesupport.txt deleted file mode 100644 index dfeef2b..0000000 --- a/doc/txt/gamesupport.txt +++ /dev/null @@ -1,6 +0,0 @@ -Adding Game/Mod Support -=-=-=-=-=-=-=-=-=-=-=-= - -Metamod-P already supports your Mod. - --------------------------------------------------------------------------- diff --git a/doc/txt/links.txt b/doc/txt/links.txt deleted file mode 100644 index 3db6c8e..0000000 --- a/doc/txt/links.txt +++ /dev/null @@ -1,129 +0,0 @@ -Related links -============= - -Here's a list of links, other sites, and information I found useful when -working on Metamod: - - - AdminMod's DLL Forum (www.ozforums.com/forumdisplay.php?forumid=114) - - AdminMod CVS at Sourceforge (cvs.sourceforge.net/cgi-bin/viewcvs.cgi/ - halflifeadmin/) - - - Valve Editing Resource Center (collective.valve-erc.com/), Valve's - official site - - Botman's Bots (planethalflife.com/botman/) - - Half-Life Programming Planet (hlpp.valveworld.com/) - - Shadowman's Half-Life SDK2 Site (planethalflife.com/hlsdk2) - - Half-Life Coding Pages (www.planethalflife.com/botman/balfourroad/ - index.shtml) - - Fixxxer's HL Coding page (planethalflife.com/fixxxer/) - - The Handy Vandal's HL Coding Links (www.karljones.com/halflife/ - coding.asp) - - - Half-Life SDK Forums (www.chatbear.com/cgi-bin/board.pl?boardid=942), - at the VERC - - Half-Life SDK Forums (www.chatbear.com/cgi-bin/board.pl?action= - boardlisting&boardid=590), at Valve's former SDK site - - HL Coders mailing list (www.topica.com/lists/hlcoders), at topica.com - - Botman's forums (dynamic.gamespy.com/~botman/yabb/YaBB.pl) - - Wavelength Half-Life Coding Forum (www.thewavelength.net/forums/ - index.php?act=SF&f=13) - - SDK2 Forum (pub21.ezboard.com/fshadowmanshalflifeforumsdk2), at - ezboard.com - - HL Programming Forum (dynamic.gamespy.com/~hlprogramming/ultimatebb/ - forumdisplay.cgi?action=topics&forum=Coding&number=1), at gamespy.com - - Fixxxer's HL Coding forum (network54.com/Hide/Forum/goto?forumid= - 21807) - - HL Programming Forum (forums.gamedesign.net/forums/wwwthreads.pl? - action=list&Board=halflife_coding), at gamedesign.net - - - C FAQ (www.eskimo.com/~scs/C-faq/top.html) - - C++ FAQ Lite (www.parashift.com/cpp-faq-lite/) - - C++ FAQ Index (www.calpoly.edu/~jfischer/c++faq/index.html) - - alt.comp.lang.learn.c-c++ FAQ (snurse-l.org/acllc-c++/faq) - - C++ Annotations (dragon.klte.hu/~kollarl/C++/cplusplu.html), guide for - C programmers to using C++ - - C++ Portability Guide (www.mozilla.org/hacking/portable-cpp.html) - - Standard Template Library Programmer's Guide (www.sgi.com/tech/stl/), - at SGI - - comp.std.c++ FAQ (reality.sgi.com/austern_mti/std-c++/faq.html) - - GNU g++ FAQ (www.landfield.com/faqs/g++-FAQ/plain/) - - GNU libstdc++ FAQ (gcc.gnu.org/onlinedocs/libstdc++/faq/) - - C++ References (www.apl.jhu.edu/~paulmac/c++-references.html), books - and other links - - Thinking in C++ (www.mindview.net/Books/TICPP/ThinkingInCPP2e.html), - free electronic book - - - comp.programming.threads FAQ (www.serpentine.com/~bos/threads-faq/) - - comp.programming.threads FAQ #2 (www.lambdacs.com/cpt/FAQ.html) - - Implementing POSIX Condition Variables in Win32 (www.cs.wustl.edu/ - ~schmidt/win32-cv-1.html) - - - Microsoft Developer Network (msdn.microsoft.com/), online win32 API - docs - - Win32 Programming FAQ (www.iseran.com/Win32/FAQ/) - - Minimal Gnu for Windows (mingw) (www.mingw.org/), gcc for win32 - - Creating DLLs w/mingw (www.geocities.com/Tokyo/Towers/6162/win32/dll/ - make.html) - - Mingw binaries (www.devolution.com/~slouken/SDL/Xmingw32/) - - Mingw binaries (newer) (members.telering.at/jessich/mingw/index.html) - -Books - -And here are books I picked up that I found useful as well: - - - C: A Reference Manual (vig.prenhall.com/catalog/academic/product/ - 1,4096,0133262243,00.html), by Samuel Harbison & Guy Steele - (www.sls.lcs.mit.edu/~hurley/guysteele.html) (at Bookpool - (www.bookpool.com/.x//sm/0133262243), at Amazon (www.amazon.com/exec/ - obidos/ASIN/0133262243)) - - C Programming FAQs (cseng.aw.com/book/0,3828,0201845199,00.html), by - Steve Summit (www.eskimo.com/~scs/) (at Bookpool (www.bookpool.com/.x/ - /sm/0201845199), at Amazon (www.amazon.com/exec/obidos/ASIN/ - 0201845199)) - - - C++: The Core Language (www.oreilly.com/catalog/core/), by Gregory - Satir & Doug Brown (at Bookpool (www.bookpool.com/.x//sm/156592116X), - at Amazon (www.amazon.com/exec/obidos/ASIN/156592116X)) - - C++ Programming Language Special Edition (cseng.aw.com/book/ - 0,3828,0201700735,00.html), by Bjarne Stroustrup (www.research.att.com - /~bs/) (at Bookpool (www.bookpool.com/.x//sm/0201700735), at Amazon - (www.amazon.com/exec/obidos/ASIN/0201700735)) - - The C++ Standard Library: A Tutorial and Reference (cseng.aw.com/book/ - 0,3828,0201379260,00.html), by Nicolai Josuttis (www.josuttis.de/ - indexe.html) (at Bookpool (www.bookpool.com/.x//sm/0201379260), at - Amazon (www.amazon.com/exec/obidos/ASIN/0201379260)) - - C++ FAQs (cseng.aw.com/book/0,3828,0201309831,00.html), by Marshall - Cline (www.parashift.com/), Greg Lomow, & Mike Girou (at Bookpool - (www.bookpool.com/.x//sm/0201309831), at Amazon (www.amazon.com/exec/ - obidos/ASIN/0201309831)) - - Effective C++ (cseng.aw.com/book/0,,0201924889,00.html), by Scott - Meyers (www.aristeia.com/) (at Bookpool (www.bookpool.com/.x//sm/ - 0201924889), at Amazon (www.amazon.com/exec/obidos/ASIN/0201924889)) - - Algorithms in C++, Parts 1-4 (cseng.aw.com/book/ - 0,,0201350882,00.html), by Robert Sedgewick (www.cs.princeton.edu/~rs - /) (at Bookpool (www.bookpool.com/.x//sm/0201350882), at Amazon - (www.amazon.com/exec/obidos/ASIN/0201350882)) - - - Advanced Programming in the UNIX Environment (cseng.aw.com/book/ - 0,3828,0201563177,00.html), by W. Richard Stevens (www.kohala.com/) - (at Bookpool (www.bookpool.com/.x//sm/0201563177), at Amazon - (www.amazon.com/exec/obidos/ASIN/0201563177)) - - Win32 System Programming (cseng.aw.com/book/ - 0,3828,0201703106,00.html), by Johnson Hart (world.std.com/~jmhart/) - (at Bookpool (www.bookpool.com/.x//sm/0201703106), at Amazon - (www.amazon.com/exec/obidos/ASIN/0201703106)) - - Managing Projects with Make (www.oreilly.com/catalog/make2/), by - Andrew Oram & Steve Talbott (www.oreilly.com/~stevet/) (at Bookpool - (www.bookpool.com/.x//sm/0937175900), at Amazon (www.amazon.com/exec/ - obidos/ASIN/0937175900)) - - - Thread Time (vig.prenhall.com/catalog/academic/product/ - 1,4096,0131900676,00.html), by Scott Norton & Mark DiPasquale (at - Bookpool (www.bookpool.com/.x//sm/0131900676), at Amazon - (www.amazon.com/exec/obidos/ASIN/0131900676)) - - Programming with POSIX Thrads (cseng.awl.com/book/ - 0,3828,0201633922,00.html), by David Butenhof (at Bookpool - (www.bookpool.com/.x//sm/0201633922), at Amazon (www.amazon.com/exec/ - obidos/ASIN/0201633922)) - --------------------------------------------------------------------------- diff --git a/doc/txt/maillist.txt b/doc/txt/maillist.txt deleted file mode 100644 index 3f8bb5b..0000000 --- a/doc/txt/maillist.txt +++ /dev/null @@ -1,25 +0,0 @@ -Mailing lists -=-=-=-=--=-=-= - -I've created a couple of lists on YahooGroups (formerly egroups (formerly -onelist)): - - - metamod-announce (groups.yahoo.com/group/metamod-announce/) for - announcements of new versions and plugins - - metamod (groups.yahoo.com/group/metamod/) for questions, support, - discussion, etc - -There are simple subscribe forms below. - - Subscribe to metamod-announce - [enter email address ] - groups.yahoo.com/metamod-announce Click here to join metamod-announce - (groups.yahoo.com/group/ - metamod-announce/) - - Subscribe to metamod - [enter email address ] Click here to join metamod - groups.yahoo.com/metamod (groups.yahoo.com/ - group/metamod/) - --------------------------------------------------------------------------- diff --git a/doc/txt/metamod.txt b/doc/txt/metamod.txt deleted file mode 100644 index 712b3f7..0000000 --- a/doc/txt/metamod.txt +++ /dev/null @@ -1,568 +0,0 @@ -Using Metamod -=-=-=-=-=-=-= - -Client Commands -=============== - -Similar to the server console interface, clients can also issue commands -to Metamod, of the following form: - - - meta version - displays version information about the Metamod instance - currently running on the server, ie: - - Metamod v1.21p37 2013/05/30 (5:13) - by Will Day - http://www.metamod.org/ - Patch: Metamod-P (mm-p) v37 - by Jussi Kivilinna - http://koti.mbnet.fi/axh/ - compiled: Feb 18 2013, 11:53:27 EET (optimized) - - - meta list - displays information about the list of currently running - plugins, ie: - - Currently running plugins: - [ 1] Trace HLSDK API, v1.XX.93, 2003/02/17, by Will Day - , see http://www.metamod.org/ - [ 2] Adminmod, v2.50.56 (MM), Jul 13 2003, by Alfred Reynolds - , see http://www.adminmod.org/ - 2 plugins - -Client Cvars -============ - -Also available to client browser applications is a cvar metamod_version -that should report the version of Metamod running on the server, ie: - -"metamod_version" is "1.21p37" - -Installation -============ - -If you want to install Metamod by hand, here's what you have to do: - - - - Install the Metamod library (.dll for win32, or .so for linux) to a - directory under your game directory. For instance, if you were running - Counter-Strike, under win32 you might want have: - - half-life/cstrike/addons/metamod/dlls/metamod.dll - - If a directory you want doesn't exist, create it. - - - Edit the "liblist.gam" file in your game directory, replacing the game - dll filename with the Metamod dll filename. For instance with - Counter-Strike, you would change: - - gamedll "dlls/mp.dll" - gamedll_linux "dlls/cs.so" - - to: - - gamedll "addons/metamod/dlls/metamod.dll" - gamedll_linux "addons/metamod/dlls/metamod.so" - - Note that it's only really necessary to change the line corresponding - to your OS (win32 or linux); you can leave the other line unchanged, - or you can change it - it doesn't matter. - - - To load plugins at game startup, you'll need to create a "plugins.ini" - file containing a list of the plugins you want to load. - - -Configuration -============= - -Metamod has several ways to provide config options, partially because it -started with one method and then added other methods, but also because one -method can be more convenient than the other, varying with the situation. - -Generally speaking, the two methods of providing configuration information -to Metamod are: - - - on the command line, via +localinfo arguments to hlds. - - as the contents of some file that Metamod reads and parses. - -The confusing part can come when the pathnames to some of the config files -can be specified via command line options - or indeed, when the pathnames -to some config files can be specified in other config files. - -In any case, here are the various config options and config files Metamod -uses, (listed in order of priority), where "$gamedir" indicates the game -directory, ie "cstrike": - - - +localinfo mm_configfile - - - +localinfo mm_pluginsfile - - config.ini option: plugins_file - - $gamedir/addons/metamod/plugins.ini - - $gamedir/metamod.ini - - - $localinfo mm_execcfg - - config.ini option: exec_cfg - - $gamedir/addons/metamod/exec.cfg - - $gamedir/metaexec.cfg - - - $localinfo mm_gamedll - - config.ini option: gamedll - - [DEL]$gamedir/metagame.ini[DEL] -- NO LONGER SUPPORTED. - - -File: plugins.ini -===== - -Default location: _$gamedir/addons/metamod/plugins.ini, ie "cstrike/addons -/metamod/plugins.ini". - -Plugins are described in a file "plugins.ini" and each line describes a -plugin to load: - - [] - -Fields are whitespace delimited (tabs/spaces). - - - Platform is a keyword, either "linux" or "win32". - - - Filepath is a path to the DLL/so file. Relative paths are from the - game dir; absolute paths are also valid. Paths should use unix-style - forward slashes (/) and not backward slashes (\), even on windows - platforms. - - Also, the filepath (once expanded to full path name) is expected to be - unique within the list of plugins. Thus, a plugin with a fullpathname - matching that of a previous plugin is considered a duplicate, and is - not loaded. - - - Description is an optional description of the plugin, used in place of - the plugin's internal name in log messages and console output. - Whitespace in the description _is_ allowed; quoting is unnecessary. - -Comments are recognized at _only_ the beginning of a line, and can be in -either shell style ("#") or c++ style ("//"). - -For instance, in "cstrike/addons/metamod/plugins.ini" these are all valid -lines: - - // linux dlls/mybot.so - # win32 dlls/mybot-old.dll Mybot old - win32 dlls/mybot.dll Mybot current - linux /tmp/stub_mm_i386.so - win32 /tmp/stub_mm_i386.dll - linux ../dlls/trace_mm_i386.so - win32 ../dlls/trace_mm_i386.dll - linux dlls/admin_MM_i386.so - win32 dlls/admin_MM_i386.dll - -Note that order in the plugins.ini file _is_ significant. Plugins are -loaded and accessed in the order specified, so ordering can be important, -depending on the plugin(s). - -The file is re-read at changelevel, as well as on demand (via "meta -refresh" console command; see below). When the file is re-read, it will: - - - load any new plugins added to the file - - unload any plugins that have been deleted from the file. This is only - applicable to plugins loaded _from the inifile_. If the plugin was - loaded from the console, it will not be unloaded during a refresh, - whether it's in the inifile or not. - - reload any plugin whose file on disk has been updated since it was - loaded. Note this appears to be only useful under linux, as under - Windows you cannot rename or overwrite an open DLL, so it doesn't look - a loaded plugin could ever have a newer file on disk. Oh well. - -The game dll is auto-detected, along the same lines AdminMod operated -(looking at the "gamedir"); see "mm_gamedll" below if you want to use a -"bot" DLL. - -You can override the name of this file by specifying it via the +localinfo -field "mm_pluginsfile". - -For compatibility with previous versions, Metamod will also look for a -file "metamod.ini" under the gamedir, ie "cstrike/metamod.ini". - - -File: config.ini -===== - -Default location: _$gamedir/addons/metamod/config.ini, ie "cstrike/addons/ -metamod/config.ini". - -This contains basic config information, at the moment duplicating most of -the +localinfo variables, but allowing for more flexible expansion of -config options in the future. Also, it provides somewhat more reliable -options setting, since +localinfo munges some argument values (in -particular, pathnames with leading dots, ie "../dlls/blah.dll"). - -Basic format is: - -